diff --git a/WebsitePanel.Installer/Sources/Setup.SchedulerService/Config.wxi b/WebsitePanel.Installer/Sources/Setup.SchedulerService/Config.wxi new file mode 100644 index 00000000..8265cb6f --- /dev/null +++ b/WebsitePanel.Installer/Sources/Setup.SchedulerService/Config.wxi @@ -0,0 +1,6 @@ + + + + + + diff --git a/WebsitePanel.Installer/Sources/Setup.SchedulerService/License.rtf b/WebsitePanel.Installer/Sources/Setup.SchedulerService/License.rtf new file mode 100644 index 00000000..8f1b4211 Binary files /dev/null and b/WebsitePanel.Installer/Sources/Setup.SchedulerService/License.rtf differ diff --git a/WebsitePanel.Installer/Sources/Setup.SchedulerService/Product.wxs b/WebsitePanel.Installer/Sources/Setup.SchedulerService/Product.wxs new file mode 100644 index 00000000..f66dd59c --- /dev/null +++ b/WebsitePanel.Installer/Sources/Setup.SchedulerService/Product.wxs @@ -0,0 +1,132 @@ + + + + + + + + + + + bannrbmp + + + + + + + + + + + + + + + + + 1 + + + 1 + CORRECTCONNECTION = "0" + CORRECTCONNECTION = "1" + + + 1 + + + + + + + + + + + + + + + + + + AUTHENTICATIONTYPE = "Windows Authentication" + NOT(AUTHENTICATIONTYPE = "Windows Authentication") + + + + + + + + + 1 + + + Connection not valid. + + + + + 1 + + + 1 + + + 1 + + + + + + + + + + + LicenseAccepted = "1" + + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/WebsitePanel.Installer/Sources/Setup.SchedulerService/Setup.SchedulerService.wixproj b/WebsitePanel.Installer/Sources/Setup.SchedulerService/Setup.SchedulerService.wixproj new file mode 100644 index 00000000..12733ad4 --- /dev/null +++ b/WebsitePanel.Installer/Sources/Setup.SchedulerService/Setup.SchedulerService.wixproj @@ -0,0 +1,52 @@ + + + + Debug + x86 + 3.7 + {ead7c528-ea3d-40e8-9688-9f1d8dc8d758} + 2.0 + Setup.SchedulerService + Package + $(MSBuildExtensionsPath32)\Microsoft\WiX\v3.x\Wix.targets + $(MSBuildExtensionsPath)\Microsoft\WiX\v3.x\Wix.targets + + + bin\ + obj\$(Configuration)\ + Debug;BUILD=debug + False + + + + + + + + + bin\$(Configuration)\ + obj\$(Configuration)\ + BUILD=release + + + + + + + + + + ..\..\..\tools\WIX\WixUIExtension.dll + WixUIExtension + + + + + \ No newline at end of file diff --git a/WebsitePanel.Installer/Sources/Setup.SchedulerService/WebSitePanel.ico b/WebsitePanel.Installer/Sources/Setup.SchedulerService/WebSitePanel.ico new file mode 100644 index 00000000..bf9c0b86 Binary files /dev/null and b/WebsitePanel.Installer/Sources/Setup.SchedulerService/WebSitePanel.ico differ diff --git a/WebsitePanel.Installer/Sources/Setup.SchedulerService/bannrbmp.bmp b/WebsitePanel.Installer/Sources/Setup.SchedulerService/bannrbmp.bmp new file mode 100644 index 00000000..9ac7e922 Binary files /dev/null and b/WebsitePanel.Installer/Sources/Setup.SchedulerService/bannrbmp.bmp differ diff --git a/WebsitePanel.Installer/Sources/Setup.SchedulerService/dlgbmp.bmp b/WebsitePanel.Installer/Sources/Setup.SchedulerService/dlgbmp.bmp new file mode 100644 index 00000000..dbf9959b Binary files /dev/null and b/WebsitePanel.Installer/Sources/Setup.SchedulerService/dlgbmp.bmp differ diff --git a/WebsitePanel.Installer/Sources/VersionInfo.cs b/WebsitePanel.Installer/Sources/VersionInfo.cs index 8ca7c4b0..aa59da61 100644 --- a/WebsitePanel.Installer/Sources/VersionInfo.cs +++ b/WebsitePanel.Installer/Sources/VersionInfo.cs @@ -1,7 +1,7 @@ //------------------------------------------------------------------------------ // // This code was generated by a tool. -// Runtime Version:4.0.30319.18010 +// Runtime Version:4.0.30319.18033 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer.sln b/WebsitePanel.Installer/Sources/WebsitePanel.Installer.sln index 8253af7f..6ded8966 100644 --- a/WebsitePanel.Installer/Sources/WebsitePanel.Installer.sln +++ b/WebsitePanel.Installer/Sources/WebsitePanel.Installer.sln @@ -1,5 +1,5 @@ Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2012 +# Visual Studio 2010 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{129305D5-A9E6-4DCE-BFF6-41809E13EEEE}" ProjectSection(SolutionItems) = preProject ..\..\WebsitePanel\build.xml = ..\..\WebsitePanel\build.xml @@ -24,6 +24,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebsitePanel.Installer.Core EndProject Project("{930C7802-8A8C-48F9-8165-68863BCCD9DD}") = "Setup.WIX", "Setup.WIX\Setup.WIX.wixproj", "{F963A4AF-CC72-4512-B636-829345C35318}" EndProject +Project("{930C7802-8A8C-48F9-8165-68863BCCD9DD}") = "Setup.SchedulerService", "Setup.SchedulerService\Setup.SchedulerService.wixproj", "{EAD7C528-EA3D-40E8-9688-9F1D8DC8D758}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebsitePanel.SchedulerServiceInstaller", "WebsitePanel.SchedulerServiceInstaller\WebsitePanel.SchedulerServiceInstaller.csproj", "{24A4C231-73A9-4F03-ABAD-9A8FE5324495}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -96,6 +100,26 @@ Global {F963A4AF-CC72-4512-B636-829345C35318}.Release|Mixed Platforms.Build.0 = Release|x86 {F963A4AF-CC72-4512-B636-829345C35318}.Release|x86.ActiveCfg = Release|x86 {F963A4AF-CC72-4512-B636-829345C35318}.Release|x86.Build.0 = Release|x86 + {EAD7C528-EA3D-40E8-9688-9F1D8DC8D758}.Debug|Any CPU.ActiveCfg = Debug|x86 + {EAD7C528-EA3D-40E8-9688-9F1D8DC8D758}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 + {EAD7C528-EA3D-40E8-9688-9F1D8DC8D758}.Debug|Mixed Platforms.Build.0 = Debug|x86 + {EAD7C528-EA3D-40E8-9688-9F1D8DC8D758}.Debug|x86.ActiveCfg = Debug|x86 + {EAD7C528-EA3D-40E8-9688-9F1D8DC8D758}.Debug|x86.Build.0 = Debug|x86 + {EAD7C528-EA3D-40E8-9688-9F1D8DC8D758}.Release|Any CPU.ActiveCfg = Release|x86 + {EAD7C528-EA3D-40E8-9688-9F1D8DC8D758}.Release|Mixed Platforms.ActiveCfg = Release|x86 + {EAD7C528-EA3D-40E8-9688-9F1D8DC8D758}.Release|Mixed Platforms.Build.0 = Release|x86 + {EAD7C528-EA3D-40E8-9688-9F1D8DC8D758}.Release|x86.ActiveCfg = Release|x86 + {EAD7C528-EA3D-40E8-9688-9F1D8DC8D758}.Release|x86.Build.0 = Release|x86 + {24A4C231-73A9-4F03-ABAD-9A8FE5324495}.Debug|Any CPU.ActiveCfg = Debug|x86 + {24A4C231-73A9-4F03-ABAD-9A8FE5324495}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 + {24A4C231-73A9-4F03-ABAD-9A8FE5324495}.Debug|Mixed Platforms.Build.0 = Debug|x86 + {24A4C231-73A9-4F03-ABAD-9A8FE5324495}.Debug|x86.ActiveCfg = Debug|x86 + {24A4C231-73A9-4F03-ABAD-9A8FE5324495}.Debug|x86.Build.0 = Debug|x86 + {24A4C231-73A9-4F03-ABAD-9A8FE5324495}.Release|Any CPU.ActiveCfg = Release|x86 + {24A4C231-73A9-4F03-ABAD-9A8FE5324495}.Release|Mixed Platforms.ActiveCfg = Release|x86 + {24A4C231-73A9-4F03-ABAD-9A8FE5324495}.Release|Mixed Platforms.Build.0 = Release|x86 + {24A4C231-73A9-4F03-ABAD-9A8FE5324495}.Release|x86.ActiveCfg = Release|x86 + {24A4C231-73A9-4F03-ABAD-9A8FE5324495}.Release|x86.Build.0 = Release|x86 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.SchedulerServiceInstaller/CustomAction.config b/WebsitePanel.Installer/Sources/WebsitePanel.SchedulerServiceInstaller/CustomAction.config new file mode 100644 index 00000000..233c44d7 --- /dev/null +++ b/WebsitePanel.Installer/Sources/WebsitePanel.SchedulerServiceInstaller/CustomAction.config @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.SchedulerServiceInstaller/CustomAction.cs b/WebsitePanel.Installer/Sources/WebsitePanel.SchedulerServiceInstaller/CustomAction.cs new file mode 100644 index 00000000..9dbf7fc3 --- /dev/null +++ b/WebsitePanel.Installer/Sources/WebsitePanel.SchedulerServiceInstaller/CustomAction.cs @@ -0,0 +1,142 @@ +using System; +using System.Configuration.Install; +using System.Data; +using System.Data.SqlClient; +using System.IO; +using System.Linq; +using System.ServiceProcess; +using System.Text.RegularExpressions; +using Microsoft.Deployment.WindowsInstaller; + +namespace WebsitePanel.SchedulerServiceInstaller +{ + public class CustomActions + { + [CustomAction] + public static ActionResult CheckConnection(Session session) + { + string testConnectionString = session["AUTHENTICATIONTYPE"].Equals("Windows Authentication") ? GetConnectionString(session["SERVERNAME"], "master") : GetConnectionString(session["SERVERNAME"], "master", session["LOGIN"], session["PASSWORD"]); + + if (CheckConnection(testConnectionString)) + { + session["CORRECTCONNECTION"] = "1"; + session["CONNECTIONSTRING"] = session["AUTHENTICATIONTYPE"].Equals("Windows Authentication") ? GetConnectionString(session["SERVERNAME"], session["DATABASENAME"]) : GetConnectionString(session["SERVERNAME"], session["DATABASENAME"], session["LOGIN"], session["PASSWORD"]); + } + else + { + session["CORRECTCONNECTION"] = "0"; + } + + return ActionResult.Success; + } + + [CustomAction] + public static ActionResult FinalizeInstall(Session session) + { + ChangeConfigString("installer.connectionstring", session["CONNECTIONSTRING"], session["INSTALLFOLDER"]); + ChangeCryptoKey(session["INSTALLFOLDER"]); + InstallService(session["INSTALLFOLDER"]); + + return ActionResult.Success; + } + + private static void InstallService(string installFolder) + { + try + { + if (!ServiceController.GetServices().Any(s => s.DisplayName.Equals("WebsitePanel Scheduler", StringComparison.CurrentCultureIgnoreCase))) + { + ManagedInstallerClass.InstallHelper(new[] {"/i", Path.Combine(installFolder, "WebsitePanel.SchedulerService.exe")}); + } + + StartService("WebsitePanel Scheduler"); + } + catch (Exception) + { + } + } + + private static void ChangeCryptoKey(string installFolder) + { + string path = Path.Combine(installFolder.Replace("SchedulerService", "Enterprise Server"), "web.config"); + string cryptoKey = "0123456789"; + + if (File.Exists(path)) + { + using (var reader = new StreamReader(path)) + { + string content = reader.ReadToEnd(); + var pattern = new Regex(@"(?<=)"); + Match match = pattern.Match(content); + cryptoKey = match.Value; + } + } + + ChangeConfigString("installer.cryptokey", cryptoKey, installFolder); + } + + private static void ChangeConfigString(string searchString, string replaceValue, string installFolder) + { + string content; + string path = Path.Combine(installFolder, "WebsitePanel.SchedulerService.exe.config"); + + using (var reader = new StreamReader(path)) + { + content = reader.ReadToEnd(); + } + + var re = new Regex("\\$\\{" + searchString + "\\}+", RegexOptions.IgnoreCase); + content = re.Replace(content, replaceValue); + + using (var writer = new StreamWriter(path)) + { + writer.Write(content); + } + } + + private static void StartService(string serviceName) + { + var sc = new ServiceController(serviceName); + + if (sc.Status == ServiceControllerStatus.Stopped) + { + sc.Start(); + sc.WaitForStatus(ServiceControllerStatus.Running); + } + } + + private static string GetConnectionString(string serverName, string databaseName) + { + return string.Format("Server={0};database={1};Trusted_Connection=true;", serverName, databaseName); + } + + private static string GetConnectionString(string serverName, string databaseName, string login, string password) + { + return string.Format("Server={0};database={1};uid={2};password={3};", serverName, databaseName, login, password); + } + + private static bool CheckConnection(string connectionString) + { + var connection = new SqlConnection(connectionString); + bool result = true; + + try + { + connection.Open(); + } + catch (Exception) + { + result = false; + } + finally + { + if (connection != null && connection.State == ConnectionState.Open) + { + connection.Close(); + } + } + + return result; + } + } +} \ No newline at end of file diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.SchedulerServiceInstaller/Properties/AssemblyInfo.cs b/WebsitePanel.Installer/Sources/WebsitePanel.SchedulerServiceInstaller/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..222e3d9d --- /dev/null +++ b/WebsitePanel.Installer/Sources/WebsitePanel.SchedulerServiceInstaller/Properties/AssemblyInfo.cs @@ -0,0 +1,35 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("WebsitePanel.SchedulerServiceInstaller")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("WebsitePanel.SchedulerServiceInstaller")] +[assembly: AssemblyCopyright("Copyright © 2013")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("64885563-cef3-4553-9006-31282c033b3b")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.SchedulerServiceInstaller/WebsitePanel.SchedulerServiceInstaller.csproj b/WebsitePanel.Installer/Sources/WebsitePanel.SchedulerServiceInstaller/WebsitePanel.SchedulerServiceInstaller.csproj new file mode 100644 index 00000000..22f11548 --- /dev/null +++ b/WebsitePanel.Installer/Sources/WebsitePanel.SchedulerServiceInstaller/WebsitePanel.SchedulerServiceInstaller.csproj @@ -0,0 +1,52 @@ + + + + Debug + x86 + 8.0.30703 + 2.0 + {24A4C231-73A9-4F03-ABAD-9A8FE5324495} + Library + Properties + WebsitePanel.SchedulerServiceInstaller + WebsitePanel.SchedulerServiceInstaller + v4.0 + 512 + $(MSBuildExtensionsPath)\Microsoft\WiX\v3.x\Wix.CA.targets + + + true + full + false + ..\Setup.SchedulerService\bin\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + ..\Setup.SchedulerService\bin\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Setup/Actions/EntServerActionManager.cs b/WebsitePanel.Installer/Sources/WebsitePanel.Setup/Actions/EntServerActionManager.cs index 6952cf21..51032a44 100644 --- a/WebsitePanel.Installer/Sources/WebsitePanel.Setup/Actions/EntServerActionManager.cs +++ b/WebsitePanel.Installer/Sources/WebsitePanel.Setup/Actions/EntServerActionManager.cs @@ -28,6 +28,9 @@ using System; using System.Collections.Generic; +using System.Configuration.Install; +using System.Linq; +using System.ServiceProcess; using System.Text; using System.IO; using System.Xml; @@ -97,7 +100,7 @@ namespace WebsitePanel.Setup.Actions throw; } } - } + } public class CreateDatabaseAction : Action, IInstallAction, IUninstallAction { @@ -347,7 +350,7 @@ namespace WebsitePanel.Setup.Actions Log.WriteEnd(String.Format("Updated {0} file", vars.ConfigurationFile)); } } - + public class SaveEntServerConfigSettingsAction : Action, IInstallAction { void IInstallAction.Run(SetupVariables vars) @@ -390,7 +393,7 @@ namespace WebsitePanel.Setup.Actions new UpdateServeradminPasswAction(), new SaveAspNetDbConnectionStringAction(), new SaveComponentConfigSettingsAction(), - new SaveEntServerConfigSettingsAction() + new SaveEntServerConfigSettingsAction() }; public EntServerActionManager(SetupVariables sessionVars) : base(sessionVars) diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Setup/Common/Global.cs b/WebsitePanel.Installer/Sources/WebsitePanel.Setup/Common/Global.cs index 52affc1e..819105d6 100644 --- a/WebsitePanel.Installer/Sources/WebsitePanel.Setup/Common/Global.cs +++ b/WebsitePanel.Installer/Sources/WebsitePanel.Setup/Common/Global.cs @@ -76,7 +76,7 @@ namespace WebsitePanel.Setup public const string DatabaseName = "DatabaseName"; public const string ConnectionString = "ConnectionString"; public const string InstallConnectionString = "InstallConnectionString"; - public const string Release = "Release"; + public const string Release = "Release"; } public abstract class Messages diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Setup/WebsitePanel.Setup.csproj b/WebsitePanel.Installer/Sources/WebsitePanel.Setup/WebsitePanel.Setup.csproj index 6b9d839d..f8a058bc 100644 --- a/WebsitePanel.Installer/Sources/WebsitePanel.Setup/WebsitePanel.Setup.csproj +++ b/WebsitePanel.Installer/Sources/WebsitePanel.Setup/WebsitePanel.Setup.csproj @@ -74,6 +74,7 @@ + diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Setup/Wizard/UninstallPage.cs b/WebsitePanel.Installer/Sources/WebsitePanel.Setup/Wizard/UninstallPage.cs index f9e34dfa..cd65881d 100644 --- a/WebsitePanel.Installer/Sources/WebsitePanel.Setup/Wizard/UninstallPage.cs +++ b/WebsitePanel.Installer/Sources/WebsitePanel.Setup/Wizard/UninstallPage.cs @@ -27,11 +27,14 @@ // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. using System; +using System.Configuration.Install; using System.IO; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; +using System.Linq; +using System.ServiceProcess; using System.Text; using System.Threading; using System.Windows.Forms; @@ -208,17 +211,19 @@ namespace WebsitePanel.Setup Log.WriteError("Windows service stop error", ex); } - int exitCode = Utils.RunProcess(path, "/u"); - if (exitCode == 0) - { - Log.WriteEnd("Removed Windows service"); - InstallLog.AppendLine(string.Format("- Removed \"{0}\" Windows service", serviceName)); - } - else - { - Log.WriteError(string.Format("Unable to remove \"{0}\" Windows service. Error code: {1}", serviceName, exitCode), null); - InstallLog.AppendLine(string.Format("- Failed to remove \"{0}\" Windows service", serviceName)); - } + try + { + ManagedInstallerClass.InstallHelper(new[] {"/u", path}); + } + catch(Exception) + { + Log.WriteError(string.Format("Unable to remove \"{0}\" Windows service.", serviceName), null); + InstallLog.AppendLine(string.Format("- Failed to remove \"{0}\" Windows service", serviceName)); + throw; + } + + Log.WriteEnd("Removed Windows service"); + InstallLog.AppendLine(string.Format("- Removed \"{0}\" Windows service", serviceName)); } catch (Exception ex) { @@ -268,7 +273,7 @@ namespace WebsitePanel.Setup internal List GetUninstallActions(string componentId) { - List list = new List(); + var list = new List(); InstallAction action = null; //windows service @@ -283,8 +288,7 @@ namespace WebsitePanel.Setup action.Description = "Removing Windows service..."; action.Log = string.Format("- Remove {0} Windows service", serviceName); list.Add(action); - } - + } //database bool deleteDatabase = AppConfig.GetComponentSettingBooleanValue(componentId, "NewDatabase"); diff --git a/WebsitePanel/Database/update_db.sql b/WebsitePanel/Database/update_db.sql index 31d358ec..3a236ffc 100644 --- a/WebsitePanel/Database/update_db.sql +++ b/WebsitePanel/Database/update_db.sql @@ -450,10 +450,996 @@ INSERT [dbo].[Providers] ([ProviderID], [GroupID], [ProviderName], [DisplayName] VALUES (1401, 41, N'Lync2013', N'Microsoft Lync Server 2013 Multitenant Hosting Pack', N'WebsitePanel.Providers.HostedSolution.Lync2013, WebsitePanel.Providers.HostedSolution.Lync2013', N'Lync', NULL) END GO - -- add Application Pools Restart Quota INSERT [dbo].[Quotas] ([QuotaID], [GroupID], [QuotaOrder], [QuotaName], [QuotaDescription], [QuotaTypeID], [ServiceQuota], [ItemTypeID], [HideQuota]) VALUES (411, 2, 13, N'Web.AppPoolsRestart', N'Application Pools Restart', 1, 0, NULL, NULL) GO +-------------------------------- Scheduler Service------------------------------------------------------ + +IF EXISTS( SELECT * FROM INFORMATION_SCHEMA.COLUMNS + WHERE TABLE_NAME = 'Schedule' + AND COLUMN_NAME = 'LastFinish') +ALTER TABLE Schedule +DROP COLUMN LastFinish +GO + +ALTER PROCEDURE [dbo].[GetSchedule] +( + @ActorID int, + @ScheduleID int +) +AS + +-- select schedule +SELECT TOP 1 + S.ScheduleID, + S.TaskID, + S.PackageID, + S.ScheduleName, + S.ScheduleTypeID, + S.Interval, + S.FromTime, + S.ToTime, + S.StartTime, + S.LastRun, + S.NextRun, + S.Enabled, + S.HistoriesNumber, + S.PriorityID, + S.MaxExecutionTime, + S.WeekMonthDay, + 1 AS StatusID +FROM Schedule AS S +WHERE + S.ScheduleID = @ScheduleID + AND dbo.CheckActorPackageRights(@ActorID, S.PackageID) = 1 + +-- select task +SELECT + ST.TaskID, + ST.TaskType, + ST.RoleID +FROM Schedule AS S +INNER JOIN ScheduleTasks AS ST ON S.TaskID = ST.TaskID +WHERE + S.ScheduleID = @ScheduleID + AND dbo.CheckActorPackageRights(@ActorID, S.PackageID) = 1 + +-- select schedule parameters +SELECT + S.ScheduleID, + STP.ParameterID, + STP.DataTypeID, + ISNULL(SP.ParameterValue, STP.DefaultValue) AS ParameterValue +FROM Schedule AS S +INNER JOIN ScheduleTaskParameters AS STP ON S.TaskID = STP.TaskID +LEFT OUTER JOIN ScheduleParameters AS SP ON STP.ParameterID = SP.ParameterID AND SP.ScheduleID = S.ScheduleID +WHERE + S.ScheduleID = @ScheduleID + AND dbo.CheckActorPackageRights(@ActorID, S.PackageID) = 1 + +RETURN +GO + +ALTER PROCEDURE [dbo].[GetScheduleInternal] +( + @ScheduleID int +) +AS + +-- select schedule +SELECT + S.ScheduleID, + S.TaskID, + ST.TaskType, + ST.RoleID, + S.PackageID, + S.ScheduleName, + S.ScheduleTypeID, + S.Interval, + S.FromTime, + S.ToTime, + S.StartTime, + S.LastRun, + S.NextRun, + S.Enabled, + 1 AS StatusID, + S.PriorityID, + S.HistoriesNumber, + S.MaxExecutionTime, + S.WeekMonthDay +FROM Schedule AS S +INNER JOIN ScheduleTasks AS ST ON S.TaskID = ST.TaskID +WHERE ScheduleID = @ScheduleID +RETURN +GO + +ALTER PROCEDURE [dbo].[GetSchedules] +( + @ActorID int, + @PackageID int, + @Recursive bit +) +AS + +-- check rights +IF dbo.CheckActorPackageRights(@ActorID, @PackageID) = 0 +RAISERROR('You are not allowed to access this package', 16, 1) + +DECLARE @Schedules TABLE +( + ScheduleID int +) + +INSERT INTO @Schedules (ScheduleID) +SELECT + S.ScheduleID +FROM Schedule AS S +INNER JOIN PackagesTree(@PackageID, @Recursive) AS PT ON S.PackageID = PT.PackageID +ORDER BY S.Enabled DESC, S.NextRun + + +-- select schedules +SELECT + S.ScheduleID, + S.TaskID, + ST.TaskType, + ST.RoleID, + S.PackageID, + S.ScheduleName, + S.ScheduleTypeID, + S.Interval, + S.FromTime, + S.ToTime, + S.StartTime, + S.LastRun, + S.NextRun, + S.Enabled, + 1 AS StatusID, + S.PriorityID, + S.MaxExecutionTime, + S.WeekMonthDay, + ISNULL(0, (SELECT TOP 1 SeverityID FROM AuditLog WHERE ItemID = S.ScheduleID AND SourceName = 'SCHEDULER' ORDER BY StartDate DESC)) AS LastResult, + + U.Username, + U.FirstName, + U.LastName, + U.FullName, + U.RoleID, + U.Email +FROM @Schedules AS STEMP +INNER JOIN Schedule AS S ON STEMP.ScheduleID = S.ScheduleID +INNER JOIN Packages AS P ON S.PackageID = P.PackageID +INNER JOIN ScheduleTasks AS ST ON S.TaskID = ST.TaskID +INNER JOIN UsersDetailed AS U ON P.UserID = U.UserID + +-- select schedule parameters +SELECT + S.ScheduleID, + STP.ParameterID, + STP.DataTypeID, + ISNULL(SP.ParameterValue, STP.DefaultValue) AS ParameterValue +FROM @Schedules AS STEMP +INNER JOIN Schedule AS S ON STEMP.ScheduleID = S.ScheduleID +INNER JOIN ScheduleTaskParameters AS STP ON S.TaskID = STP.TaskID +LEFT OUTER JOIN ScheduleParameters AS SP ON STP.ParameterID = SP.ParameterID AND SP.ScheduleID = S.ScheduleID +RETURN +GO + +ALTER PROCEDURE [dbo].[GetSchedulesPaged] +( + @ActorID int, + @PackageID int, + @Recursive bit, + @FilterColumn nvarchar(50) = '', + @FilterValue nvarchar(50) = '', + @SortColumn nvarchar(50), + @StartRow int, + @MaximumRows int +) +AS +BEGIN + +-- check rights +IF dbo.CheckActorPackageRights(@ActorID, @PackageID) = 0 +RAISERROR('You are not allowed to access this package', 16, 1) + +DECLARE @condition nvarchar(400) +SET @condition = ' 1 = 1 ' + +IF @FilterColumn <> '' AND @FilterColumn IS NOT NULL +AND @FilterValue <> '' AND @FilterValue IS NOT NULL +SET @condition = @condition + ' AND ' + @FilterColumn + ' LIKE ''' + @FilterValue + '''' + +IF @SortColumn IS NULL OR @SortColumn = '' +SET @SortColumn = 'S.ScheduleName ASC' + +DECLARE @sql nvarchar(3500) + +set @sql = ' +SELECT COUNT(S.ScheduleID) FROM Schedule AS S +INNER JOIN PackagesTree(@PackageID, @Recursive) AS PT ON S.PackageID = PT.PackageID +INNER JOIN Packages AS P ON S.PackageID = P.PackageID +INNER JOIN UsersDetailed AS U ON P.UserID = U.UserID +WHERE ' + @condition + ' + +DECLARE @Schedules AS TABLE +( + ScheduleID int +); + +WITH TempSchedules AS ( + SELECT ROW_NUMBER() OVER (ORDER BY ' + @SortColumn + ') as Row, + S.ScheduleID + FROM Schedule AS S + INNER JOIN Packages AS P ON S.PackageID = P.PackageID + INNER JOIN PackagesTree(@PackageID, @Recursive) AS PT ON S.PackageID = PT.PackageID + INNER JOIN UsersDetailed AS U ON P.UserID = U.UserID + WHERE ' + @condition + ' +) + +INSERT INTO @Schedules +SELECT ScheduleID FROM TempSchedules +WHERE TempSchedules.Row BETWEEN @StartRow and @StartRow + @MaximumRows - 1 + +SELECT + S.ScheduleID, + S.TaskID, + ST.TaskType, + ST.RoleID, + S.ScheduleName, + S.ScheduleTypeID, + S.Interval, + S.FromTime, + S.ToTime, + S.StartTime, + S.LastRun, + S.NextRun, + S.Enabled, + 1 AS StatusID, + S.PriorityID, + S.MaxExecutionTime, + S.WeekMonthDay, + ISNULL(0, (SELECT TOP 1 SeverityID FROM AuditLog WHERE ItemID = S.ScheduleID AND SourceName = ''SCHEDULER'' ORDER BY StartDate DESC)) AS LastResult, + + -- packages + P.PackageID, + P.PackageName, + + -- user + P.UserID, + U.Username, + U.FirstName, + U.LastName, + U.FullName, + U.RoleID, + U.Email +FROM @Schedules AS STEMP +INNER JOIN Schedule AS S ON STEMP.ScheduleID = S.ScheduleID +INNER JOIN ScheduleTasks AS ST ON S.TaskID = ST.TaskID +INNER JOIN Packages AS P ON S.PackageID = P.PackageID +INNER JOIN UsersDetailed AS U ON P.UserID = U.UserID' + +exec sp_executesql @sql, N'@PackageID int, @StartRow int, @MaximumRows int, @Recursive bit', +@PackageID, @StartRow, @MaximumRows, @Recursive + +END +RETURN +GO + +ALTER PROCEDURE [dbo].[UpdateSchedule] +( + @ActorID int, + @ScheduleID int, + @TaskID nvarchar(100), + @ScheduleName nvarchar(100), + @ScheduleTypeID nvarchar(50), + @Interval int, + @FromTime datetime, + @ToTime datetime, + @StartTime datetime, + @LastRun datetime, + @NextRun datetime, + @Enabled bit, + @PriorityID nvarchar(50), + @HistoriesNumber int, + @MaxExecutionTime int, + @WeekMonthDay int, + @XmlParameters ntext +) +AS + +-- check rights +DECLARE @PackageID int +SELECT @PackageID = PackageID FROM Schedule +WHERE ScheduleID = @ScheduleID + +IF dbo.CheckActorPackageRights(@ActorID, @PackageID) = 0 +RAISERROR('You are not allowed to access this package', 16, 1) + +BEGIN TRAN + +UPDATE Schedule +SET + TaskID = @TaskID, + ScheduleName = @ScheduleName, + ScheduleTypeID = @ScheduleTypeID, + Interval = @Interval, + FromTime = @FromTime, + ToTime = @ToTime, + StartTime = @StartTime, + LastRun = @LastRun, + NextRun = @NextRun, + Enabled = @Enabled, + PriorityID = @PriorityID, + HistoriesNumber = @HistoriesNumber, + MaxExecutionTime = @MaxExecutionTime, + WeekMonthDay = @WeekMonthDay +WHERE + ScheduleID = @ScheduleID + +DECLARE @idoc int +--Create an internal representation of the XML document. +EXEC sp_xml_preparedocument @idoc OUTPUT, @XmlParameters + +-- Execute a SELECT statement that uses the OPENXML rowset provider. +DELETE FROM ScheduleParameters +WHERE ScheduleID = @ScheduleID + +INSERT INTO ScheduleParameters +( + ScheduleID, + ParameterID, + ParameterValue +) +SELECT + @ScheduleID, + ParameterID, + ParameterValue +FROM OPENXML(@idoc, '/parameters/parameter',1) WITH +( + ParameterID nvarchar(50) '@id', + ParameterValue nvarchar(3000) '@value' +) as PV + +-- remove document +exec sp_xml_removedocument @idoc + +COMMIT TRAN +RETURN +GO + +UPDATE ScheduleTasks SET TaskType = RTRIM(TaskType) + '.Code' +WHERE SUBSTRING(RTRIM(TaskType), LEN(RTRIM(TaskType)) - 3, 4) <> 'Code' +GO + +IF EXISTS (SELECT * FROM SYS.OBJECTS WHERE type = 'P' AND name = 'GetRunningSchedules') +DROP PROCEDURE GetRunningSchedules +GO + +IF EXISTS (SELECT * FROM SYS.TABLES WHERE name = 'BackgroundTaskStack') +DROP TABLE BackgroundTaskStack +GO + +IF EXISTS (SELECT * FROM SYS.TABLES WHERE name = 'BackgroundTaskLogs') +DROP TABLE BackgroundTaskLogs +GO + +IF EXISTS (SELECT * FROM SYS.TABLES WHERE name = 'BackgroundTaskParameters') +DROP TABLE BackgroundTaskParameters +GO + +IF EXISTS (SELECT * FROM SYS.TABLES WHERE name = 'BackgroundTasks') +DROP TABLE BackgroundTasks +GO + +CREATE TABLE BackgroundTasks +( + ID INT IDENTITY(1,1) NOT NULL PRIMARY KEY, + Guid UNIQUEIDENTIFIER NOT NULL, + TaskID NVARCHAR(255), + ScheduleID INT NOT NULL, + PackageID INT NOT NULL, + UserID INT NOT NULL, + EffectiveUserID INT NOT NULL, + TaskName NVARCHAR(255), + ItemID INT, + ItemName NVARCHAR(255), + StartDate DATETIME NOT NULL, + FinishDate DATETIME, + IndicatorCurrent INT NOT NULL, + IndicatorMaximum INT NOT NULL, + MaximumExecutionTime INT NOT NULL, + Source NVARCHAR(MAX), + Severity INT NOT NULL, + Completed BIT, + NotifyOnComplete BIT, + Status INT NOT NULL +) +GO + +CREATE TABLE BackgroundTaskParameters +( + ParameterID INT IDENTITY(1,1) NOT NULL PRIMARY KEY, + TaskID INT NOT NULL, + Name NVARCHAR(255), + SerializerValue NTEXT, + TypeName NVARCHAR(255), + FOREIGN KEY (TaskID) REFERENCES BackgroundTasks (ID) +) +GO + +CREATE TABLE BackgroundTaskLogs +( + LogID INT IDENTITY(1,1) NOT NULL PRIMARY KEY, + TaskID INT NOT NULL, + Date DATETIME, + ExceptionStackTrace NTEXT, + InnerTaskStart INT, + Severity INT, + Text NTEXT, + TextIdent INT, + XmlParameters NTEXT, + FOREIGN KEY (TaskID) REFERENCES BackgroundTasks (ID) +) +GO + +CREATE TABLE BackgroundTaskStack +( + TaskStackID INT IDENTITY(1,1) NOT NULL PRIMARY KEY, + TaskID INT NOT NULL, + FOREIGN KEY (TaskID) REFERENCES BackgroundTasks (ID) +) +GO + +IF EXISTS (SELECT * FROM SYS.OBJECTS WHERE type = 'P' AND name = 'AddBackgroundTask') +DROP PROCEDURE AddBackgroundTask +GO + +CREATE PROCEDURE [dbo].[AddBackgroundTask] +( + @BackgroundTaskID INT OUTPUT, + @Guid UNIQUEIDENTIFIER, + @TaskID NVARCHAR(255), + @ScheduleID INT, + @PackageID INT, + @UserID INT, + @EffectiveUserID INT, + @TaskName NVARCHAR(255), + @ItemID INT, + @ItemName NVARCHAR(255), + @StartDate DATETIME, + @IndicatorCurrent INT, + @IndicatorMaximum INT, + @MaximumExecutionTime INT, + @Source NVARCHAR(MAX), + @Severity INT, + @Completed BIT, + @NotifyOnComplete BIT, + @Status INT +) +AS + +INSERT INTO BackgroundTasks +( + Guid, + TaskID, + ScheduleID, + PackageID, + UserID, + EffectiveUserID, + TaskName, + ItemID, + ItemName, + StartDate, + IndicatorCurrent, + IndicatorMaximum, + MaximumExecutionTime, + Source, + Severity, + Completed, + NotifyOnComplete, + Status +) +VALUES +( + @Guid, + @TaskID, + @ScheduleID, + @PackageID, + @UserID, + @EffectiveUserID, + @TaskName, + @ItemID, + @ItemName, + @StartDate, + @IndicatorCurrent, + @IndicatorMaximum, + @MaximumExecutionTime, + @Source, + @Severity, + @Completed, + @NotifyOnComplete, + @Status +) + +SET @BackgroundTaskID = SCOPE_IDENTITY() + +RETURN +GO + +IF EXISTS (SELECT * FROM SYS.OBJECTS WHERE type = 'P' AND name = 'GetBackgroundTask') +DROP PROCEDURE GetBackgroundTask +GO + +CREATE PROCEDURE [dbo].[GetBackgroundTask] +( + @TaskID NVARCHAR(255) +) +AS + +SELECT TOP 1 + T.ID, + T.Guid, + T.TaskID, + T.ScheduleID, + T.PackageID, + T.UserID, + T.EffectiveUserID, + T.TaskName, + T.ItemID, + T.ItemName, + T.StartDate, + T.FinishDate, + T.IndicatorCurrent, + T.IndicatorMaximum, + T.MaximumExecutionTime, + T.Source, + T.Severity, + T.Completed, + T.NotifyOnComplete, + T.Status +FROM BackgroundTasks AS T +INNER JOIN BackgroundTaskStack AS TS + ON TS.TaskId = T.ID +WHERE T.TaskID = @TaskID +GO + +IF EXISTS (SELECT * FROM SYS.OBJECTS WHERE type = 'P' AND name = 'GetBackgroundTasks') +DROP PROCEDURE GetBackgroundTasks +GO + +CREATE PROCEDURE [dbo].[GetBackgroundTasks] +( + @ActorID INT +) +AS + + with GetChildUsersId(id) as ( + select UserID + from Users + where UserID = @ActorID + union all + select C.UserId + from GetChildUsersId P + inner join Users C on P.id = C.OwnerID +) + +SELECT + T.ID, + T.Guid, + T.TaskID, + T.ScheduleId, + T.PackageId, + T.UserId, + T.EffectiveUserId, + T.TaskName, + T.ItemId, + T.ItemName, + T.StartDate, + T.FinishDate, + T.IndicatorCurrent, + T.IndicatorMaximum, + T.MaximumExecutionTime, + T.Source, + T.Severity, + T.Completed, + T.NotifyOnComplete, + T.Status +FROM BackgroundTasks AS T +INNER JOIN (SELECT T.Guid, MIN(T.StartDate) AS Date + FROM BackgroundTasks AS T + INNER JOIN BackgroundTaskStack AS TS + ON TS.TaskId = T.ID + WHERE T.UserID in (select id from GetChildUsersId) + GROUP BY T.Guid) AS TT ON TT.Guid = T.Guid AND TT.Date = T.StartDate +GO + +IF EXISTS (SELECT * FROM SYS.OBJECTS WHERE type = 'P' AND name = 'GetThreadBackgroundTasks') +DROP PROCEDURE GetThreadBackgroundTasks +GO + +CREATE PROCEDURE [dbo].GetThreadBackgroundTasks +( + @Guid UNIQUEIDENTIFIER +) +AS + +SELECT + T.ID, + T.Guid, + T.TaskID, + T.ScheduleId, + T.PackageId, + T.UserId, + T.EffectiveUserId, + T.TaskName, + T.ItemId, + T.ItemName, + T.StartDate, + T.FinishDate, + T.IndicatorCurrent, + T.IndicatorMaximum, + T.MaximumExecutionTime, + T.Source, + T.Severity, + T.Completed, + T.NotifyOnComplete, + T.Status +FROM BackgroundTasks AS T +INNER JOIN BackgroundTaskStack AS TS + ON TS.TaskId = T.ID +WHERE T.Guid = @Guid +GO + +IF EXISTS (SELECT * FROM SYS.OBJECTS WHERE type = 'P' AND name = 'GetBackgroundTopTask') +DROP PROCEDURE GetBackgroundTopTask +GO + +CREATE PROCEDURE [dbo].[GetBackgroundTopTask] +( + @Guid UNIQUEIDENTIFIER +) +AS + +SELECT TOP 1 + T.ID, + T.Guid, + T.TaskID, + T.ScheduleId, + T.PackageId, + T.UserId, + T.EffectiveUserId, + T.TaskName, + T.ItemId, + T.ItemName, + T.StartDate, + T.FinishDate, + T.IndicatorCurrent, + T.IndicatorMaximum, + T.MaximumExecutionTime, + T.Source, + T.Severity, + T.Completed, + T.NotifyOnComplete, + T.Status +FROM BackgroundTasks AS T +INNER JOIN BackgroundTaskStack AS TS + ON TS.TaskId = T.ID +WHERE T.Guid = @Guid +ORDER BY T.StartDate ASC +GO + +IF EXISTS (SELECT * FROM SYS.OBJECTS WHERE type = 'P' AND name = 'AddBackgroundTaskLog') +DROP PROCEDURE AddBackgroundTaskLog +GO + +CREATE PROCEDURE [dbo].[AddBackgroundTaskLog] +( + @TaskID INT, + @Date DATETIME, + @ExceptionStackTrace NTEXT, + @InnerTaskStart INT, + @Severity INT, + @Text NTEXT, + @TextIdent INT, + @XmlParameters NTEXT +) +AS + +INSERT INTO BackgroundTaskLogs +( + TaskID, + Date, + ExceptionStackTrace, + InnerTaskStart, + Severity, + Text, + TextIdent, + XmlParameters +) +VALUES +( + @TaskID, + @Date, + @ExceptionStackTrace, + @InnerTaskStart, + @Severity, + @Text, + @TextIdent, + @XmlParameters +) +GO + +IF EXISTS (SELECT * FROM SYS.OBJECTS WHERE type = 'P' AND name = 'GetBackgroundTaskLogs') +DROP PROCEDURE GetBackgroundTaskLogs +GO + +CREATE PROCEDURE [dbo].[GetBackgroundTaskLogs] +( + @TaskID INT, + @StartLogTime DATETIME +) +AS + +SELECT + L.LogID, + L.TaskID, + L.Date, + L.ExceptionStackTrace, + L.InnerTaskStart, + L.Severity, + L.Text, + L.XmlParameters +FROM BackgroundTaskLogs AS L +WHERE L.TaskID = @TaskID AND L.Date >= @StartLogTime +ORDER BY L.Date +GO + +IF EXISTS (SELECT * FROM SYS.OBJECTS WHERE type = 'P' AND name = 'UpdateBackgroundTask') +DROP PROCEDURE UpdateBackgroundTask +GO + +CREATE PROCEDURE [dbo].[UpdateBackgroundTask] +( + @Guid UNIQUEIDENTIFIER, + @TaskID INT, + @ScheduleID INT, + @PackageID INT, + @TaskName NVARCHAR(255), + @ItemID INT, + @ItemName NVARCHAR(255), + @FinishDate DATETIME, + @IndicatorCurrent INT, + @IndicatorMaximum INT, + @MaximumExecutionTime INT, + @Source NVARCHAR(MAX), + @Severity INT, + @Completed BIT, + @NotifyOnComplete BIT, + @Status INT +) +AS + +UPDATE BackgroundTasks +SET + Guid = @Guid, + ScheduleID = @ScheduleID, + PackageID = @PackageID, + TaskName = @TaskName, + ItemID = @ItemID, + ItemName = @ItemName, + FinishDate = @FinishDate, + IndicatorCurrent = @IndicatorCurrent, + IndicatorMaximum = @IndicatorMaximum, + MaximumExecutionTime = @MaximumExecutionTime, + Source = @Source, + Severity = @Severity, + Completed = @Completed, + NotifyOnComplete = @NotifyOnComplete, + Status = @Status +WHERE ID = @TaskID +GO + +IF EXISTS (SELECT * FROM SYS.OBJECTS WHERE type = 'P' AND name = 'GetBackgroundTaskParams') +DROP PROCEDURE GetBackgroundTaskParams +GO + +CREATE PROCEDURE [dbo].[GetBackgroundTaskParams] +( + @TaskID INT +) +AS + +SELECT + P.ParameterID, + P.TaskID, + P.Name, + P.SerializerValue, + P.TypeName +FROM BackgroundTaskParameters AS P +WHERE P.TaskID = @TaskID +GO + +IF EXISTS (SELECT * FROM SYS.OBJECTS WHERE type = 'P' AND name = 'AddBackgroundTaskParam') +DROP PROCEDURE AddBackgroundTaskParam +GO + +CREATE PROCEDURE [dbo].[AddBackgroundTaskParam] +( + @TaskID INT, + @Name NVARCHAR(255), + @Value NTEXT, + @TypeName NVARCHAR(255) +) +AS + +INSERT INTO BackgroundTaskParameters +( + TaskID, + Name, + SerializerValue, + TypeName +) +VALUES +( + @TaskID, + @Name, + @Value, + @TypeName +) +GO + +IF EXISTS (SELECT * FROM SYS.OBJECTS WHERE type = 'P' AND name = 'DeleteBackgroundTaskParams') +DROP PROCEDURE DeleteBackgroundTaskParams +GO + +CREATE PROCEDURE [dbo].[DeleteBackgroundTaskParams] +( + @TaskID INT +) +AS + +DELETE FROM BackgroundTaskParameters +WHERE TaskID = @TaskID +GO + +IF EXISTS (SELECT * FROM SYS.OBJECTS WHERE type = 'P' AND name = 'AddBackgroundTaskStack') +DROP PROCEDURE AddBackgroundTaskStack +GO + +CREATE PROCEDURE [dbo].[AddBackgroundTaskStack] +( + @TaskID INT +) +AS + +INSERT INTO BackgroundTaskStack +( + TaskID +) +VALUES +( + @TaskID +) +GO + +IF EXISTS (SELECT * FROM SYS.OBJECTS WHERE type = 'P' AND name = 'DeleteBackgroundTasks') +DROP PROCEDURE DeleteBackgroundTasks +GO + +CREATE PROCEDURE [dbo].[DeleteBackgroundTasks] +( + @Guid UNIQUEIDENTIFIER +) +AS + +DELETE FROM BackgroundTaskStack +WHERE TaskID IN (SELECT ID FROM BackgroundTasks WHERE Guid = @Guid) + +DELETE FROM BackgroundTaskLogs +WHERE TaskID IN (SELECT ID FROM BackgroundTasks WHERE Guid = @Guid) + +DELETE FROM BackgroundTaskParameters +WHERE TaskID IN (SELECT ID FROM BackgroundTasks WHERE Guid = @Guid) + +DELETE FROM BackgroundTasks +WHERE ID IN (SELECT ID FROM BackgroundTasks WHERE Guid = @Guid) +GO + +IF EXISTS (SELECT * FROM SYS.OBJECTS WHERE type = 'P' AND name = 'DeleteBackgroundTask') +DROP PROCEDURE DeleteBackgroundTask +GO + +CREATE PROCEDURE [dbo].[DeleteBackgroundTask] +( + @ID INT +) +AS + +DELETE FROM BackgroundTaskStack +WHERE TaskID = @ID + +DELETE FROM BackgroundTaskLogs +WHERE TaskID = @ID + +DELETE FROM BackgroundTaskParameters +WHERE TaskID = @ID + +DELETE FROM BackgroundTasks +WHERE ID = @ID +GO + +IF EXISTS (SELECT * FROM SYS.OBJECTS WHERE type = 'P' AND name = 'GetProcessBackgroundTasks') +DROP PROCEDURE GetProcessBackgroundTasks +GO + +CREATE PROCEDURE [dbo].[GetProcessBackgroundTasks] +( + @Status INT +) +AS + +SELECT + T.ID, + T.TaskID, + T.ScheduleId, + T.PackageId, + T.UserId, + T.EffectiveUserId, + T.TaskName, + T.ItemId, + T.ItemName, + T.StartDate, + T.FinishDate, + T.IndicatorCurrent, + T.IndicatorMaximum, + T.MaximumExecutionTime, + T.Source, + T.Severity, + T.Completed, + T.NotifyOnComplete, + T.Status +FROM BackgroundTasks AS T +WHERE T.Completed = 0 AND T.Status = @Status +GO + +IF EXISTS (SELECT * FROM SYS.OBJECTS WHERE type = 'P' AND name = 'GetScheduleBackgroundTasks') +DROP PROCEDURE GetScheduleBackgroundTasks +GO + +CREATE PROCEDURE [dbo].[GetScheduleBackgroundTasks] +( + @ScheduleID INT +) +AS + +SELECT + T.ID, + T.Guid, + T.TaskID, + T.ScheduleId, + T.PackageId, + T.UserId, + T.EffectiveUserId, + T.TaskName, + T.ItemId, + T.ItemName, + T.StartDate, + T.FinishDate, + T.IndicatorCurrent, + T.IndicatorMaximum, + T.MaximumExecutionTime, + T.Source, + T.Severity, + T.Completed, + T.NotifyOnComplete, + T.Status +FROM BackgroundTasks AS T +WHERE T.Guid = ( + SELECT Guid FROM BackgroundTasks + WHERE ScheduleID = @ScheduleID + AND Completed = 0 AND Status IN (1, 3)) +GO -- Disclaimers diff --git a/WebsitePanel/Sources/Tools/WebsitePanel.Import.Enterprise/WebsitePanel.Import.Enterprise.csproj b/WebsitePanel/Sources/Tools/WebsitePanel.Import.Enterprise/WebsitePanel.Import.Enterprise.csproj index 46b74405..32738387 100644 --- a/WebsitePanel/Sources/Tools/WebsitePanel.Import.Enterprise/WebsitePanel.Import.Enterprise.csproj +++ b/WebsitePanel/Sources/Tools/WebsitePanel.Import.Enterprise/WebsitePanel.Import.Enterprise.csproj @@ -74,6 +74,9 @@ ..\..\..\Bin\WebsitePanel.EnterpriseServer.Client.dll + + ..\..\..\Bin\WebsitePanel.EnterpriseServer.Code.dll + ..\..\..\Bin\WebsitePanel.Providers.Base.dll diff --git a/WebsitePanel/Sources/VersionInfo.cs b/WebsitePanel/Sources/VersionInfo.cs index 8ca7c4b0..aa59da61 100644 --- a/WebsitePanel/Sources/VersionInfo.cs +++ b/WebsitePanel/Sources/VersionInfo.cs @@ -1,7 +1,7 @@ //------------------------------------------------------------------------------ // // This code was generated by a tool. -// Runtime Version:4.0.30319.18010 +// Runtime Version:4.0.30319.18033 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. diff --git a/WebsitePanel/Sources/VersionInfo.vb b/WebsitePanel/Sources/VersionInfo.vb index 556fbffa..ca84ccc9 100644 --- a/WebsitePanel/Sources/VersionInfo.vb +++ b/WebsitePanel/Sources/VersionInfo.vb @@ -1,7 +1,7 @@ '------------------------------------------------------------------------------ ' ' This code was generated by a tool. -' Runtime Version:4.0.30319.18010 +' Runtime Version:4.0.30319.18033 ' ' Changes to this file may cause incorrect behavior and will be lost if ' the code is regenerated. @@ -15,9 +15,9 @@ Imports System Imports System.Reflection Imports System.Runtime.CompilerServices Imports System.Runtime.InteropServices - diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/Tasks/BackgroundTask.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/Tasks/BackgroundTask.cs index 8ea92110..bfe596f1 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/Tasks/BackgroundTask.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/Tasks/BackgroundTask.cs @@ -36,162 +36,171 @@ using System.Xml.Serialization; namespace WebsitePanel.EnterpriseServer { + public class BackgroundTask { - private string taskId; - private int userId; - private int packageId; - private int effectiveUserId; - private DateTime startDate = DateTime.MinValue; - private DateTime finishDate = DateTime.MinValue; - private int maximumExecutionTime = -1; // seconds - private string source; - private string taskName; - private int scheduleId; - private string itemName; - private int itemId = 0; - private int severity = 0; /* 0 - Info, 1 - Warning, 2 - Error */ - private List logRecords = new List(); - private List lastLogRecords = new List(); - private BackgroundTaskLogRecord lastLogRecord; - private Hashtable parameters = new Hashtable(); - private int indicatorMaximum; - private int indicatorCurrent; - private bool completed; - private bool notifyOnComplete; - private Thread taskThread; + #region Fields - public System.DateTime StartDate + public List Params = new List(); + + public List Logs = new List(); + + #endregion + + #region Properties + + public int Id { get; set; } + + public Guid Guid { get; set; } + + public string TaskId { get; set; } + + public int ScheduleId { get; set; } + + public int PackageId { get; set; } + + public int UserId { get; set; } + + public int EffectiveUserId { get; set; } + + public string TaskName { get; set; } + + public int ItemId { get; set; } + + public string ItemName { get; set; } + + public DateTime StartDate { get; set; } + + public DateTime FinishDate { get; set; } + + public int IndicatorCurrent { get; set; } + + public int IndicatorMaximum { get; set; } + + public int MaximumExecutionTime { get; set; } + + public string Source { get; set; } + + public int Severity { get; set; } + + public bool Completed { get; set; } + + public bool NotifyOnComplete { get; set; } + + public BackgroundTaskStatus Status { get; set; } + + #endregion + + #region Constructors + + public BackgroundTask() { - get { return this.startDate; } - set { this.startDate = value; } + StartDate = DateTime.Now; + Severity = 0; + IndicatorCurrent = 0; + IndicatorMaximum = 0; + Status = BackgroundTaskStatus.Run; + + Completed = false; + NotifyOnComplete = false; } - public System.DateTime FinishDate + public BackgroundTask(Guid guid, String taskId, int userId, int effectiveUserId, String source, String taskName, String itemName, + int itemId, int scheduleId, int packageId, int maximumExecutionTime, List parameters) + : this() { - get { return this.finishDate; } - set { this.finishDate = value; } + Guid = guid; + TaskId = taskId; + UserId = userId; + EffectiveUserId = effectiveUserId; + Source = source; + TaskName = taskName; + ItemName = itemName; + ItemId = itemId; + ScheduleId = scheduleId; + PackageId = packageId; + MaximumExecutionTime = maximumExecutionTime; + Params = parameters; } - public string Source + #endregion + + #region Methods + + public List GetLogs() { - get { return this.source; } - set { this.source = value; } + return Logs; } - public string TaskName + public Object GetParamValue(String name) { - get { return this.taskName; } - set { this.taskName = value; } + foreach(BackgroundTaskParameter param in Params) + { + if (param.Name == name) + return param.Value; + } + + return null; } - public int ItemId + public void UpdateParamValue(String name, object value) { - get { return this.itemId; } - set { this.itemId = value; } + foreach (BackgroundTaskParameter param in Params) + { + if (param.Name == name) + { + param.Value = value; + + return; + + } + } + + Params.Add(new BackgroundTaskParameter(name, value)); } - public int PackageId + public bool ContainsParam(String name) { - get { return this.packageId; } - set { this.packageId = value; } + foreach (BackgroundTaskParameter param in Params) + { + if (param.Name == name) + return true; + } + + return false; } - public int Severity + #endregion + } + + public class BackgroundTaskParameter + { + #region Properties + + public int ParameterId { get; set; } + + public int TaskId { get; set; } + + public String Name { get; set; } + + public Object Value { get; set; } + + public String TypeName { get; set; } + + public String SerializerValue { get; set; } + + #endregion + + #region Constructors + + public BackgroundTaskParameter() { } + + public BackgroundTaskParameter(String name, Object value) { - get { return this.severity; } - set { this.severity = value; } + Name = name; + Value = value; } - [XmlIgnore] - public List LogRecords - { - get { return this.logRecords; } - set { this.logRecords = value; } - } - - public List LastLogRecords - { - get { return this.lastLogRecords; } - } - - public string ItemName - { - get { return this.itemName; } - set { this.itemName = value; } - } - - public BackgroundTaskLogRecord LastLogRecord - { - get { return this.lastLogRecord; } - set { this.lastLogRecord = value; } - } - - public string TaskId - { - get { return this.taskId; } - set { this.taskId = value; } - } - - public int UserId - { - get { return this.userId; } - set { this.userId = value; } - } - - [XmlIgnore] - public Hashtable Parameters - { - get { return this.parameters; } - } - - public int IndicatorMaximum - { - get { return this.indicatorMaximum; } - set { this.indicatorMaximum = value; } - } - - public int IndicatorCurrent - { - get { return this.indicatorCurrent; } - set { this.indicatorCurrent = value; } - } - - public bool Completed - { - get { return this.completed; } - set { this.completed = value; } - } - - public bool NotifyOnComplete - { - get { return this.notifyOnComplete; } - set { this.notifyOnComplete = value; } - } - - public int EffectiveUserId - { - get { return this.effectiveUserId; } - set { this.effectiveUserId = value; } - } - - [XmlIgnore] - public System.Threading.Thread TaskThread - { - get { return this.taskThread; } - set { this.taskThread = value; } - } - - public int ScheduleId - { - get { return this.scheduleId; } - set { this.scheduleId = value; } - } - - public int MaximumExecutionTime - { - get { return this.maximumExecutionTime; } - set { this.maximumExecutionTime = value; } - } + #endregion } } diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/Tasks/BackgroundTaskLogRecord.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/Tasks/BackgroundTaskLogRecord.cs index d6ef3ab4..afccc7d8 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/Tasks/BackgroundTaskLogRecord.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/Tasks/BackgroundTaskLogRecord.cs @@ -34,54 +34,54 @@ namespace WebsitePanel.EnterpriseServer { public class BackgroundTaskLogRecord { - private DateTime date = DateTime.Now; - private string text; - private int severity; /* 0 - Info, 1 - Warning, 2 - Error */ - private string[] textParameters; - private int textIdent = 0; - private bool innerTaskStart; - private string exceptionStackTrace; + #region Properties - public System.DateTime Date + public int LogId { get; set; } + + public int TaskId { get; set; } + + public DateTime Date { get; set; } + + public String ExceptionStackTrace { get; set; } + + public bool InnerTaskStart { get; set; } + + public int Severity { get; set; } + + public String Text { get; set; } + + public int TextIdent { get; set; } + + public string[] TextParameters { get; set; } + + public string XmlParameters { get; set; } + + #endregion + + #region Constructors + + public BackgroundTaskLogRecord() { - get { return this.date; } - set { this.date = value; } + Date = DateTime.Now; } - public string Text + public BackgroundTaskLogRecord(int taskId, int textIdent, bool innerTaskStart, String text, string[] textParameters) + : this() { - get { return this.text; } - set { this.text = value; } + TaskId = taskId; + TextIdent = textIdent; + Text = text; + InnerTaskStart = innerTaskStart; + TextParameters = textParameters; } - public int Severity + public BackgroundTaskLogRecord(int taskId, int textIdent, bool innerTaskStart, String text, + String exceptionStackTrace, string[] textParameters) + : this(taskId, textIdent, innerTaskStart, text, textParameters) { - get { return this.severity; } - set { this.severity = value; } + ExceptionStackTrace = exceptionStackTrace; } - public string[] TextParameters - { - get { return this.textParameters; } - set { this.textParameters = value; } - } - - public int TextIdent - { - get { return this.textIdent; } - set { this.textIdent = value; } - } - - public bool InnerTaskStart - { - get { return this.innerTaskStart; } - set { this.innerTaskStart = value; } - } - - public string ExceptionStackTrace - { - get { return this.exceptionStackTrace; } - set { this.exceptionStackTrace = value; } - } + #endregion } } diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/Tasks/BackgroundTaskStatus.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/Tasks/BackgroundTaskStatus.cs new file mode 100644 index 00000000..74747641 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/Tasks/BackgroundTaskStatus.cs @@ -0,0 +1,10 @@ +namespace WebsitePanel.EnterpriseServer +{ + public enum BackgroundTaskStatus + { + Run = 1, + Abort = 2, + Starting = 3, + Stopping = 4 + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/WebsitePanel.EnterpriseServer.Base.csproj b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/WebsitePanel.EnterpriseServer.Base.csproj index 2168e6e3..dde357fa 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/WebsitePanel.EnterpriseServer.Base.csproj +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/WebsitePanel.EnterpriseServer.Base.csproj @@ -156,6 +156,7 @@ + diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Comments/CommentsController.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Comments/CommentsController.cs similarity index 100% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Comments/CommentsController.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Comments/CommentsController.cs diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Common/ConfigSettings.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Common/ConfigSettings.cs similarity index 100% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Common/ConfigSettings.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Common/ConfigSettings.cs diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Common/CryptoUtils.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Common/CryptoUtils.cs similarity index 100% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Common/CryptoUtils.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Common/CryptoUtils.cs diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Common/EnterpriseServerIdentity.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Common/EnterpriseServerIdentity.cs similarity index 100% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Common/EnterpriseServerIdentity.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Common/EnterpriseServerIdentity.cs diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Common/EnterpriseServerPrincipal.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Common/EnterpriseServerPrincipal.cs similarity index 100% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Common/EnterpriseServerPrincipal.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Common/EnterpriseServerPrincipal.cs diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Common/FileUtils.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Common/FileUtils.cs similarity index 100% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Common/FileUtils.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Common/FileUtils.cs diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Common/IPAddress.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Common/IPAddress.cs similarity index 100% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Common/IPAddress.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Common/IPAddress.cs diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Common/Int128.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Common/Int128.cs similarity index 100% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Common/Int128.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Common/Int128.cs diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Common/MailHelper.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Common/MailHelper.cs similarity index 100% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Common/MailHelper.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Common/MailHelper.cs diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Common/ObjectUtils.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Common/ObjectUtils.cs new file mode 100644 index 00000000..4359ca98 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Common/ObjectUtils.cs @@ -0,0 +1,668 @@ +// Copyright (c) 2012, Outercurve Foundation. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +using System; +using System.Reflection; +using System.Data; +using System.Collections; +using System.Collections.Generic; + +using WebsitePanel.Providers; + +namespace WebsitePanel.EnterpriseServer +{ + /// + /// Summary description for ObjectUtils. + /// + public class ObjectUtils + { + public static DT ConvertObject(ST so) + { + Dictionary sProps = GetTypePropertiesHash(typeof(ST)); + Dictionary dProps = GetTypePropertiesHash(typeof(DT)); + + DT dobj = (DT)Activator.CreateInstance(typeof(DT)); + + // copy properties + foreach (string propName in sProps.Keys) + { + if (dProps.ContainsKey(propName) && sProps[propName].Name != "Item") + { + if (sProps[propName].CanRead) + { + object val = sProps[propName].GetValue(so, null); + if (dProps[propName] != null) + { + if (val != null && dProps[propName].CanWrite) + { + dProps[propName].SetValue(dobj, val, null); + } + } + } + } + } + return dobj; + } + + private static Hashtable typeProperties = new Hashtable(); + + public static Hashtable GetObjectProperties(object obj, bool persistentOnly) + { + Hashtable hash = new Hashtable(); + + Type type = obj.GetType(); + PropertyInfo[] props = type.GetProperties(BindingFlags.Instance + | BindingFlags.Public); + foreach (PropertyInfo prop in props) + { + // check for persistent attribute + object[] attrs = prop.GetCustomAttributes(typeof(PersistentAttribute), false); + if (!persistentOnly || (persistentOnly && attrs.Length > 0) && !hash.ContainsKey(prop.Name)) + { + object val = prop.GetValue(obj, null); + string s = ""; + if (val != null) + { + if (prop.PropertyType == typeof(string[])) + s = String.Join(";", (string[])val); + else if (prop.PropertyType == typeof(int[])) + { + int[] ivals = (int[])val; + string[] svals = new string[ivals.Length]; + for (int i = 0; i < svals.Length; i++) + svals[i] = ivals[i].ToString(); + s = String.Join(";", svals); + } + else + s = val.ToString(); + } + + // add property to hash + hash.Add(prop.Name, s); + } + } + + return hash; + } + + public static void FillCollectionFromDataSet(List list, DataSet ds) + { + if (ds.Tables.Count == 0) + return; + + FillCollectionFromDataView(list, ds.Tables[0].DefaultView); + } + + public static void FillCollectionFromDataView(List list, DataView dv) + { + Type type = typeof(T); + + PropertyInfo[] props = GetTypeProperties(type); + + foreach (DataRowView dr in dv) + { + // create an instance + T obj = (T)Activator.CreateInstance(type); + list.Add(obj); + + // fill properties + for (int i = 0; i < props.Length; i++) + { + string propName = props[i].Name; + if (dv.Table.Columns[propName] == null) + continue; + + object propVal = dr[propName]; + if (propVal == DBNull.Value) + props[i].SetValue(obj, GetNull(props[i].PropertyType), null); + else + { + try + { + // try implicit type conversion + props[i].SetValue(obj, propVal, null); + } + catch + { + // convert to string and then set property value + try + { + string strVal = propVal.ToString(); + props[i].SetValue(obj, Cast(strVal, props[i].PropertyType), null); + } + catch + { + // skip property init + } + } + } + } // for properties + } // for rows + } + + public static List CreateListFromDataReader(IDataReader reader) + { + List list = new List(); + FillCollectionFromDataReader(list, reader); + return list; + } + + public static List CreateListFromDataSet(DataSet ds) + { + List list = new List(); + FillCollectionFromDataSet(list, ds); + return list; + } + + public static void FillCollectionFromDataReader(List list, IDataReader reader) + { + Type type = typeof(T); + + try + { + // get type properties + PropertyInfo[] props = GetTypeProperties(type); + + // iterate through reader + while (reader.Read()) + { + T obj = (T)Activator.CreateInstance(type); + list.Add(obj); + + // set properties + for (int i = 0; i < props.Length; i++) + { + string propName = props[i].Name; + + try + { + + object propVal = reader[propName]; + if (propVal == DBNull.Value) + props[i].SetValue(obj, GetNull(props[i].PropertyType), null); + else + { + try + { + // try implicit type conversion + props[i].SetValue(obj, propVal, null); + } + catch + { + // convert to string and then set property value + try + { + string strVal = propVal.ToString(); + props[i].SetValue(obj, Cast(strVal, props[i].PropertyType), null); + } + catch { } + } + } + } + catch { } // just skip + } // for properties + } + } + finally + { + reader.Close(); + } + } + + public static T FillObjectFromDataView(DataView dv) + { + Type type = typeof(T); + T obj = default(T); + + // get type properties + PropertyInfo[] props = GetTypeProperties(type); + + // iterate through reader + foreach (DataRowView dr in dv) + { + obj = (T)Activator.CreateInstance(type); + + // set properties + for (int i = 0; i < props.Length; i++) + { + string propName = props[i].Name; + + try + { + // verify if there is such a column + if (!dr.Row.Table.Columns.Contains(propName.ToLower())) + { + // if not, we move to another property + // because this one we cannot set + continue; + } + + object propVal = dr[propName]; + if (propVal == DBNull.Value) + props[i].SetValue(obj, GetNull(props[i].PropertyType), null); + else + { + try + { + string strVal = propVal.ToString(); + + //convert to DateTime + if (props[i].PropertyType.UnderlyingSystemType.FullName == typeof(DateTime).FullName) + { + DateTime date = DateTime.MinValue; + if (DateTime.TryParse(strVal, out date)) + { + props[i].SetValue(obj, date, null); + } + } + else + { + //Convert generic + props[i].SetValue(obj, Cast(strVal, props[i].PropertyType), null); + } + } + catch + { + // skip property init + } + } + } + catch { } // just skip + } // for properties + } + + return obj; + } + + public static T FillObjectFromDataReader(IDataReader reader) + { + Type type = typeof(T); + + T obj = default(T); + + try + { + // get type properties + PropertyInfo[] props = GetTypeProperties(type); + + // iterate through reader + while (reader.Read()) + { + obj = (T)Activator.CreateInstance(type); + + // set properties + for (int i = 0; i < props.Length; i++) + { + string propName = props[i].Name; + + try + { + if (!IsColumnExists(propName, reader.GetSchemaTable())) + { + continue; + } + object propVal = reader[propName]; + + if (propVal == DBNull.Value) + props[i].SetValue(obj, GetNull(props[i].PropertyType), null); + else + { + try + { + //try string first + if (props[i].PropertyType.UnderlyingSystemType.FullName == typeof(String).FullName) + { + props[i].SetValue(obj, propVal.ToString(), null); + } + else + { + // then, try implicit type conversion + props[i].SetValue(obj, propVal, null); + } + } + catch + { + // convert to string and then set property value + try + { + string strVal = propVal.ToString(); + props[i].SetValue(obj, Cast(strVal, props[i].PropertyType), null); + } + catch + { + // skip property init + } + } + } + } + catch { } // just skip + } // for properties + } + } + finally + { + reader.Close(); + } + + return obj; + } + + private static Hashtable propertiesCache = new Hashtable(); + + public static object CreateObjectFromDataview(Type type, DataView dv, + string nameColumn, string valueColumn, bool persistentOnly) + { + // create hash of properties from datareader + Hashtable propValues = new Hashtable(); + foreach (DataRowView dr in dv) + { + if (propValues[dr[nameColumn]] == null && !propValues.ContainsKey(dr[nameColumn])) + propValues.Add(dr[nameColumn], dr[valueColumn]); + } + + return CreateObjectFromHash(type, propValues, persistentOnly); + } + + public static object CreateObjectFromDataReader(Type type, IDataReader reader, + string nameColumn, string valueColumn, bool persistentOnly) + { + // create hash of properties from datareader + Hashtable propValues = new Hashtable(); + while (reader.Read()) + { + if (propValues[reader[nameColumn]] == null && !propValues.ContainsKey(reader[nameColumn])) + propValues.Add(reader[nameColumn], reader[valueColumn]); + } + reader.Close(); + + return CreateObjectFromHash(type, propValues, persistentOnly); + } + + public static object CreateObjectFromHash(Type type, Hashtable propValues, bool persistentOnly) + { + // create object + object obj = Activator.CreateInstance(type); + + CreateObjectFromHash(obj, propValues, persistentOnly); + + return obj; + } + + public static void CopyPersistentPropertiesFromSource(T source, T target) + where T : ServiceProviderItem + { + // + var typeSource = source.GetType(); + var typeTarget = target.GetType(); + // get all property infos + Hashtable props = null; + if (propertiesCache[typeSource.Name] != null) + { + // load properties from cache + props = (Hashtable)propertiesCache[typeSource.Name]; + } + else + { + // create properties cache + props = new Hashtable(); + // + PropertyInfo[] objProps = typeSource.GetProperties(BindingFlags.Instance + //| BindingFlags.DeclaredOnly + | BindingFlags.Public); + foreach (PropertyInfo prop in objProps) + { + // check for persistent attribute + object[] attrs = prop.GetCustomAttributes(typeof(PersistentAttribute), false); + // Persistent only + if (attrs.Length > 0 && !props.ContainsKey(prop.Name)) + { + // add property to hash + props.Add(prop.Name, prop); + } + } + + if (!propertiesCache.ContainsKey(typeSource.Name)) + { + // add to cache + propertiesCache.Add(typeSource.Name, props); + } + } + + // Copy the data + foreach (PropertyInfo propertyInfo in props.Values) + { + propertyInfo.SetValue(target, propertyInfo.GetValue(source, null), null); + } + } + + public static void CreateObjectFromHash(object obj, Hashtable propValues, bool persistentOnly) + { + Type type = obj.GetType(); + + // get all property infos + Hashtable props = null; + if (propertiesCache[type.Name] != null) + { + // load properties from cache + props = (Hashtable)propertiesCache[type.Name]; + } + else + { + // create properties cache + props = new Hashtable(); + PropertyInfo[] objProps = type.GetProperties(BindingFlags.Instance + //| BindingFlags.DeclaredOnly + | BindingFlags.Public); + foreach (PropertyInfo prop in objProps) + { + // check for persistent attribute + object[] attrs = prop.GetCustomAttributes(typeof(PersistentAttribute), false); + if (!persistentOnly || (persistentOnly && attrs.Length > 0) && !props.ContainsKey(prop.Name)) + { + // add property to hash + props.Add(prop.Name, prop); + } + } + + if (!propertiesCache.ContainsKey(type.Name)) + { + // add to cache + propertiesCache.Add(type.Name, props); + } + } + + // fill properties + foreach (string propName in propValues.Keys) + { + // try to locate specified property + if (props[propName] != null) + { + // set property + // we support: + // String + // Int32 + // Boolean + // Float + PropertyInfo prop = (PropertyInfo)props[propName]; + string val = propValues[propName].ToString(); + if (prop.PropertyType == typeof(String)) + prop.SetValue(obj, val, null); + else if (prop.PropertyType == typeof(Int32)) + prop.SetValue(obj, Int32.Parse(val), null); + else + if (prop.PropertyType == typeof(long)) + prop.SetValue(obj, long.Parse(val), null); + else + if (prop.PropertyType == typeof(Boolean)) + prop.SetValue(obj, Boolean.Parse(val), null); + else if (prop.PropertyType == typeof(Single)) + prop.SetValue(obj, Single.Parse(val), null); + else if (prop.PropertyType.IsEnum) + prop.SetValue(obj, Enum.Parse(prop.PropertyType, val, true), null); + else + if (prop.PropertyType == typeof(Guid)) + prop.SetValue(obj, new Guid(val), null); + else + if (prop.PropertyType == typeof(string[])) + { + if (val == "") + prop.SetValue(obj, new string[0], null); + else + prop.SetValue(obj, val.Split(';'), null); + } + else if (prop.PropertyType == typeof(int[])) + { + string[] svals = val.Split(';'); + int[] ivals = new int[svals.Length]; + + for (int i = 0; i < svals.Length; i++) + ivals[i] = Int32.Parse(svals[i]); + + if (val == "") + ivals = new int[0]; + + prop.SetValue(obj, ivals, null); + } + } + } + } + + private static Dictionary GetTypePropertiesHash(Type type) + { + Dictionary hash = new Dictionary(); + PropertyInfo[] props = GetTypeProperties(type); + foreach (PropertyInfo prop in props) + { + if (!hash.ContainsKey(prop.Name)) + { + hash.Add(prop.Name, prop); + } + } + return hash; + } + + private static PropertyInfo[] GetTypeProperties(Type type) + { + string typeName = type.AssemblyQualifiedName; + if (typeProperties[typeName] != null) + return (PropertyInfo[])typeProperties[typeName]; + + PropertyInfo[] props = type.GetProperties(BindingFlags.Instance | BindingFlags.Public); + typeProperties[typeName] = props; + return props; + } + + public static object GetNull(Type type) + { + if (type == typeof(string)) + return null; + if (type == typeof(Int32)) + return 0; + if (type == typeof(Int64)) + return 0; + if (type == typeof(Boolean)) + return false; + if (type == typeof(Decimal)) + return 0M; + else + return null; + } + + public static object Cast(string val, Type type) + { + if (type == typeof(string)) + return val; + if (type == typeof(Int32)) + return Int32.Parse(val); + if (type == typeof(Int64)) + return Int64.Parse(val); + if (type == typeof(Boolean)) + return Boolean.Parse(val); + if (type == typeof(Decimal)) + return Decimal.Parse(val); + if (type == typeof(string[]) && val != null) + { + return val.Split(';'); + } + if (type.IsEnum) + return Enum.Parse(type, val, true); + + if (type == typeof(int[]) && val != null) + { + string[] sarr = val.Split(';'); + int[] iarr = new int[sarr.Length]; + for (int i = 0; i < sarr.Length; i++) + iarr[i] = Int32.Parse(sarr[i]); + return iarr; + } + else + return val; + } + + public static string GetTypeFullName(Type type) + { + return type.FullName + ", " + type.Assembly.GetName().Name; + } + + + #region Helper Functions + + /// + /// This function is used to determine whether IDataReader contains a Column. + /// + /// Name of the column. + /// The schema that decribes result-set contains. + /// True, when required column exists in the . Otherwise, false. + /// + /// The followin example shows how to look for the "Role" column in the . + /// + /// IDataReader reader = .... + /// if (!IsColumnExists("Role", reader.GetSchemaTable()) + /// { + /// continue; + /// } + /// + /// object roleValue = reader["Role"]; + /// + /// + static bool IsColumnExists(string columnName, DataTable schemaTable) + { + foreach (DataRow row in schemaTable.Rows) + { + if (String.Compare(row[0].ToString(), columnName, StringComparison.OrdinalIgnoreCase) == 0) + { + return true; + } + } + + return false; + } + + #endregion + } +} \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Common/SecurityContext.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Common/SecurityContext.cs similarity index 100% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Common/SecurityContext.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Common/SecurityContext.cs diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Common/ServiceProviderProxy.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Common/ServiceProviderProxy.cs similarity index 100% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Common/ServiceProviderProxy.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Common/ServiceProviderProxy.cs diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Common/ServiceUsernameTokenManager.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Common/ServiceUsernameTokenManager.cs similarity index 100% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Common/ServiceUsernameTokenManager.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Common/ServiceUsernameTokenManager.cs diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Common/UsernameAssertion.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Common/UsernameAssertion.cs similarity index 100% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Common/UsernameAssertion.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Common/UsernameAssertion.cs diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Common/Utils.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Common/Utils.cs similarity index 100% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Common/Utils.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Common/Utils.cs diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Data/DataProvider.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Data/DataProvider.cs new file mode 100644 index 00000000..1503bab5 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Data/DataProvider.cs @@ -0,0 +1,3966 @@ +// Copyright (c) 2012, Outercurve Foundation. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +using System; +using System.Configuration; +using System.Data; +using System.Data.SqlClient; +using System.Text.RegularExpressions; +using WebsitePanel.Providers.HostedSolution; +using Microsoft.ApplicationBlocks.Data; +using System.Collections.Generic; +using Microsoft.Win32; + +namespace WebsitePanel.EnterpriseServer +{ + /// + /// Summary description for DataProvider. + /// + public static class DataProvider + { + + static string EnterpriseServerRegistryPath = "SOFTWARE\\WebsitePanel\\EnterpriseServer"; + + private static string ConnectionString + { + get + { + string ConnectionKey = ConfigurationManager.AppSettings["WebsitePanel.AltConnectionString"]; + string value = string.Empty; + + if (!string.IsNullOrEmpty(ConnectionKey)) + { + RegistryKey root = Registry.LocalMachine; + RegistryKey rk = root.OpenSubKey(EnterpriseServerRegistryPath); + if (rk != null) + { + value = (string)rk.GetValue(ConnectionKey, null); + rk.Close(); + } + } + + if (!string.IsNullOrEmpty(value)) + return value; + else + return ConfigurationManager.ConnectionStrings["EnterpriseServer"].ConnectionString; + } + } + + private static string ObjectQualifier + { + get + { + return ""; + } + } + + #region System Settings + + public static IDataReader GetSystemSettings(string settingsName) + { + return SqlHelper.ExecuteReader( + ConnectionString, + CommandType.StoredProcedure, + "GetSystemSettings", + new SqlParameter("@SettingsName", settingsName) + ); + } + + public static void SetSystemSettings(string settingsName, string xml) + { + SqlHelper.ExecuteNonQuery( + ConnectionString, + CommandType.StoredProcedure, + "SetSystemSettings", + new SqlParameter("@SettingsName", settingsName), + new SqlParameter("@Xml", xml) + ); + } + + #endregion + + #region Users + public static bool CheckUserExists(string username) + { + SqlParameter prmExists = new SqlParameter("@Exists", SqlDbType.Bit); + prmExists.Direction = ParameterDirection.Output; + + SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "CheckUserExists", + prmExists, + new SqlParameter("@username", username)); + + return Convert.ToBoolean(prmExists.Value); + } + + public static DataSet GetUsersPaged(int actorId, int userId, string filterColumn, string filterValue, + int statusId, int roleId, string sortColumn, int startRow, int maximumRows, bool recursive) + { + return SqlHelper.ExecuteDataset(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetUsersPaged", + new SqlParameter("@actorId", actorId), + new SqlParameter("@UserID", userId), + new SqlParameter("@FilterColumn", VerifyColumnName(filterColumn)), + new SqlParameter("@FilterValue", VerifyColumnValue(filterValue)), + new SqlParameter("@statusId", statusId), + new SqlParameter("@roleId", roleId), + new SqlParameter("@SortColumn", VerifyColumnName(sortColumn)), + new SqlParameter("@startRow", startRow), + new SqlParameter("@maximumRows", maximumRows), + new SqlParameter("@recursive", recursive)); + } + + public static DataSet GetUsersSummary(int actorId, int userId) + { + return SqlHelper.ExecuteDataset(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetUsersSummary", + new SqlParameter("@actorId", actorId), + new SqlParameter("@UserID", userId)); + } + + public static DataSet GetUserDomainsPaged(int actorId, int userId, string filterColumn, string filterValue, + string sortColumn, int startRow, int maximumRows) + { + return SqlHelper.ExecuteDataset(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetUserDomainsPaged", + new SqlParameter("@actorId", actorId), + new SqlParameter("@UserID", userId), + new SqlParameter("@filterColumn", VerifyColumnName(filterColumn)), + new SqlParameter("@filterValue", VerifyColumnValue(filterValue)), + new SqlParameter("@sortColumn", VerifyColumnName(sortColumn)), + new SqlParameter("@startRow", startRow), + new SqlParameter("@maximumRows", maximumRows)); + } + + public static DataSet GetUsers(int actorId, int ownerId, bool recursive) + { + return SqlHelper.ExecuteDataset(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetUsers", + new SqlParameter("@ActorId", actorId), + new SqlParameter("@OwnerID", ownerId), + new SqlParameter("@Recursive", recursive)); + } + + public static DataSet GetUserParents(int actorId, int userId) + { + return SqlHelper.ExecuteDataset(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetUserParents", + new SqlParameter("@ActorId", actorId), + new SqlParameter("@UserID", userId)); + } + + public static DataSet GetUserPeers(int actorId, int userId) + { + return SqlHelper.ExecuteDataset(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetUserPeers", + new SqlParameter("@ActorId", actorId), + new SqlParameter("@userId", userId)); + } + + public static IDataReader GetUserByExchangeOrganizationIdInternally(int itemId) + { + return (IDataReader)SqlHelper.ExecuteReader(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetUserByExchangeOrganizationIdInternally", + new SqlParameter("@ItemID", itemId)); + } + + + + public static IDataReader GetUserByIdInternally(int userId) + { + return (IDataReader)SqlHelper.ExecuteReader(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetUserByIdInternally", + new SqlParameter("@UserID", userId)); + } + + public static IDataReader GetUserByUsernameInternally(string username) + { + return (IDataReader)SqlHelper.ExecuteReader(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetUserByUsernameInternally", + new SqlParameter("@Username", username)); + } + + public static IDataReader GetUserById(int actorId, int userId) + { + return (IDataReader)SqlHelper.ExecuteReader(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetUserById", + new SqlParameter("@ActorId", actorId), + new SqlParameter("@UserID", userId)); + } + + public static IDataReader GetUserByUsername(int actorId, string username) + { + return (IDataReader)SqlHelper.ExecuteReader(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetUserByUsername", + new SqlParameter("@ActorId", actorId), + new SqlParameter("@Username", username)); + } + + public static int AddUser(int actorId, int ownerId, int roleId, int statusId, string subscriberNumber, int loginStatusId, bool isDemo, + bool isPeer, string comments, string username, string password, + string firstName, string lastName, string email, string secondaryEmail, + string address, string city, string country, string state, string zip, + string primaryPhone, string secondaryPhone, string fax, string instantMessenger, bool htmlMail, + string companyName, bool ecommerceEnabled) + { + SqlParameter prmUserId = new SqlParameter("@UserID", SqlDbType.Int); + prmUserId.Direction = ParameterDirection.Output; + + // add user to WebsitePanel Users table + SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "AddUser", + prmUserId, + new SqlParameter("@ActorId", actorId), + new SqlParameter("@OwnerID", ownerId), + new SqlParameter("@RoleID", roleId), + new SqlParameter("@StatusId", statusId), + new SqlParameter("@SubscriberNumber", subscriberNumber), + new SqlParameter("@LoginStatusId", loginStatusId), + new SqlParameter("@IsDemo", isDemo), + new SqlParameter("@IsPeer", isPeer), + new SqlParameter("@Comments", comments), + new SqlParameter("@username", username), + new SqlParameter("@password", password), + new SqlParameter("@firstName", firstName), + new SqlParameter("@lastName", lastName), + new SqlParameter("@email", email), + new SqlParameter("@secondaryEmail", secondaryEmail), + new SqlParameter("@address", address), + new SqlParameter("@city", city), + new SqlParameter("@country", country), + new SqlParameter("@state", state), + new SqlParameter("@zip", zip), + new SqlParameter("@primaryPhone", primaryPhone), + new SqlParameter("@secondaryPhone", secondaryPhone), + new SqlParameter("@fax", fax), + new SqlParameter("@instantMessenger", instantMessenger), + new SqlParameter("@htmlMail", htmlMail), + new SqlParameter("@CompanyName", companyName), + new SqlParameter("@EcommerceEnabled", ecommerceEnabled)); + + return Convert.ToInt32(prmUserId.Value); + } + + public static void UpdateUser(int actorId, int userId, int roleId, int statusId, string subscriberNumber, int loginStatusId, bool isDemo, + bool isPeer, string comments, string firstName, string lastName, string email, string secondaryEmail, + string address, string city, string country, string state, string zip, + string primaryPhone, string secondaryPhone, string fax, string instantMessenger, bool htmlMail, + string companyName, bool ecommerceEnabled, string additionalParams) + { + // update user + SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "UpdateUser", + new SqlParameter("@ActorId", actorId), + new SqlParameter("@RoleID", roleId), + new SqlParameter("@StatusId", statusId), + new SqlParameter("@SubscriberNumber", subscriberNumber), + new SqlParameter("@LoginStatusId", loginStatusId), + new SqlParameter("@UserID", userId), + new SqlParameter("@IsDemo", isDemo), + new SqlParameter("@IsPeer", isPeer), + new SqlParameter("@Comments", comments), + new SqlParameter("@firstName", firstName), + new SqlParameter("@lastName", lastName), + new SqlParameter("@email", email), + new SqlParameter("@secondaryEmail", secondaryEmail), + new SqlParameter("@address", address), + new SqlParameter("@city", city), + new SqlParameter("@country", country), + new SqlParameter("@state", state), + new SqlParameter("@zip", zip), + new SqlParameter("@primaryPhone", primaryPhone), + new SqlParameter("@secondaryPhone", secondaryPhone), + new SqlParameter("@fax", fax), + new SqlParameter("@instantMessenger", instantMessenger), + new SqlParameter("@htmlMail", htmlMail), + new SqlParameter("@CompanyName", companyName), + new SqlParameter("@EcommerceEnabled", ecommerceEnabled), + new SqlParameter("@AdditionalParams", additionalParams)); + } + + public static void UpdateUserFailedLoginAttempt(int userId, int lockOut, bool reset) + { + SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "UpdateUserFailedLoginAttempt", + new SqlParameter("@UserID", userId), + new SqlParameter("@LockOut", lockOut), + new SqlParameter("@Reset", reset)); + } + + public static void DeleteUser(int actorId, int userId) + { + SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "DeleteUser", + new SqlParameter("@ActorId", actorId), + new SqlParameter("@UserID", userId)); + } + + public static void ChangeUserPassword(int actorId, int userId, string password) + { + SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "ChangeUserPassword", + new SqlParameter("@ActorId", actorId), + new SqlParameter("@UserID", userId), + new SqlParameter("@password", password)); + } + + #endregion + + #region User Settings + public static IDataReader GetUserSettings(int actorId, int userId, string settingsName) + { + return SqlHelper.ExecuteReader(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetUserSettings", + new SqlParameter("@ActorId", actorId), + new SqlParameter("@UserID", userId), + new SqlParameter("@SettingsName", settingsName)); + } + public static void UpdateUserSettings(int actorId, int userId, string settingsName, string xml) + { + SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "UpdateUserSettings", + new SqlParameter("@UserID", userId), + new SqlParameter("@ActorId", actorId), + new SqlParameter("@SettingsName", settingsName), + new SqlParameter("@Xml", xml)); + } + #endregion + + #region Servers + public static DataSet GetAllServers(int actorId) + { + return SqlHelper.ExecuteDataset(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetAllServers", + new SqlParameter("@actorId", actorId)); + } + public static DataSet GetServers(int actorId) + { + return SqlHelper.ExecuteDataset(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetServers", + new SqlParameter("@actorId", actorId)); + } + + public static IDataReader GetServer(int actorId, int serverId) + { + return (IDataReader)SqlHelper.ExecuteReader(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetServer", + new SqlParameter("@actorId", actorId), + new SqlParameter("@ServerID", serverId)); + } + + public static IDataReader GetServerShortDetails(int serverId) + { + return (IDataReader)SqlHelper.ExecuteReader(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetServerShortDetails", + new SqlParameter("@ServerID", serverId)); + } + + public static IDataReader GetServerByName(int actorId, string serverName) + { + return (IDataReader)SqlHelper.ExecuteReader(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetServerByName", + new SqlParameter("@actorId", actorId), + new SqlParameter("@ServerName", serverName)); + } + + public static IDataReader GetServerInternal(int serverId) + { + return (IDataReader)SqlHelper.ExecuteReader(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetServerInternal", + new SqlParameter("@ServerID", serverId)); + } + + public static int AddServer(string serverName, string serverUrl, + string password, string comments, bool virtualServer, string instantDomainAlias, + int primaryGroupId, bool adEnabled, string adRootDomain, string adUsername, string adPassword, + string adAuthenticationType) + { + SqlParameter prmServerId = new SqlParameter("@ServerID", SqlDbType.Int); + prmServerId.Direction = ParameterDirection.Output; + + SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "AddServer", + prmServerId, + new SqlParameter("@ServerName", serverName), + new SqlParameter("@ServerUrl", serverUrl), + new SqlParameter("@Password", password), + new SqlParameter("@Comments", comments), + new SqlParameter("@VirtualServer", virtualServer), + new SqlParameter("@InstantDomainAlias", instantDomainAlias), + new SqlParameter("@PrimaryGroupId", primaryGroupId), + new SqlParameter("@AdEnabled", adEnabled), + new SqlParameter("@AdRootDomain", adRootDomain), + new SqlParameter("@AdUsername", adUsername), + new SqlParameter("@AdPassword", adPassword), + new SqlParameter("@AdAuthenticationType", adAuthenticationType)); + + return Convert.ToInt32(prmServerId.Value); + } + + public static void UpdateServer(int serverId, string serverName, string serverUrl, + string password, string comments, string instantDomainAlias, + int primaryGroupId, bool adEnabled, string adRootDomain, string adUsername, string adPassword, + string adAuthenticationType) + { + SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "UpdateServer", + new SqlParameter("@ServerID", serverId), + new SqlParameter("@ServerName", serverName), + new SqlParameter("@ServerUrl", serverUrl), + new SqlParameter("@Password", password), + new SqlParameter("@Comments", comments), + new SqlParameter("@InstantDomainAlias", instantDomainAlias), + new SqlParameter("@PrimaryGroupId", primaryGroupId), + new SqlParameter("@AdEnabled", adEnabled), + new SqlParameter("@AdRootDomain", adRootDomain), + new SqlParameter("@AdUsername", adUsername), + new SqlParameter("@AdPassword", adPassword), + new SqlParameter("@AdAuthenticationType", adAuthenticationType)); + + } + + public static int DeleteServer(int serverId) + { + SqlParameter prmResult = new SqlParameter("@Result", SqlDbType.Int); + prmResult.Direction = ParameterDirection.Output; + + SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "DeleteServer", + prmResult, + new SqlParameter("@ServerID", serverId)); + + return Convert.ToInt32(prmResult.Value); + } + #endregion + + #region Virtual Servers + public static DataSet GetVirtualServers(int actorId) + { + return SqlHelper.ExecuteDataset(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetVirtualServers", + new SqlParameter("@actorId", actorId)); + } + + public static DataSet GetAvailableVirtualServices(int actorId, int serverId) + { + return SqlHelper.ExecuteDataset(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetAvailableVirtualServices", + new SqlParameter("@actorId", actorId), + new SqlParameter("@ServerID", serverId)); + } + + public static DataSet GetVirtualServices(int actorId, int serverId) + { + return SqlHelper.ExecuteDataset(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetVirtualServices", + new SqlParameter("@actorId", actorId), + new SqlParameter("@ServerID", serverId)); + } + + public static void AddVirtualServices(int serverId, string xml) + { + SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "AddVirtualServices", + new SqlParameter("@ServerID", serverId), + new SqlParameter("@xml", xml)); + } + + public static void DeleteVirtualServices(int serverId, string xml) + { + SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "DeleteVirtualServices", + new SqlParameter("@ServerID", serverId), + new SqlParameter("@xml", xml)); + } + + public static void UpdateVirtualGroups(int serverId, string xml) + { + SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "UpdateVirtualGroups", + new SqlParameter("@ServerID", serverId), + new SqlParameter("@xml", xml)); + } + #endregion + + #region Providers + + // Providers methods + + public static DataSet GetProviders() + { + return SqlHelper.ExecuteDataset(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetProviders"); + } + + public static DataSet GetGroupProviders(int groupId) + { + return SqlHelper.ExecuteDataset(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetGroupProviders", + new SqlParameter("@groupId", groupId)); + } + + public static IDataReader GetProvider(int providerId) + { + return SqlHelper.ExecuteReader(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetProvider", + new SqlParameter("@ProviderID", providerId)); + } + + public static IDataReader GetProviderByServiceID(int serviceId) + { + return SqlHelper.ExecuteReader(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetProviderByServiceID", + new SqlParameter("@ServiceID", serviceId)); + } + + #endregion + + #region IPAddresses + public static IDataReader GetIPAddress(int ipAddressId) + { + return (IDataReader)SqlHelper.ExecuteReader(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetIPAddress", + new SqlParameter("@AddressID", ipAddressId)); + } + + public static IDataReader GetIPAddresses(int actorId, int poolId, int serverId) + { + IDataReader reader = SqlHelper.ExecuteReader(ConnectionString, CommandType.StoredProcedure, + "GetIPAddresses", + new SqlParameter("@ActorId", actorId), + new SqlParameter("@PoolId", poolId), + new SqlParameter("@ServerId", serverId)); + return reader; + } + + public static IDataReader GetIPAddressesPaged(int actorId, int poolId, int serverId, + string filterColumn, string filterValue, + string sortColumn, int startRow, int maximumRows) + { + IDataReader reader = SqlHelper.ExecuteReader(ConnectionString, CommandType.StoredProcedure, + "GetIPAddressesPaged", + new SqlParameter("@ActorId", actorId), + new SqlParameter("@PoolId", poolId), + new SqlParameter("@ServerId", serverId), + new SqlParameter("@FilterColumn", VerifyColumnName(filterColumn)), + new SqlParameter("@FilterValue", VerifyColumnValue(filterValue)), + new SqlParameter("@SortColumn", VerifyColumnName(sortColumn)), + new SqlParameter("@startRow", startRow), + new SqlParameter("@maximumRows", maximumRows)); + return reader; + } + + public static int AddIPAddress(int poolId, int serverId, string externalIP, string internalIP, + string subnetMask, string defaultGateway, string comments) + { + SqlParameter prmAddresId = new SqlParameter("@AddressID", SqlDbType.Int); + prmAddresId.Direction = ParameterDirection.Output; + + SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "AddIPAddress", + prmAddresId, + new SqlParameter("@ServerID", serverId), + new SqlParameter("@externalIP", externalIP), + new SqlParameter("@internalIP", internalIP), + new SqlParameter("@PoolId", poolId), + new SqlParameter("@SubnetMask", subnetMask), + new SqlParameter("@DefaultGateway", defaultGateway), + new SqlParameter("@Comments", comments)); + + return Convert.ToInt32(prmAddresId.Value); + } + + public static void UpdateIPAddress(int addressId, int poolId, int serverId, + string externalIP, string internalIP, string subnetMask, string defaultGateway, string comments) + { + SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "UpdateIPAddress", + new SqlParameter("@AddressID", addressId), + new SqlParameter("@externalIP", externalIP), + new SqlParameter("@internalIP", internalIP), + new SqlParameter("@ServerID", serverId), + new SqlParameter("@PoolId", poolId), + new SqlParameter("@SubnetMask", subnetMask), + new SqlParameter("@DefaultGateway", defaultGateway), + new SqlParameter("@Comments", comments)); + } + + public static void UpdateIPAddresses(string xmlIds, int poolId, int serverId, + string subnetMask, string defaultGateway, string comments) + { + SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "UpdateIPAddresses", + new SqlParameter("@Xml", xmlIds), + new SqlParameter("@ServerID", serverId), + new SqlParameter("@PoolId", poolId), + new SqlParameter("@SubnetMask", subnetMask), + new SqlParameter("@DefaultGateway", defaultGateway), + new SqlParameter("@Comments", comments)); + } + + public static int DeleteIPAddress(int ipAddressId) + { + SqlParameter prmResult = new SqlParameter("@Result", SqlDbType.Int); + prmResult.Direction = ParameterDirection.Output; + + SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "DeleteIPAddress", + prmResult, + new SqlParameter("@AddressID", ipAddressId)); + + return Convert.ToInt32(prmResult.Value); + } + + + + #endregion + + #region Clusters + public static IDataReader GetClusters(int actorId) + { + return SqlHelper.ExecuteReader(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetClusters", + new SqlParameter("@actorId", actorId)); + } + + public static int AddCluster(string clusterName) + { + SqlParameter prmId = new SqlParameter("@ClusterID", SqlDbType.Int); + prmId.Direction = ParameterDirection.Output; + + SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "AddCluster", + prmId, + new SqlParameter("@ClusterName", clusterName)); + + return Convert.ToInt32(prmId.Value); + } + + public static void DeleteCluster(int clusterId) + { + SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "DeleteCluster", + new SqlParameter("@ClusterId", clusterId)); + } + + #endregion + + #region Global DNS records + public static DataSet GetDnsRecordsByService(int actorId, int serviceId) + { + return SqlHelper.ExecuteDataset(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetDnsRecordsByService", + new SqlParameter("@actorId", actorId), + new SqlParameter("@ServiceId", serviceId)); + } + + public static DataSet GetDnsRecordsByServer(int actorId, int serverId) + { + return SqlHelper.ExecuteDataset(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetDnsRecordsByServer", + new SqlParameter("@actorId", actorId), + new SqlParameter("@ServerId", serverId)); + } + + public static DataSet GetDnsRecordsByPackage(int actorId, int packageId) + { + return SqlHelper.ExecuteDataset(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetDnsRecordsByPackage", + new SqlParameter("@actorId", actorId), + new SqlParameter("@PackageId", packageId)); + } + + public static DataSet GetDnsRecordsByGroup(int groupId) + { + return SqlHelper.ExecuteDataset(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetDnsRecordsByGroup", + new SqlParameter("@GroupId", groupId)); + } + + public static DataSet GetDnsRecordsTotal(int actorId, int packageId) + { + return SqlHelper.ExecuteDataset(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetDnsRecordsTotal", + new SqlParameter("@actorId", actorId), + new SqlParameter("@packageId", packageId)); + } + + public static IDataReader GetDnsRecord(int actorId, int recordId) + { + return SqlHelper.ExecuteReader(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetDnsRecord", + new SqlParameter("@actorId", actorId), + new SqlParameter("@RecordId", recordId)); + } + + public static void AddDnsRecord(int actorId, int serviceId, int serverId, int packageId, string recordType, + string recordName, string recordData, int mxPriority, int SrvPriority, int SrvWeight, int SrvPort, int ipAddressId) + { + SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "AddDnsRecord", + new SqlParameter("@actorId", actorId), + new SqlParameter("@ServiceId", serviceId), + new SqlParameter("@ServerId", serverId), + new SqlParameter("@PackageId", packageId), + new SqlParameter("@RecordType", recordType), + new SqlParameter("@RecordName", recordName), + new SqlParameter("@RecordData", recordData), + new SqlParameter("@MXPriority", mxPriority), + new SqlParameter("@SrvPriority", SrvPriority), + new SqlParameter("@SrvWeight", SrvWeight), + new SqlParameter("@SrvPort", SrvPort), + new SqlParameter("@IpAddressId", ipAddressId)); + } + + public static void UpdateDnsRecord(int actorId, int recordId, string recordType, + string recordName, string recordData, int mxPriority, int SrvPriority, int SrvWeight, int SrvPort, int ipAddressId) + { + SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "UpdateDnsRecord", + new SqlParameter("@actorId", actorId), + new SqlParameter("@RecordId", recordId), + new SqlParameter("@RecordType", recordType), + new SqlParameter("@RecordName", recordName), + new SqlParameter("@RecordData", recordData), + new SqlParameter("@MXPriority", mxPriority), + new SqlParameter("@SrvPriority", SrvPriority), + new SqlParameter("@SrvWeight", SrvWeight), + new SqlParameter("@SrvPort", SrvPort), + new SqlParameter("@IpAddressId", ipAddressId)); + } + + + public static void DeleteDnsRecord(int actorId, int recordId) + { + SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "DeleteDnsRecord", + new SqlParameter("@actorId", actorId), + new SqlParameter("@RecordId", recordId)); + } + #endregion + + #region Domains + public static DataSet GetDomains(int actorId, int packageId, bool recursive) + { + return SqlHelper.ExecuteDataset(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetDomains", + new SqlParameter("@ActorId", actorId), + new SqlParameter("@PackageId", packageId), + new SqlParameter("@Recursive", recursive)); + } + + public static DataSet GetResellerDomains(int actorId, int packageId) + { + return SqlHelper.ExecuteDataset(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetResellerDomains", + new SqlParameter("@ActorId", actorId), + new SqlParameter("@PackageId", packageId)); + } + + public static DataSet GetDomainsPaged(int actorId, int packageId, int serverId, bool recursive, string filterColumn, string filterValue, + string sortColumn, int startRow, int maximumRows) + { + return SqlHelper.ExecuteDataset(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetDomainsPaged", + new SqlParameter("@ActorId", actorId), + new SqlParameter("@PackageId", packageId), + new SqlParameter("@serverId", serverId), + new SqlParameter("@recursive", recursive), + new SqlParameter("@FilterColumn", VerifyColumnName(filterColumn)), + new SqlParameter("@FilterValue", VerifyColumnValue(filterValue)), + new SqlParameter("@SortColumn", VerifyColumnName(sortColumn)), + new SqlParameter("@StartRow", startRow), + new SqlParameter("@MaximumRows", maximumRows)); + } + + public static IDataReader GetDomain(int actorId, int domainId) + { + return SqlHelper.ExecuteReader(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetDomain", + new SqlParameter("@ActorId", actorId), + new SqlParameter("@domainId", domainId)); + } + + public static IDataReader GetDomainByName(int actorId, string domainName, bool searchOnDomainPointer, bool isDomainPointer) + { + return SqlHelper.ExecuteReader(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetDomainByName", + new SqlParameter("@ActorId", actorId), + new SqlParameter("@domainName", domainName), + new SqlParameter("@SearchOnDomainPointer", searchOnDomainPointer), + new SqlParameter("@IsDomainPointer", isDomainPointer)); + } + + + public static DataSet GetDomainsByZoneId(int actorId, int zoneId) + { + return SqlHelper.ExecuteDataset(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetDomainsByZoneID", + new SqlParameter("@ActorId", actorId), + new SqlParameter("@ZoneID", zoneId)); + } + + public static DataSet GetDomainsByDomainItemId(int actorId, int domainId) + { + return SqlHelper.ExecuteDataset(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetDomainsByDomainItemId", + new SqlParameter("@ActorId", actorId), + new SqlParameter("@DomainID", domainId)); + } + + + + public static int CheckDomain(int packageId, string domainName, bool isDomainPointer) + { + SqlParameter prmId = new SqlParameter("@Result", SqlDbType.Int); + prmId.Direction = ParameterDirection.Output; + + SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "CheckDomain", + prmId, + new SqlParameter("@packageId", packageId), + new SqlParameter("@domainName", domainName), + new SqlParameter("@isDomainPointer", isDomainPointer)); + + return Convert.ToInt32(prmId.Value); + } + + + + public static int CheckDomainUsedByHostedOrganization(string domainName) + { + SqlParameter prmId = new SqlParameter("@Result", SqlDbType.Int); + prmId.Direction = ParameterDirection.Output; + + SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "CheckDomainUsedByHostedOrganization", + prmId, + new SqlParameter("@domainName", domainName)); + + return Convert.ToInt32(prmId.Value); + } + + + public static int AddDomain(int actorId, int packageId, int zoneItemId, string domainName, + bool hostingAllowed, int webSiteId, int mailDomainId, bool isSubDomain, bool isInstantAlias, bool isDomainPointer) + { + SqlParameter prmId = new SqlParameter("@DomainID", SqlDbType.Int); + prmId.Direction = ParameterDirection.Output; + + SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "AddDomain", + prmId, + new SqlParameter("@ActorId", actorId), + new SqlParameter("@PackageId", packageId), + new SqlParameter("@ZoneItemId", zoneItemId), + new SqlParameter("@DomainName", domainName), + new SqlParameter("@HostingAllowed", hostingAllowed), + new SqlParameter("@WebSiteId", webSiteId), + new SqlParameter("@MailDomainId", mailDomainId), + new SqlParameter("@IsSubDomain", isSubDomain), + new SqlParameter("@IsInstantAlias", isInstantAlias), + new SqlParameter("@IsDomainPointer", isDomainPointer)); + + return Convert.ToInt32(prmId.Value); + } + + public static void UpdateDomain(int actorId, int domainId, int zoneItemId, + bool hostingAllowed, int webSiteId, int mailDomainId, int domainItemId) + { + SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "UpdateDomain", + new SqlParameter("@ActorId", actorId), + new SqlParameter("@DomainId", domainId), + new SqlParameter("@ZoneItemId", zoneItemId), + new SqlParameter("@HostingAllowed", hostingAllowed), + new SqlParameter("@WebSiteId", webSiteId), + new SqlParameter("@MailDomainId", mailDomainId), + new SqlParameter("@DomainItemId", domainItemId)); + } + + public static void DeleteDomain(int actorId, int domainId) + { + SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "DeleteDomain", + new SqlParameter("@ActorId", actorId), + new SqlParameter("@DomainId", domainId)); + } + #endregion + + #region Services + public static IDataReader GetServicesByServerId(int actorId, int serverId) + { + return SqlHelper.ExecuteReader(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetServicesByServerID", + new SqlParameter("@actorId", actorId), + new SqlParameter("@ServerID", serverId)); + } + + public static IDataReader GetServicesByServerIdGroupName(int actorId, int serverId, string groupName) + { + return SqlHelper.ExecuteReader(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetServicesByServerIdGroupName", + new SqlParameter("@ActorId", actorId), + new SqlParameter("@ServerID", serverId), + new SqlParameter("@GroupName", groupName)); + } + + public static DataSet GetRawServicesByServerId(int actorId, int serverId) + { + return SqlHelper.ExecuteDataset(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetRawServicesByServerID", + new SqlParameter("@actorId", actorId), + new SqlParameter("@ServerID", serverId)); + } + + public static DataSet GetServicesByGroupId(int actorId, int groupId) + { + return SqlHelper.ExecuteDataset(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetServicesByGroupID", + new SqlParameter("@actorId", actorId), + new SqlParameter("@groupId", groupId)); + } + + public static DataSet GetServicesByGroupName(int actorId, string groupName) + { + return SqlHelper.ExecuteDataset(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetServicesByGroupName", + new SqlParameter("@actorId", actorId), + new SqlParameter("@GroupName", groupName)); + } + + public static IDataReader GetService(int actorId, int serviceId) + { + return (IDataReader)SqlHelper.ExecuteReader(ConnectionString, + CommandType.StoredProcedure, + ObjectQualifier + "GetService", + new SqlParameter("@actorId", actorId), + new SqlParameter("@ServiceID", serviceId)); + } + + public static int AddService(int serverId, int providerId, string serviceName, int serviceQuotaValue, + int clusterId, string comments) + { + SqlParameter prmServiceId = new SqlParameter("@ServiceID", SqlDbType.Int); + prmServiceId.Direction = ParameterDirection.Output; + + SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "AddService", + prmServiceId, + new SqlParameter("@ServerID", serverId), + new SqlParameter("@ProviderID", providerId), + new SqlParameter("@ServiceName", serviceName), + new SqlParameter("@ServiceQuotaValue", serviceQuotaValue), + new SqlParameter("@ClusterId", clusterId), + new SqlParameter("@comments", comments)); + + return Convert.ToInt32(prmServiceId.Value); + } + + public static void UpdateService(int serviceId, string serviceName, int serviceQuotaValue, + int clusterId, string comments) + { + SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "UpdateService", + new SqlParameter("@ServiceName", serviceName), + new SqlParameter("@ServiceID", serviceId), + new SqlParameter("@ServiceQuotaValue", serviceQuotaValue), + new SqlParameter("@ClusterId", clusterId), + new SqlParameter("@Comments", comments)); + } + + public static int DeleteService(int serviceId) + { + SqlParameter prmResult = new SqlParameter("@Result", SqlDbType.Int); + prmResult.Direction = ParameterDirection.Output; + + SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "DeleteService", + prmResult, + new SqlParameter("@ServiceID", serviceId)); + + return Convert.ToInt32(prmResult.Value); + } + + public static IDataReader GetServiceProperties(int actorId, int serviceId) + { + return (IDataReader)SqlHelper.ExecuteReader(ConnectionString, + CommandType.StoredProcedure, + ObjectQualifier + "GetServiceProperties", + new SqlParameter("@actorId", actorId), + new SqlParameter("@ServiceID", serviceId)); + } + + public static void UpdateServiceProperties(int serviceId, string xml) + { + SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "UpdateServiceProperties", + new SqlParameter("@ServiceId", serviceId), + new SqlParameter("@Xml", xml)); + } + + public static IDataReader GetResourceGroup(int groupId) + { + return SqlHelper.ExecuteReader(ConnectionString, + CommandType.StoredProcedure, + ObjectQualifier + "GetResourceGroup", + new SqlParameter("@groupId", groupId)); + } + + public static DataSet GetResourceGroups() + { + return SqlHelper.ExecuteDataset(ConnectionString, + CommandType.StoredProcedure, + ObjectQualifier + "GetResourceGroups"); + } + #endregion + + #region Service Items + public static DataSet GetServiceItems(int actorId, int packageId, string groupName, string itemTypeName, bool recursive) + { + return SqlHelper.ExecuteDataset(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetServiceItems", + new SqlParameter("@actorId", actorId), + new SqlParameter("@PackageID", packageId), + new SqlParameter("@GroupName", groupName), + new SqlParameter("@ItemTypeName", itemTypeName), + new SqlParameter("@Recursive", recursive)); + + } + + public static DataSet GetServiceItemsPaged(int actorId, int packageId, string groupName, string itemTypeName, + int serverId, bool recursive, string filterColumn, string filterValue, + string sortColumn, int startRow, int maximumRows) + { + return SqlHelper.ExecuteDataset(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetServiceItemsPaged", + new SqlParameter("@actorId", actorId), + new SqlParameter("@packageId", packageId), + new SqlParameter("@groupName", groupName), + new SqlParameter("@serverId", serverId), + new SqlParameter("@itemTypeName", itemTypeName), + new SqlParameter("@recursive", recursive), + new SqlParameter("@FilterColumn", VerifyColumnName(filterColumn)), + new SqlParameter("@FilterValue", VerifyColumnValue(filterValue)), + new SqlParameter("@SortColumn", VerifyColumnName(sortColumn)), + new SqlParameter("@startRow", startRow), + new SqlParameter("@maximumRows", maximumRows)); + } + + public static DataSet GetSearchableServiceItemTypes() + { + return SqlHelper.ExecuteDataset(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetSearchableServiceItemTypes"); + } + + public static DataSet GetServiceItemsByService(int actorId, int serviceId) + { + return SqlHelper.ExecuteDataset(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetServiceItemsByService", + new SqlParameter("@actorId", actorId), + new SqlParameter("@ServiceID", serviceId)); + } + + public static int GetServiceItemsCount(string typeName, string groupName, int serviceId) + { + SqlParameter prmTotalNumber = new SqlParameter("@TotalNumber", SqlDbType.Int); + prmTotalNumber.Direction = ParameterDirection.Output; + + DataSet ds = SqlHelper.ExecuteDataset(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetServiceItemsCount", + prmTotalNumber, + new SqlParameter("@itemTypeName", typeName), + new SqlParameter("@groupName", groupName), + new SqlParameter("@serviceId", serviceId)); + + // read identity + return Convert.ToInt32(prmTotalNumber.Value); + } + + public static DataSet GetServiceItemsForStatistics(int actorId, int serviceId, int packageId, + bool calculateDiskspace, bool calculateBandwidth, bool suspendable, bool disposable) + { + return SqlHelper.ExecuteDataset(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetServiceItemsForStatistics", + new SqlParameter("@ActorID", actorId), + new SqlParameter("@ServiceID", serviceId), + new SqlParameter("@packageId", packageId), + new SqlParameter("@calculateDiskspace", calculateDiskspace), + new SqlParameter("@calculateBandwidth", calculateBandwidth), + new SqlParameter("@suspendable", suspendable), + new SqlParameter("@disposable", disposable)); + } + + public static DataSet GetServiceItemsByPackage(int actorId, int packageId) + { + return SqlHelper.ExecuteDataset(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetServiceItemsByPackage", + new SqlParameter("@actorId", actorId), + new SqlParameter("@PackageID", packageId)); + } + + public static DataSet GetServiceItem(int actorId, int itemId) + { + return SqlHelper.ExecuteDataset(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetServiceItem", + new SqlParameter("@ItemID", itemId), + new SqlParameter("@actorId", actorId)); + } + + public static bool CheckServiceItemExists(int serviceId, string itemName, string itemTypeName) + { + SqlParameter prmExists = new SqlParameter("@Exists", SqlDbType.Bit); + prmExists.Direction = ParameterDirection.Output; + + SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "CheckServiceItemExistsInService", + prmExists, + new SqlParameter("@serviceId", serviceId), + new SqlParameter("@itemName", itemName), + new SqlParameter("@itemTypeName", itemTypeName)); + + return Convert.ToBoolean(prmExists.Value); + } + + public static bool CheckServiceItemExists(string itemName, string groupName, string itemTypeName) + { + SqlParameter prmExists = new SqlParameter("@Exists", SqlDbType.Bit); + prmExists.Direction = ParameterDirection.Output; + + SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "CheckServiceItemExists", + prmExists, + new SqlParameter("@itemName", itemName), + new SqlParameter("@groupName", groupName), + new SqlParameter("@itemTypeName", itemTypeName)); + + return Convert.ToBoolean(prmExists.Value); + } + + public static DataSet GetServiceItemByName(int actorId, int packageId, string groupName, + string itemName, string itemTypeName) + { + return SqlHelper.ExecuteDataset(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetServiceItemByName", + new SqlParameter("@actorId", actorId), + new SqlParameter("@packageId", packageId), + new SqlParameter("@itemName", itemName), + new SqlParameter("@itemTypeName", itemTypeName), + new SqlParameter("@groupName", groupName)); + } + + public static DataSet GetServiceItemsByName(int actorId, int packageId, string itemName) + { + return SqlHelper.ExecuteDataset(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetServiceItemsByName", + new SqlParameter("@actorId", actorId), + new SqlParameter("@packageId", packageId), + new SqlParameter("@itemName", itemName)); + } + + public static int AddServiceItem(int actorId, int serviceId, int packageId, string itemName, + string itemTypeName, string xmlProperties) + { + // add item + SqlParameter prmItemId = new SqlParameter("@ItemID", SqlDbType.Int); + prmItemId.Direction = ParameterDirection.Output; + + SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "AddServiceItem", + new SqlParameter("@actorId", actorId), + new SqlParameter("@PackageID", packageId), + new SqlParameter("@ServiceID", serviceId), + new SqlParameter("@ItemName", itemName), + new SqlParameter("@ItemTypeName", itemTypeName), + new SqlParameter("@xmlProperties", xmlProperties), + new SqlParameter("@CreatedDate", DateTime.Now), + prmItemId); + + return Convert.ToInt32(prmItemId.Value); + } + + public static void UpdateServiceItem(int actorId, int itemId, string itemName, string xmlProperties) + { + // update item + SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "UpdateServiceItem", + new SqlParameter("@actorId", actorId), + new SqlParameter("@ItemName", itemName), + new SqlParameter("@ItemId", itemId), + new SqlParameter("@XmlProperties", xmlProperties)); + } + + public static void DeleteServiceItem(int actorId, int itemId) + { + SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "DeleteServiceItem", + new SqlParameter("@actorId", actorId), + new SqlParameter("@ItemID", itemId)); + } + + public static void MoveServiceItem(int actorId, int itemId, int destinationServiceId) + { + SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "MoveServiceItem", + new SqlParameter("@actorId", actorId), + new SqlParameter("@ItemID", itemId), + new SqlParameter("@DestinationServiceID", destinationServiceId)); + } + + public static int GetPackageServiceId(int actorId, int packageId, string groupName) + { + SqlParameter prmServiceId = new SqlParameter("@ServiceID", SqlDbType.Int); + prmServiceId.Direction = ParameterDirection.Output; + + SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetPackageServiceID", + new SqlParameter("@actorId", actorId), + new SqlParameter("@PackageID", packageId), + new SqlParameter("@groupName", groupName), + prmServiceId); + + return Convert.ToInt32(prmServiceId.Value); + } + + public static void UpdatePackageDiskSpace(int packageId, string xml) + { + ExecuteLongNonQuery( + ObjectQualifier + "UpdatePackageDiskSpace", + new SqlParameter("@packageId", packageId), + new SqlParameter("@xml", xml)); + } + + public static void UpdatePackageBandwidth(int packageId, string xml) + { + ExecuteLongNonQuery( + ObjectQualifier + "UpdatePackageBandwidth", + new SqlParameter("@packageId", packageId), + new SqlParameter("@xml", xml)); + } + + public static DateTime GetPackageBandwidthUpdate(int packageId) + { + SqlParameter prmUpdateDate = new SqlParameter("@UpdateDate", SqlDbType.DateTime); + prmUpdateDate.Direction = ParameterDirection.Output; + + SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetPackageBandwidthUpdate", + prmUpdateDate, + new SqlParameter("@packageId", packageId)); + + return (prmUpdateDate.Value != DBNull.Value) ? Convert.ToDateTime(prmUpdateDate.Value) : DateTime.MinValue; + } + + public static void UpdatePackageBandwidthUpdate(int packageId, DateTime updateDate) + { + SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "UpdatePackageBandwidthUpdate", + new SqlParameter("@packageId", packageId), + new SqlParameter("@updateDate", updateDate)); + } + + public static IDataReader GetServiceItemType(int itemTypeId) + { + return SqlHelper.ExecuteReader( + ConnectionString, + CommandType.StoredProcedure, + "GetServiceItemType", + new SqlParameter("@ItemTypeID", itemTypeId) + ); + } + + public static IDataReader GetServiceItemTypes() + { + return SqlHelper.ExecuteReader( + ConnectionString, + CommandType.StoredProcedure, + "GetServiceItemTypes" + ); + } + #endregion + + #region Plans + // Plans methods + public static DataSet GetHostingPlans(int actorId, int userId) + { + return SqlHelper.ExecuteDataset(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetHostingPlans", + new SqlParameter("@actorId", actorId), + new SqlParameter("@userId", userId)); + } + + public static DataSet GetHostingAddons(int actorId, int userId) + { + return SqlHelper.ExecuteDataset(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetHostingAddons", + new SqlParameter("@actorId", actorId), + new SqlParameter("@userId", userId)); + } + + public static DataSet GetUserAvailableHostingPlans(int actorId, int userId) + { + return SqlHelper.ExecuteDataset(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetUserAvailableHostingPlans", + new SqlParameter("@actorId", actorId), + new SqlParameter("@userId", userId)); + } + + public static DataSet GetUserAvailableHostingAddons(int actorId, int userId) + { + return SqlHelper.ExecuteDataset(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetUserAvailableHostingAddons", + new SqlParameter("@actorId", actorId), + new SqlParameter("@userId", userId)); + } + + public static IDataReader GetHostingPlan(int actorId, int planId) + { + return (IDataReader)SqlHelper.ExecuteReader(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetHostingPlan", + new SqlParameter("@actorId", actorId), + new SqlParameter("@PlanId", planId)); + } + + public static DataSet GetHostingPlanQuotas(int actorId, int packageId, int planId, int serverId) + { + return SqlHelper.ExecuteDataset(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetHostingPlanQuotas", + new SqlParameter("@actorId", actorId), + new SqlParameter("@packageId", packageId), + new SqlParameter("@planId", planId), + new SqlParameter("@serverId", serverId)); + } + + public static int AddHostingPlan(int actorId, int userId, int packageId, string planName, + string planDescription, bool available, int serverId, decimal setupPrice, decimal recurringPrice, + int recurrenceUnit, int recurrenceLength, bool isAddon, string quotasXml) + { + SqlParameter prmPlanId = new SqlParameter("@PlanID", SqlDbType.Int); + prmPlanId.Direction = ParameterDirection.Output; + + SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "AddHostingPlan", + new SqlParameter("@actorId", actorId), + new SqlParameter("@userId", userId), + new SqlParameter("@packageId", packageId), + new SqlParameter("@planName", planName), + new SqlParameter("@planDescription", planDescription), + new SqlParameter("@available", available), + new SqlParameter("@serverId", serverId), + new SqlParameter("@setupPrice", setupPrice), + new SqlParameter("@recurringPrice", recurringPrice), + new SqlParameter("@recurrenceUnit", recurrenceUnit), + new SqlParameter("@recurrenceLength", recurrenceLength), + new SqlParameter("@isAddon", isAddon), + new SqlParameter("@quotasXml", quotasXml), + prmPlanId); + + // read identity + return Convert.ToInt32(prmPlanId.Value); + } + + public static DataSet UpdateHostingPlan(int actorId, int planId, int packageId, int serverId, string planName, + string planDescription, bool available, decimal setupPrice, decimal recurringPrice, + int recurrenceUnit, int recurrenceLength, string quotasXml) + { + return SqlHelper.ExecuteDataset(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "UpdateHostingPlan", + new SqlParameter("@actorId", actorId), + new SqlParameter("@planId", planId), + new SqlParameter("@packageId", packageId), + new SqlParameter("@serverId", serverId), + new SqlParameter("@planName", planName), + new SqlParameter("@planDescription", planDescription), + new SqlParameter("@available", available), + new SqlParameter("@setupPrice", setupPrice), + new SqlParameter("@recurringPrice", recurringPrice), + new SqlParameter("@recurrenceUnit", recurrenceUnit), + new SqlParameter("@recurrenceLength", recurrenceLength), + new SqlParameter("@quotasXml", quotasXml)); + } + + public static int CopyHostingPlan(int planId, int userId, int packageId) + { + SqlParameter prmPlanId = new SqlParameter("@DestinationPlanID", SqlDbType.Int); + prmPlanId.Direction = ParameterDirection.Output; + + SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "CopyHostingPlan", + new SqlParameter("@SourcePlanID", planId), + new SqlParameter("@UserID", userId), + new SqlParameter("@PackageID", packageId), + prmPlanId); + + return Convert.ToInt32(prmPlanId.Value); + } + + public static int DeleteHostingPlan(int actorId, int planId) + { + SqlParameter prmResult = new SqlParameter("@Result", SqlDbType.Int); + prmResult.Direction = ParameterDirection.Output; + + SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "DeleteHostingPlan", + prmResult, + new SqlParameter("@actorId", actorId), + new SqlParameter("@PlanId", planId)); + + return Convert.ToInt32(prmResult.Value); + } + #endregion + + #region Packages + + // Packages + public static DataSet GetMyPackages(int actorId, int userId) + { + return SqlHelper.ExecuteDataset(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetMyPackages", + new SqlParameter("@ActorId", actorId), + new SqlParameter("@UserID", userId)); + } + + public static DataSet GetPackages(int actorId, int userId) + { + return SqlHelper.ExecuteDataset(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetPackages", + new SqlParameter("@ActorId", actorId), + new SqlParameter("@UserID", userId)); + } + + public static DataSet GetNestedPackagesSummary(int actorId, int packageId) + { + return SqlHelper.ExecuteDataset(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetNestedPackagesSummary", + new SqlParameter("@ActorId", actorId), + new SqlParameter("@PackageID", packageId)); + } + + public static DataSet SearchServiceItemsPaged(int actorId, int userId, int itemTypeId, string filterValue, + string sortColumn, int startRow, int maximumRows) + { + return SqlHelper.ExecuteDataset(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "SearchServiceItemsPaged", + new SqlParameter("@ActorId", actorId), + new SqlParameter("@UserID", userId), + new SqlParameter("@itemTypeId", itemTypeId), + new SqlParameter("@FilterValue", VerifyColumnValue(filterValue)), + new SqlParameter("@SortColumn", VerifyColumnName(sortColumn)), + new SqlParameter("@startRow", startRow), + new SqlParameter("@maximumRows", maximumRows)); + } + + public static DataSet GetPackagesPaged(int actorId, int userId, string filterColumn, string filterValue, + string sortColumn, int startRow, int maximumRows) + { + return SqlHelper.ExecuteDataset(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetPackagesPaged", + new SqlParameter("@ActorId", actorId), + new SqlParameter("@UserID", userId), + new SqlParameter("@FilterColumn", VerifyColumnName(filterColumn)), + new SqlParameter("@FilterValue", VerifyColumnValue(filterValue)), + new SqlParameter("@SortColumn", VerifyColumnName(sortColumn)), + new SqlParameter("@startRow", startRow), + new SqlParameter("@maximumRows", maximumRows)); + } + + public static DataSet GetNestedPackagesPaged(int actorId, int packageId, string filterColumn, string filterValue, + int statusId, int planId, int serverId, string sortColumn, int startRow, int maximumRows) + { + return SqlHelper.ExecuteDataset(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetNestedPackagesPaged", + new SqlParameter("@actorId", actorId), + new SqlParameter("@packageId", packageId), + new SqlParameter("@FilterColumn", VerifyColumnName(filterColumn)), + new SqlParameter("@FilterValue", VerifyColumnValue(filterValue)), + new SqlParameter("@statusId", statusId), + new SqlParameter("@planId", planId), + new SqlParameter("@serverId", serverId), + new SqlParameter("@SortColumn", VerifyColumnName(sortColumn)), + new SqlParameter("@startRow", startRow), + new SqlParameter("@maximumRows", maximumRows)); + } + + public static DataSet GetPackagePackages(int actorId, int packageId, bool recursive) + { + return SqlHelper.ExecuteDataset(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetPackagePackages", + new SqlParameter("@ActorId", actorId), + new SqlParameter("@packageId", packageId), + new SqlParameter("@recursive", recursive)); + } + + public static IDataReader GetPackage(int actorId, int packageId) + { + return SqlHelper.ExecuteReader(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetPackage", + new SqlParameter("@ActorId", actorId), + new SqlParameter("@PackageID", packageId)); + } + + public static DataSet GetPackageQuotas(int actorId, int packageId) + { + return SqlHelper.ExecuteDataset(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetPackageQuotas", + new SqlParameter("@actorId", actorId), + new SqlParameter("@PackageID", packageId)); + } + + public static DataSet GetPackageQuotasForEdit(int actorId, int packageId) + { + return SqlHelper.ExecuteDataset(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetPackageQuotasForEdit", + new SqlParameter("@actorId", actorId), + new SqlParameter("@PackageID", packageId)); + } + + public static DataSet AddPackage(int actorId, out int packageId, int userId, int planId, string packageName, + string packageComments, int statusId, DateTime purchaseDate) + { + SqlParameter prmPackageId = new SqlParameter("@PackageID", SqlDbType.Int); + prmPackageId.Direction = ParameterDirection.Output; + + DataSet ds = SqlHelper.ExecuteDataset(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "AddPackage", + prmPackageId, + new SqlParameter("@ActorId", actorId), + new SqlParameter("@userId", userId), + new SqlParameter("@packageName", packageName), + new SqlParameter("@packageComments", packageComments), + new SqlParameter("@statusId", statusId), + new SqlParameter("@planId", planId), + new SqlParameter("@purchaseDate", purchaseDate)); + + // read identity + packageId = Convert.ToInt32(prmPackageId.Value); + + return ds; + } + + public static DataSet UpdatePackage(int actorId, int packageId, int planId, string packageName, + string packageComments, int statusId, DateTime purchaseDate, + bool overrideQuotas, string quotasXml) + { + return SqlHelper.ExecuteDataset(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "UpdatePackage", + new SqlParameter("@ActorId", actorId), + new SqlParameter("@packageId", packageId), + new SqlParameter("@packageName", packageName), + new SqlParameter("@packageComments", packageComments), + new SqlParameter("@statusId", statusId), + new SqlParameter("@planId", planId), + new SqlParameter("@purchaseDate", purchaseDate), + new SqlParameter("@overrideQuotas", overrideQuotas), + new SqlParameter("@quotasXml", quotasXml)); + } + + public static void UpdatePackageName(int actorId, int packageId, string packageName, + string packageComments) + { + SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "UpdatePackageName", + new SqlParameter("@ActorId", actorId), + new SqlParameter("@packageId", packageId), + new SqlParameter("@packageName", packageName), + new SqlParameter("@packageComments", packageComments)); + } + + public static void DeletePackage(int actorId, int packageId) + { + SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "DeletePackage", + new SqlParameter("@ActorId", actorId), + new SqlParameter("@PackageID", packageId)); + } + + // Package Add-ons + public static DataSet GetPackageAddons(int actorId, int packageId) + { + return SqlHelper.ExecuteDataset(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetPackageAddons", + new SqlParameter("@actorId", actorId), + new SqlParameter("@PackageID", packageId)); + } + + public static IDataReader GetPackageAddon(int actorId, int packageAddonId) + { + return SqlHelper.ExecuteReader(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetPackageAddon", + new SqlParameter("@actorId", actorId), + new SqlParameter("@PackageAddonID", packageAddonId)); + } + + public static DataSet AddPackageAddon(int actorId, out int addonId, int packageId, int planId, int quantity, + int statusId, DateTime purchaseDate, string comments) + { + SqlParameter prmPackageAddonId = new SqlParameter("@PackageAddonID", SqlDbType.Int); + prmPackageAddonId.Direction = ParameterDirection.Output; + + DataSet ds = SqlHelper.ExecuteDataset(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "AddPackageAddon", + prmPackageAddonId, + new SqlParameter("@actorId", actorId), + new SqlParameter("@PackageID", packageId), + new SqlParameter("@planId", planId), + new SqlParameter("@Quantity", quantity), + new SqlParameter("@statusId", statusId), + new SqlParameter("@PurchaseDate", purchaseDate), + new SqlParameter("@Comments", comments)); + + // read identity + addonId = Convert.ToInt32(prmPackageAddonId.Value); + + return ds; + } + + public static DataSet UpdatePackageAddon(int actorId, int packageAddonId, int planId, int quantity, + int statusId, DateTime purchaseDate, string comments) + { + return SqlHelper.ExecuteDataset(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "UpdatePackageAddon", + new SqlParameter("@actorId", actorId), + new SqlParameter("@PackageAddonID", packageAddonId), + new SqlParameter("@planId", planId), + new SqlParameter("@Quantity", quantity), + new SqlParameter("@statusId", statusId), + new SqlParameter("@PurchaseDate", purchaseDate), + new SqlParameter("@Comments", comments)); + } + + public static void DeletePackageAddon(int actorId, int packageAddonId) + { + SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "DeletePackageAddon", + new SqlParameter("@actorId", actorId), + new SqlParameter("@PackageAddonID", packageAddonId)); + } + + #endregion + + #region Packages Settings + public static IDataReader GetPackageSettings(int actorId, int packageId, string settingsName) + { + return SqlHelper.ExecuteReader(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetPackageSettings", + new SqlParameter("@ActorId", actorId), + new SqlParameter("@PackageId", packageId), + new SqlParameter("@SettingsName", settingsName)); + } + public static void UpdatePackageSettings(int actorId, int packageId, string settingsName, string xml) + { + SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "UpdatePackageSettings", + new SqlParameter("@PackageId", packageId), + new SqlParameter("@ActorId", actorId), + new SqlParameter("@SettingsName", settingsName), + new SqlParameter("@Xml", xml)); + } + #endregion + + #region Quotas + public static IDataReader GetProviderServiceQuota(int providerId) + { + return SqlHelper.ExecuteReader(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetProviderServiceQuota", + new SqlParameter("@providerId", providerId)); + } + + public static IDataReader GetPackageQuota(int actorId, int packageId, string quotaName) + { + return SqlHelper.ExecuteReader(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetPackageQuota", + new SqlParameter("@ActorId", actorId), + new SqlParameter("@PackageID", packageId), + new SqlParameter("@QuotaName", quotaName)); + } + #endregion + + #region Log + public static void AddAuditLogRecord(string recordId, int severityId, + int userId, string username, int packageId, int itemId, string itemName, DateTime startDate, DateTime finishDate, string sourceName, + string taskName, string executionLog) + { + SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "AddAuditLogRecord", + new SqlParameter("@recordId", recordId), + new SqlParameter("@severityId", severityId), + new SqlParameter("@UserID", userId), + new SqlParameter("@username", username), + new SqlParameter("@PackageID", packageId), + new SqlParameter("@ItemId", itemId), + new SqlParameter("@itemName", itemName), + new SqlParameter("@startDate", startDate), + new SqlParameter("@finishDate", finishDate), + new SqlParameter("@sourceName", sourceName), + new SqlParameter("@taskName", taskName), + new SqlParameter("@executionLog", executionLog)); + } + + public static DataSet GetAuditLogRecordsPaged(int actorId, int userId, int packageId, int itemId, string itemName, DateTime startDate, DateTime endDate, + int severityId, string sourceName, string taskName, string sortColumn, int startRow, int maximumRows) + { + return SqlHelper.ExecuteDataset(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetAuditLogRecordsPaged", + new SqlParameter("@ActorId", actorId), + new SqlParameter("@UserID", userId), + new SqlParameter("@PackageID", packageId), + new SqlParameter("@itemId", itemId), + new SqlParameter("@itemName", itemName), + new SqlParameter("@StartDate", startDate), + new SqlParameter("@EndDate", endDate), + new SqlParameter("@severityId", severityId), + new SqlParameter("@sourceName", sourceName), + new SqlParameter("@taskName", taskName), + new SqlParameter("@sortColumn", VerifyColumnName(sortColumn)), + new SqlParameter("@startRow", startRow), + new SqlParameter("@maximumRows", maximumRows)); + } + + public static DataSet GetAuditLogSources() + { + return SqlHelper.ExecuteDataset(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetAuditLogSources"); + } + + public static DataSet GetAuditLogTasks(string sourceName) + { + return SqlHelper.ExecuteDataset(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetAuditLogTasks", + new SqlParameter("@sourceName", sourceName)); + } + + public static IDataReader GetAuditLogRecord(string recordId) + { + return SqlHelper.ExecuteReader(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetAuditLogRecord", + new SqlParameter("@recordId", recordId)); + } + + public static void DeleteAuditLogRecords(int actorId, int userId, int itemId, string itemName, DateTime startDate, DateTime endDate, + int severityId, string sourceName, string taskName) + { + SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "DeleteAuditLogRecords", + new SqlParameter("@actorId", actorId), + new SqlParameter("@userId", userId), + new SqlParameter("@itemId", itemId), + new SqlParameter("@itemName", itemName), + new SqlParameter("@startDate", startDate), + new SqlParameter("@endDate", endDate), + new SqlParameter("@severityId", severityId), + new SqlParameter("@sourceName", sourceName), + new SqlParameter("@taskName", taskName)); + } + + public static void DeleteAuditLogRecordsComplete() + { + SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "DeleteAuditLogRecordsComplete"); + } + + #endregion + + #region Reports + public static DataSet GetPackagesBandwidthPaged(int actorId, int userId, int packageId, + DateTime startDate, DateTime endDate, string sortColumn, + int startRow, int maximumRows) + { + return ExecuteLongDataSet( + ObjectQualifier + "GetPackagesBandwidthPaged", + new SqlParameter("@actorId", actorId), + new SqlParameter("@userId", userId), + new SqlParameter("@packageId", packageId), + new SqlParameter("@StartDate", startDate), + new SqlParameter("@EndDate", endDate), + new SqlParameter("@sortColumn", VerifyColumnName(sortColumn)), + new SqlParameter("@startRow", startRow), + new SqlParameter("@maximumRows", maximumRows)); + } + + public static DataSet GetPackagesDiskspacePaged(int actorId, int userId, int packageId, string sortColumn, + int startRow, int maximumRows) + { + return ExecuteLongDataSet( + ObjectQualifier + "GetPackagesDiskspacePaged", + new SqlParameter("@actorId", actorId), + new SqlParameter("@userId", userId), + new SqlParameter("@packageId", packageId), + new SqlParameter("@sortColumn", VerifyColumnName(sortColumn)), + new SqlParameter("@startRow", startRow), + new SqlParameter("@maximumRows", maximumRows)); + } + + public static DataSet GetPackageBandwidth(int actorId, int packageId, DateTime startDate, DateTime endDate) + { + return ExecuteLongDataSet( + ObjectQualifier + "GetPackageBandwidth", + new SqlParameter("@actorId", actorId), + new SqlParameter("@PackageId", packageId), + new SqlParameter("@StartDate", startDate), + new SqlParameter("@EndDate", endDate)); + } + + public static DataSet GetPackageDiskspace(int actorId, int packageId) + { + return ExecuteLongDataSet( + ObjectQualifier + "GetPackageDiskspace", + new SqlParameter("@actorId", actorId), + new SqlParameter("@PackageId", packageId)); + } + + #endregion + + #region Scheduler + + public static IDataReader GetBackgroundTask(string taskId) + { + return SqlHelper.ExecuteReader(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetBackgroundTask", + new SqlParameter("@taskId", taskId)); + } + + public static IDataReader GetScheduleBackgroundTasks(int scheduleId) + { + return SqlHelper.ExecuteReader(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetScheduleBackgroundTasks", + new SqlParameter("@scheduleId", scheduleId)); + } + + public static IDataReader GetBackgroundTasks(int actorId) + { + return SqlHelper.ExecuteReader(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetBackgroundTasks", + new SqlParameter("@actorId", actorId)); + } + + public static IDataReader GetBackgroundTasks(Guid guid) + { + return SqlHelper.ExecuteReader(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetThreadBackgroundTasks", + new SqlParameter("@guid", guid)); + } + + public static IDataReader GetProcessBackgroundTasks(BackgroundTaskStatus status) + { + return SqlHelper.ExecuteReader(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetProcessBackgroundTasks", + new SqlParameter("@status", (int)status)); + } + + public static IDataReader GetBackgroundTopTask(Guid guid) + { + return SqlHelper.ExecuteReader(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetBackgroundTopTask", + new SqlParameter("@guid", guid)); + } + + public static int AddBackgroundTask(Guid guid, string taskId, int scheduleId, int packageId, int userId, + int effectiveUserId, string taskName, int itemId, string itemName, DateTime startDate, + int indicatorCurrent, int indicatorMaximum, int maximumExecutionTime, string source, + int severity, bool completed, bool notifyOnComplete, BackgroundTaskStatus status) + { + SqlParameter prmId = new SqlParameter("@BackgroundTaskID", SqlDbType.Int); + prmId.Direction = ParameterDirection.Output; + + SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "AddBackgroundTask", + prmId, + new SqlParameter("@guid", guid), + new SqlParameter("@taskId", taskId), + new SqlParameter("@scheduleId", scheduleId), + new SqlParameter("@packageId", packageId), + new SqlParameter("@userId", userId), + new SqlParameter("@effectiveUserId", effectiveUserId), + new SqlParameter("@taskName", taskName), + new SqlParameter("@itemId", itemId), + new SqlParameter("@itemName", itemName), + new SqlParameter("@startDate", startDate), + new SqlParameter("@indicatorCurrent", indicatorCurrent), + new SqlParameter("@indicatorMaximum", indicatorMaximum), + new SqlParameter("@maximumExecutionTime", maximumExecutionTime), + new SqlParameter("@source", source), + new SqlParameter("@severity", severity), + new SqlParameter("@completed", completed), + new SqlParameter("@notifyOnComplete", notifyOnComplete), + new SqlParameter("@status", status)); + + // read identity + return Convert.ToInt32(prmId.Value); + } + + public static void AddBackgroundTaskLog(int taskId, DateTime date, string exceptionStackTrace, + bool innerTaskStart, int severity, string text, int textIdent, string xmlParameters) + { + SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "AddBackgroundTaskLog", + new SqlParameter("@taskId", taskId), + new SqlParameter("@date", date), + new SqlParameter("@exceptionStackTrace", exceptionStackTrace), + new SqlParameter("@innerTaskStart", innerTaskStart), + new SqlParameter("@severity", severity), + new SqlParameter("@text", text), + new SqlParameter("@textIdent", textIdent), + new SqlParameter("@xmlParameters", xmlParameters)); + } + + public static IDataReader GetBackgroundTaskLogs(int taskId, DateTime startLogTime) + { + return SqlHelper.ExecuteReader(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetBackgroundTaskLogs", + new SqlParameter("@taskId", taskId), + new SqlParameter("@startLogTime", startLogTime)); + } + + public static void UpdateBackgroundTask(Guid guid, int taskId, int scheduleId, int packageId, string taskName, int itemId, + string itemName, DateTime finishDate, int indicatorCurrent, int indicatorMaximum, int maximumExecutionTime, + string source, int severity, bool completed, bool notifyOnComplete, BackgroundTaskStatus status) + { + SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "UpdateBackgroundTask", + new SqlParameter("@Guid", guid), + new SqlParameter("@taskId", taskId), + new SqlParameter("@scheduleId", scheduleId), + new SqlParameter("@packageId", packageId), + new SqlParameter("@taskName", taskName), + new SqlParameter("@itemId", itemId), + new SqlParameter("@itemName", itemName), + new SqlParameter("@finishDate", + finishDate == DateTime.MinValue + ? DBNull.Value + : (object) finishDate), + new SqlParameter("@indicatorCurrent", indicatorCurrent), + new SqlParameter("@indicatorMaximum", indicatorMaximum), + new SqlParameter("@maximumExecutionTime", maximumExecutionTime), + new SqlParameter("@source", source), + new SqlParameter("@severity", severity), + new SqlParameter("@completed", completed), + new SqlParameter("@notifyOnComplete", notifyOnComplete), + new SqlParameter("@status", (int)status)); + + } + + public static IDataReader GetBackgroundTaskParams(int taskId) + { + return SqlHelper.ExecuteReader(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetBackgroundTaskParams", + new SqlParameter("@taskId", taskId)); + } + + public static void AddBackgroundTaskParam(int taskId, string name, string value, string typeName) + { + SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "AddBackgroundTaskParam", + new SqlParameter("@taskId", taskId), + new SqlParameter("@name", name), + new SqlParameter("@value", value), + new SqlParameter("@typeName", typeName)); + } + + public static void DeleteBackgroundTaskParams(int taskId) + { + SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "DeleteBackgroundTaskParams", + new SqlParameter("@taskId", taskId)); + } + + public static void AddBackgroundTaskStack(int taskId) + { + SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "AddBackgroundTaskStack", + new SqlParameter("@taskId", taskId)); + } + + public static void DeleteBackgroundTasks(Guid guid) + { + SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "DeleteBackgroundTasks", + new SqlParameter("@guid", guid)); + } + + public static void DeleteBackgroundTask(int taskId) + { + SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "DeleteBackgroundTask", + new SqlParameter("@id", taskId)); + } + + public static IDataReader GetScheduleTasks(int actorId) + { + return SqlHelper.ExecuteReader(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetScheduleTasks", + new SqlParameter("@actorId", actorId)); + } + + public static IDataReader GetScheduleTask(int actorId, string taskId) + { + return SqlHelper.ExecuteReader(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetScheduleTask", + new SqlParameter("@actorId", actorId), + new SqlParameter("@taskId", taskId)); + } + + public static DataSet GetSchedules(int actorId, int packageId) + { + return SqlHelper.ExecuteDataset(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetSchedules", + new SqlParameter("@actorId", actorId), + new SqlParameter("@packageId", packageId)); + } + + public static DataSet GetSchedulesPaged(int actorId, int packageId, bool recursive, + string filterColumn, string filterValue, string sortColumn, int startRow, int maximumRows) + { + return SqlHelper.ExecuteDataset(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetSchedulesPaged", + new SqlParameter("@actorId", actorId), + new SqlParameter("@packageId", packageId), + new SqlParameter("@recursive", recursive), + new SqlParameter("@FilterColumn", VerifyColumnName(filterColumn)), + new SqlParameter("@FilterValue", VerifyColumnValue(filterValue)), + new SqlParameter("@SortColumn", VerifyColumnName(sortColumn)), + new SqlParameter("@startRow", startRow), + new SqlParameter("@maximumRows", maximumRows)); + } + + public static DataSet GetSchedule(int actorId, int scheduleId) + { + return SqlHelper.ExecuteDataset(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetSchedule", + new SqlParameter("@actorId", actorId), + new SqlParameter("@scheduleId", scheduleId)); + } + public static IDataReader GetScheduleInternal(int scheduleId) + { + return SqlHelper.ExecuteReader(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetScheduleInternal", + new SqlParameter("@scheduleId", scheduleId)); + } + public static DataSet GetNextSchedule() + { + return SqlHelper.ExecuteDataset(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetNextSchedule"); + } + public static IDataReader GetScheduleParameters(int actorId, string taskId, int scheduleId) + { + return SqlHelper.ExecuteReader(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetScheduleParameters", + new SqlParameter("@actorId", actorId), + new SqlParameter("@taskId", taskId), + new SqlParameter("@scheduleId", scheduleId)); + } + + /// + /// Loads view configuration for the task with specified id. + /// + /// Task id which points to task for which view configuration will be loaded. + /// View configuration for the task with supplied id. + public static IDataReader GetScheduleTaskViewConfigurations(string taskId) + { + return SqlHelper.ExecuteReader(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetScheduleTaskViewConfigurations", + new SqlParameter("@taskId", taskId)); + } + + public static int AddSchedule(int actorId, string taskId, int packageId, + string scheduleName, string scheduleTypeId, int interval, + DateTime fromTime, DateTime toTime, DateTime startTime, + DateTime nextRun, bool enabled, string priorityId, int historiesNumber, + int maxExecutionTime, int weekMonthDay, string xmlParameters) + { + SqlParameter prmId = new SqlParameter("@ScheduleID", SqlDbType.Int); + prmId.Direction = ParameterDirection.Output; + + SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "AddSchedule", + prmId, + new SqlParameter("@actorId", actorId), + new SqlParameter("@taskId", taskId), + new SqlParameter("@packageId", packageId), + new SqlParameter("@scheduleName", scheduleName), + new SqlParameter("@scheduleTypeId", scheduleTypeId), + new SqlParameter("@interval", interval), + new SqlParameter("@fromTime", fromTime), + new SqlParameter("@toTime", toTime), + new SqlParameter("@startTime", startTime), + new SqlParameter("@nextRun", nextRun), + new SqlParameter("@enabled", enabled), + new SqlParameter("@priorityId", priorityId), + new SqlParameter("@historiesNumber", historiesNumber), + new SqlParameter("@maxExecutionTime", maxExecutionTime), + new SqlParameter("@weekMonthDay", weekMonthDay), + new SqlParameter("@xmlParameters", xmlParameters)); + + // read identity + return Convert.ToInt32(prmId.Value); + } + + public static void UpdateSchedule(int actorId, int scheduleId, string taskId, + string scheduleName, string scheduleTypeId, int interval, + DateTime fromTime, DateTime toTime, DateTime startTime, + DateTime lastRun, DateTime nextRun, bool enabled, string priorityId, + int historiesNumber, int maxExecutionTime, int weekMonthDay, string xmlParameters) + { + SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "UpdateSchedule", + new SqlParameter("@actorId", actorId), + new SqlParameter("@scheduleId", scheduleId), + new SqlParameter("@taskId", taskId), + new SqlParameter("@scheduleName", scheduleName), + new SqlParameter("@scheduleTypeId", scheduleTypeId), + new SqlParameter("@interval", interval), + new SqlParameter("@fromTime", fromTime), + new SqlParameter("@toTime", toTime), + new SqlParameter("@startTime", startTime), + new SqlParameter("@lastRun", (lastRun == DateTime.MinValue) ? DBNull.Value : (object)lastRun), + new SqlParameter("@nextRun", nextRun), + new SqlParameter("@enabled", enabled), + new SqlParameter("@priorityId", priorityId), + new SqlParameter("@historiesNumber", historiesNumber), + new SqlParameter("@maxExecutionTime", maxExecutionTime), + new SqlParameter("@weekMonthDay", weekMonthDay), + new SqlParameter("@xmlParameters", xmlParameters)); + } + + public static void DeleteSchedule(int actorId, int scheduleId) + { + SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "DeleteSchedule", + new SqlParameter("@actorId", actorId), + new SqlParameter("@scheduleId", scheduleId)); + } + + public static DataSet GetScheduleHistories(int actorId, int scheduleId) + { + return SqlHelper.ExecuteDataset(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetScheduleHistories", + new SqlParameter("@actorId", actorId), + new SqlParameter("@scheduleId", scheduleId)); + } + public static IDataReader GetScheduleHistory(int actorId, int scheduleHistoryId) + { + return SqlHelper.ExecuteReader(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetScheduleHistory", + new SqlParameter("@actorId", actorId), + new SqlParameter("@scheduleHistoryId", scheduleHistoryId)); + } + public static int AddScheduleHistory(int actorId, int scheduleId, + DateTime startTime, DateTime finishTime, string statusId, string executionLog) + { + SqlParameter prmId = new SqlParameter("@ScheduleHistoryID", SqlDbType.Int); + prmId.Direction = ParameterDirection.Output; + + SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "AddScheduleHistory", + prmId, + new SqlParameter("@actorId", actorId), + new SqlParameter("@scheduleId", scheduleId), + new SqlParameter("@startTime", (startTime == DateTime.MinValue) ? DBNull.Value : (object)startTime), + new SqlParameter("@finishTime", (finishTime == DateTime.MinValue) ? DBNull.Value : (object)finishTime), + new SqlParameter("@statusId", statusId), + new SqlParameter("@executionLog", executionLog)); + + // read identity + return Convert.ToInt32(prmId.Value); + } + public static void UpdateScheduleHistory(int actorId, int scheduleHistoryId, + DateTime startTime, DateTime finishTime, string statusId, string executionLog) + { + SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "UpdateScheduleHistory", + new SqlParameter("@actorId", actorId), + new SqlParameter("@scheduleHistoryId", scheduleHistoryId), + new SqlParameter("@startTime", (startTime == DateTime.MinValue) ? DBNull.Value : (object)startTime), + new SqlParameter("@finishTime", (finishTime == DateTime.MinValue) ? DBNull.Value : (object)finishTime), + new SqlParameter("@statusId", statusId), + new SqlParameter("@executionLog", executionLog)); + } + public static void DeleteScheduleHistories(int actorId, int scheduleId) + { + SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "DeleteScheduleHistories", + new SqlParameter("@actorId", actorId), + new SqlParameter("@scheduleId", scheduleId)); + } + #endregion + + #region Comments + public static DataSet GetComments(int actorId, int userId, string itemTypeId, int itemId) + { + return SqlHelper.ExecuteDataset(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetComments", + new SqlParameter("@actorId", actorId), + new SqlParameter("@userId", userId), + new SqlParameter("@itemTypeId", itemTypeId), + new SqlParameter("@itemId", itemId)); + } + + public static void AddComment(int actorId, string itemTypeId, int itemId, + string commentText, int severityId) + { + SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "AddComment", + new SqlParameter("@actorId", actorId), + new SqlParameter("@itemTypeId", itemTypeId), + new SqlParameter("@itemId", itemId), + new SqlParameter("@commentText", commentText), + new SqlParameter("@severityId", severityId)); + } + + public static void DeleteComment(int actorId, int commentId) + { + SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "DeleteComment", + new SqlParameter("@actorId", actorId), + new SqlParameter("@commentId", commentId)); + } + #endregion + + #region Helper Methods + private static string VerifyColumnName(string str) + { + if (str == null) + str = ""; + return Regex.Replace(str, @"[^\w\. ]", ""); + } + + private static string VerifyColumnValue(string str) + { + return String.IsNullOrEmpty(str) ? str : str.Replace("'", "''"); + } + + private static DataSet ExecuteLongDataSet(string spName, params SqlParameter[] parameters) + { + return ExecuteLongDataSet(spName, CommandType.StoredProcedure, parameters); + } + + private static DataSet ExecuteLongQueryDataSet(string spName, params SqlParameter[] parameters) + { + return ExecuteLongDataSet(spName, CommandType.Text, parameters); + } + + private static DataSet ExecuteLongDataSet(string commandText, CommandType commandType, params SqlParameter[] parameters) + { + SqlConnection conn = new SqlConnection(ConnectionString); + SqlCommand cmd = new SqlCommand(commandText, conn); + cmd.CommandType = commandType; + cmd.CommandTimeout = 300; + + if (parameters != null) + { + foreach (SqlParameter prm in parameters) + { + cmd.Parameters.Add(prm); + } + } + + DataSet ds = new DataSet(); + try + { + SqlDataAdapter da = new SqlDataAdapter(cmd); + da.Fill(ds); + } + finally + { + if (conn.State == ConnectionState.Open) + conn.Close(); + } + + return ds; + } + + private static void ExecuteLongNonQuery(string spName, params SqlParameter[] parameters) + { + SqlConnection conn = new SqlConnection(ConnectionString); + SqlCommand cmd = new SqlCommand(spName, conn); + cmd.CommandType = CommandType.StoredProcedure; + cmd.CommandTimeout = 300; + + if (parameters != null) + { + foreach (SqlParameter prm in parameters) + { + cmd.Parameters.Add(prm); + } + } + + try + { + conn.Open(); + cmd.ExecuteNonQuery(); + } + finally + { + if (conn.State == ConnectionState.Open) + conn.Close(); + } + } + #endregion + + #region Exchange Server + + + public static int AddExchangeAccount(int itemId, int accountType, string accountName, + string displayName, string primaryEmailAddress, bool mailEnabledPublicFolder, + string mailboxManagerActions, string samAccountName, string accountPassword, int mailboxPlanId, string subscriberNumber) + { + SqlParameter outParam = new SqlParameter("@AccountID", SqlDbType.Int); + outParam.Direction = ParameterDirection.Output; + + SqlHelper.ExecuteNonQuery( + ConnectionString, + CommandType.StoredProcedure, + "AddExchangeAccount", + outParam, + new SqlParameter("@ItemID", itemId), + new SqlParameter("@AccountType", accountType), + new SqlParameter("@AccountName", accountName), + new SqlParameter("@DisplayName", displayName), + new SqlParameter("@PrimaryEmailAddress", primaryEmailAddress), + new SqlParameter("@MailEnabledPublicFolder", mailEnabledPublicFolder), + new SqlParameter("@MailboxManagerActions", mailboxManagerActions), + new SqlParameter("@SamAccountName", samAccountName), + new SqlParameter("@AccountPassword", accountPassword), + new SqlParameter("@MailboxPlanId", (mailboxPlanId == 0) ? (object)DBNull.Value : (object)mailboxPlanId), + new SqlParameter("@SubscriberNumber", (string.IsNullOrEmpty(subscriberNumber) ? (object)DBNull.Value : (object)subscriberNumber)) + ); + + return Convert.ToInt32(outParam.Value); + } + + + public static void AddExchangeAccountEmailAddress(int accountId, string emailAddress) + { + SqlHelper.ExecuteNonQuery( + ConnectionString, + CommandType.StoredProcedure, + "AddExchangeAccountEmailAddress", + new SqlParameter("@AccountID", accountId), + new SqlParameter("@EmailAddress", emailAddress) + ); + } + + public static void AddExchangeOrganization(int itemId, string organizationId) + { + SqlHelper.ExecuteNonQuery( + ConnectionString, + CommandType.StoredProcedure, + "AddExchangeOrganization", + new SqlParameter("@ItemID", itemId), + new SqlParameter("@OrganizationID", organizationId) + ); + } + + public static void AddExchangeOrganizationDomain(int itemId, int domainId, bool isHost) + { + SqlHelper.ExecuteNonQuery( + ConnectionString, + CommandType.StoredProcedure, + "AddExchangeOrganizationDomain", + new SqlParameter("@ItemID", itemId), + new SqlParameter("@DomainID", domainId), + new SqlParameter("@IsHost", isHost) + ); + } + + public static void ChangeExchangeAcceptedDomainType(int itemId, int domainId, int domainTypeId) + { + SqlHelper.ExecuteNonQuery( + ConnectionString, + CommandType.StoredProcedure, + "ChangeExchangeAcceptedDomainType", + new SqlParameter("@ItemID", itemId), + new SqlParameter("@DomainID", domainId), + new SqlParameter("@DomainTypeID", domainTypeId) + ); + } + + public static IDataReader GetExchangeOrganizationStatistics(int itemId) + { + return SqlHelper.ExecuteReader( + ConnectionString, + CommandType.StoredProcedure, + "GetExchangeOrganizationStatistics", + new SqlParameter("@ItemID", itemId) + ); + } + + public static void DeleteUserEmailAddresses(int accountId, string primaryAddress) + { + SqlHelper.ExecuteNonQuery( + ConnectionString, + CommandType.StoredProcedure, + "DeleteUserEmailAddresses", + new SqlParameter("@AccountID", accountId), + new SqlParameter("@PrimaryEmailAddress", primaryAddress) + ); + } + + public static void DeleteExchangeAccount(int itemId, int accountId) + { + SqlHelper.ExecuteNonQuery( + ConnectionString, + CommandType.StoredProcedure, + "DeleteExchangeAccount", + new SqlParameter("@ItemID", itemId), + new SqlParameter("@AccountID", accountId) + ); + } + + + public static void DeleteExchangeAccountEmailAddress(int accountId, string emailAddress) + { + SqlHelper.ExecuteNonQuery( + ConnectionString, + CommandType.StoredProcedure, + "DeleteExchangeAccountEmailAddress", + new SqlParameter("@AccountID", accountId), + new SqlParameter("@EmailAddress", emailAddress) + ); + } + + public static void DeleteExchangeOrganization(int itemId) + { + SqlHelper.ExecuteNonQuery( + ConnectionString, + CommandType.StoredProcedure, + "DeleteExchangeOrganization", + new SqlParameter("@ItemID", itemId) + ); + } + + public static void DeleteExchangeOrganizationDomain(int itemId, int domainId) + { + SqlHelper.ExecuteNonQuery( + ConnectionString, + CommandType.StoredProcedure, + "DeleteExchangeOrganizationDomain", + new SqlParameter("@ItemId", itemId), + new SqlParameter("@DomainID", domainId) + ); + } + + public static bool ExchangeAccountEmailAddressExists(string emailAddress) + { + SqlParameter outParam = new SqlParameter("@Exists", SqlDbType.Bit); + outParam.Direction = ParameterDirection.Output; + + SqlHelper.ExecuteNonQuery( + ConnectionString, + CommandType.StoredProcedure, + "ExchangeAccountEmailAddressExists", + new SqlParameter("@EmailAddress", emailAddress), + outParam + ); + + return Convert.ToBoolean(outParam.Value); + } + + public static bool ExchangeOrganizationDomainExists(int domainId) + { + SqlParameter outParam = new SqlParameter("@Exists", SqlDbType.Bit); + outParam.Direction = ParameterDirection.Output; + + SqlHelper.ExecuteNonQuery( + ConnectionString, + CommandType.StoredProcedure, + "ExchangeOrganizationDomainExists", + new SqlParameter("@DomainID", domainId), + outParam + ); + + return Convert.ToBoolean(outParam.Value); + } + + public static bool ExchangeOrganizationExists(string organizationId) + { + SqlParameter outParam = new SqlParameter("@Exists", SqlDbType.Bit); + outParam.Direction = ParameterDirection.Output; + + SqlHelper.ExecuteNonQuery( + ConnectionString, + CommandType.StoredProcedure, + "ExchangeOrganizationExists", + new SqlParameter("@OrganizationID", organizationId), + outParam + ); + + return Convert.ToBoolean(outParam.Value); + } + + public static bool ExchangeAccountExists(string accountName) + { + SqlParameter outParam = new SqlParameter("@Exists", SqlDbType.Bit); + outParam.Direction = ParameterDirection.Output; + + SqlHelper.ExecuteNonQuery( + ConnectionString, + CommandType.StoredProcedure, + "ExchangeAccountExists", + new SqlParameter("@AccountName", accountName), + outParam + ); + + return Convert.ToBoolean(outParam.Value); + } + + public static void UpdateExchangeAccount(int accountId, string accountName, ExchangeAccountType accountType, + string displayName, string primaryEmailAddress, bool mailEnabledPublicFolder, + string mailboxManagerActions, string samAccountName, string accountPassword, int mailboxPlanId, string subscriberNumber) + { + SqlHelper.ExecuteNonQuery( + ConnectionString, + CommandType.StoredProcedure, + "UpdateExchangeAccount", + new SqlParameter("@AccountID", accountId), + new SqlParameter("@AccountName", accountName), + new SqlParameter("@DisplayName", displayName), + new SqlParameter("@AccountType", (int)accountType), + new SqlParameter("@PrimaryEmailAddress", primaryEmailAddress), + new SqlParameter("@MailEnabledPublicFolder", mailEnabledPublicFolder), + new SqlParameter("@MailboxManagerActions", mailboxManagerActions), + new SqlParameter("@Password", string.IsNullOrEmpty(accountPassword) ? (object)DBNull.Value : (object)accountPassword), + new SqlParameter("@SamAccountName", samAccountName), + new SqlParameter("@MailboxPlanId", (mailboxPlanId == 0) ? (object)DBNull.Value : (object)mailboxPlanId), + new SqlParameter("@SubscriberNumber", (string.IsNullOrEmpty(subscriberNumber) ? (object)DBNull.Value : (object)subscriberNumber)) + ); + } + + public static void UpdateExchangeAccountUserPrincipalName(int accountId, string userPrincipalName) + { + SqlHelper.ExecuteNonQuery( + ConnectionString, + CommandType.StoredProcedure, + "UpdateExchangeAccountUserPrincipalName", + new SqlParameter("@AccountID", accountId), + new SqlParameter("@UserPrincipalName", userPrincipalName)); + } + + public static IDataReader GetExchangeAccount(int itemId, int accountId) + { + return SqlHelper.ExecuteReader( + ConnectionString, + CommandType.StoredProcedure, + "GetExchangeAccount", + new SqlParameter("@ItemID", itemId), + new SqlParameter("@AccountID", accountId) + ); + } + + public static IDataReader GetExchangeAccountByAccountName(int itemId, string accountName) + { + return SqlHelper.ExecuteReader( + ConnectionString, + CommandType.StoredProcedure, + "GetExchangeAccountByAccountName", + new SqlParameter("@ItemID", itemId), + new SqlParameter("@AccountName", accountName) + ); + } + + public static IDataReader GetExchangeAccountByMailboxPlanId(int itemId, int MailboxPlanId) + { + return SqlHelper.ExecuteReader( + ConnectionString, + CommandType.StoredProcedure, + "GetExchangeAccountByMailboxPlanId", + new SqlParameter("@ItemID", itemId), + new SqlParameter("@MailboxPlanId", MailboxPlanId) + ); + } + + + public static IDataReader GetExchangeAccountEmailAddresses(int accountId) + { + return SqlHelper.ExecuteReader( + ConnectionString, + CommandType.StoredProcedure, + "GetExchangeAccountEmailAddresses", + new SqlParameter("@AccountID", accountId) + ); + } + + public static IDataReader GetExchangeOrganizationDomains(int itemId) + { + return SqlHelper.ExecuteReader( + ConnectionString, + CommandType.StoredProcedure, + "GetExchangeOrganizationDomains", + new SqlParameter("@ItemID", itemId) + ); + } + + + public static IDataReader GetExchangeAccounts(int itemId, int accountType) + { + return SqlHelper.ExecuteReader( + ConnectionString, + CommandType.StoredProcedure, + "GetExchangeAccounts", + new SqlParameter("@ItemID", itemId), + new SqlParameter("@AccountType", accountType) + ); + } + + public static IDataReader GetExchangeMailboxes(int itemId) + { + return SqlHelper.ExecuteReader( + ConnectionString, + CommandType.StoredProcedure, + "GetExchangeMailboxes", + new SqlParameter("@ItemID", itemId) + ); + } + + public static DataSet GetExchangeAccountsPaged(int actorId, int itemId, string accountTypes, + string filterColumn, string filterValue, string sortColumn, int startRow, int maximumRows) + { + // check input parameters + string[] types = accountTypes.Split(','); + for (int i = 0; i < types.Length; i++) + { + try + { + int type = Int32.Parse(types[i]); + } + catch + { + throw new ArgumentException("Wrong patameter", "accountTypes"); + } + } + + string searchTypes = String.Join(",", types); + + return SqlHelper.ExecuteDataset( + ConnectionString, + CommandType.StoredProcedure, + "GetExchangeAccountsPaged", + new SqlParameter("@ActorID", actorId), + new SqlParameter("@ItemID", itemId), + new SqlParameter("@AccountTypes", searchTypes), + new SqlParameter("@FilterColumn", VerifyColumnName(filterColumn)), + new SqlParameter("@FilterValue", VerifyColumnValue(filterValue)), + new SqlParameter("@SortColumn", VerifyColumnName(sortColumn)), + new SqlParameter("@StartRow", startRow), + new SqlParameter("@MaximumRows", maximumRows) + ); + } + + public static IDataReader SearchExchangeAccounts(int actorId, int itemId, bool includeMailboxes, + bool includeContacts, bool includeDistributionLists, bool includeRooms, bool includeEquipment, + string filterColumn, string filterValue, string sortColumn) + { + return SqlHelper.ExecuteReader( + ConnectionString, + CommandType.StoredProcedure, + "SearchExchangeAccounts", + new SqlParameter("@ActorID", actorId), + new SqlParameter("@ItemID", itemId), + new SqlParameter("@IncludeMailboxes", includeMailboxes), + new SqlParameter("@IncludeContacts", includeContacts), + new SqlParameter("@IncludeDistributionLists", includeDistributionLists), + new SqlParameter("@IncludeRooms", includeRooms), + new SqlParameter("@IncludeEquipment", includeEquipment), + new SqlParameter("@FilterColumn", VerifyColumnName(filterColumn)), + new SqlParameter("@FilterValue", VerifyColumnValue(filterValue)), + new SqlParameter("@SortColumn", VerifyColumnName(sortColumn)) + ); + } + + public static IDataReader SearchExchangeAccount(int actorId, int accountType, string primaryEmailAddress) + { + return SqlHelper.ExecuteReader( + ConnectionString, + CommandType.StoredProcedure, + "SearchExchangeAccount", + new SqlParameter("@ActorID", actorId), + new SqlParameter("@AccountType", accountType), + new SqlParameter("@PrimaryEmailAddress", primaryEmailAddress) + ); + } + + #endregion + + #region Exchange Mailbox Plans + public static int AddExchangeMailboxPlan(int itemID, string mailboxPlan, bool enableActiveSync, bool enableIMAP, bool enableMAPI, bool enableOWA, bool enablePOP, + bool isDefault, int issueWarningPct, int keepDeletedItemsDays, int mailboxSizeMB, int maxReceiveMessageSizeKB, int maxRecipients, + int maxSendMessageSizeKB, int prohibitSendPct, int prohibitSendReceivePct, bool hideFromAddressBook, int mailboxPlanType, + bool enabledLitigationHold, long recoverabelItemsSpace, long recoverabelItemsWarning, string litigationHoldUrl, string litigationHoldMsg) + { + SqlParameter outParam = new SqlParameter("@MailboxPlanId", SqlDbType.Int); + outParam.Direction = ParameterDirection.Output; + + SqlHelper.ExecuteNonQuery( + ConnectionString, + CommandType.StoredProcedure, + "AddExchangeMailboxPlan", + outParam, + new SqlParameter("@ItemID", itemID), + new SqlParameter("@MailboxPlan", mailboxPlan), + new SqlParameter("@EnableActiveSync", enableActiveSync), + new SqlParameter("@EnableIMAP", enableIMAP), + new SqlParameter("@EnableMAPI", enableMAPI), + new SqlParameter("@EnableOWA", enableOWA), + new SqlParameter("@EnablePOP", enablePOP), + new SqlParameter("@IsDefault", isDefault), + new SqlParameter("@IssueWarningPct", issueWarningPct), + new SqlParameter("@KeepDeletedItemsDays", keepDeletedItemsDays), + new SqlParameter("@MailboxSizeMB", mailboxSizeMB), + new SqlParameter("@MaxReceiveMessageSizeKB", maxReceiveMessageSizeKB), + new SqlParameter("@MaxRecipients", maxRecipients), + new SqlParameter("@MaxSendMessageSizeKB", maxSendMessageSizeKB), + new SqlParameter("@ProhibitSendPct", prohibitSendPct), + new SqlParameter("@ProhibitSendReceivePct", prohibitSendReceivePct), + new SqlParameter("@HideFromAddressBook", hideFromAddressBook), + new SqlParameter("@MailboxPlanType", mailboxPlanType), + new SqlParameter("@AllowLitigationHold", enabledLitigationHold), + new SqlParameter("@RecoverableItemsWarningPct", recoverabelItemsWarning), + new SqlParameter("@RecoverableItemsSpace", recoverabelItemsSpace), + new SqlParameter("@LitigationHoldUrl", litigationHoldUrl), + new SqlParameter("@LitigationHoldMsg", litigationHoldMsg) + ); + + return Convert.ToInt32(outParam.Value); + } + + + + public static void UpdateExchangeMailboxPlan(int mailboxPlanID, string mailboxPlan, bool enableActiveSync, bool enableIMAP, bool enableMAPI, bool enableOWA, bool enablePOP, + bool isDefault, int issueWarningPct, int keepDeletedItemsDays, int mailboxSizeMB, int maxReceiveMessageSizeKB, int maxRecipients, + int maxSendMessageSizeKB, int prohibitSendPct, int prohibitSendReceivePct, bool hideFromAddressBook, int mailboxPlanType, + bool enabledLitigationHold, long recoverabelItemsSpace, long recoverabelItemsWarning, string litigationHoldUrl, string litigationHoldMsg) + { + SqlHelper.ExecuteNonQuery( + ConnectionString, + CommandType.StoredProcedure, + "UpdateExchangeMailboxPlan", + new SqlParameter("@MailboxPlanID", mailboxPlanID), + new SqlParameter("@MailboxPlan", mailboxPlan), + new SqlParameter("@EnableActiveSync", enableActiveSync), + new SqlParameter("@EnableIMAP", enableIMAP), + new SqlParameter("@EnableMAPI", enableMAPI), + new SqlParameter("@EnableOWA", enableOWA), + new SqlParameter("@EnablePOP", enablePOP), + new SqlParameter("@IsDefault", isDefault), + new SqlParameter("@IssueWarningPct", issueWarningPct), + new SqlParameter("@KeepDeletedItemsDays", keepDeletedItemsDays), + new SqlParameter("@MailboxSizeMB", mailboxSizeMB), + new SqlParameter("@MaxReceiveMessageSizeKB", maxReceiveMessageSizeKB), + new SqlParameter("@MaxRecipients", maxRecipients), + new SqlParameter("@MaxSendMessageSizeKB", maxSendMessageSizeKB), + new SqlParameter("@ProhibitSendPct", prohibitSendPct), + new SqlParameter("@ProhibitSendReceivePct", prohibitSendReceivePct), + new SqlParameter("@HideFromAddressBook", hideFromAddressBook), + new SqlParameter("@MailboxPlanType", mailboxPlanType), + new SqlParameter("@AllowLitigationHold", enabledLitigationHold), + new SqlParameter("@RecoverableItemsWarningPct", recoverabelItemsWarning), + new SqlParameter("@RecoverableItemsSpace", recoverabelItemsSpace), + new SqlParameter("@LitigationHoldUrl", litigationHoldUrl), + new SqlParameter("@LitigationHoldMsg", litigationHoldMsg) + + ); + } + + + + public static void DeleteExchangeMailboxPlan(int mailboxPlanId) + { + SqlHelper.ExecuteNonQuery( + ConnectionString, + CommandType.StoredProcedure, + "DeleteExchangeMailboxPlan", + new SqlParameter("@MailboxPlanId", mailboxPlanId) + ); + } + + + public static IDataReader GetExchangeMailboxPlan(int mailboxPlanId) + { + return SqlHelper.ExecuteReader( + ConnectionString, + CommandType.StoredProcedure, + "GetExchangeMailboxPlan", + new SqlParameter("@MailboxPlanId", mailboxPlanId) + ); + } + + public static IDataReader GetExchangeMailboxPlans(int itemId) + { + return SqlHelper.ExecuteReader( + ConnectionString, + CommandType.StoredProcedure, + "GetExchangeMailboxPlans", + new SqlParameter("@ItemID", itemId) + ); + } + + + public static IDataReader GetExchangeOrganization(int itemId) + { + return SqlHelper.ExecuteReader( + ConnectionString, + CommandType.StoredProcedure, + "GetExchangeOrganization", + new SqlParameter("@ItemID", itemId) + ); + } + + + public static void SetOrganizationDefaultExchangeMailboxPlan(int itemId, int mailboxPlanId) + { + SqlHelper.ExecuteNonQuery( + ConnectionString, + CommandType.StoredProcedure, + "SetOrganizationDefaultExchangeMailboxPlan", + new SqlParameter("@ItemID", itemId), + new SqlParameter("@MailboxPlanId", mailboxPlanId) + ); + } + + public static void SetExchangeAccountMailboxPlan(int accountId, int mailboxPlanId) + { + SqlHelper.ExecuteNonQuery( + ConnectionString, + CommandType.StoredProcedure, + "SetExchangeAccountMailboxplan", + new SqlParameter("@AccountID", accountId), + new SqlParameter("@MailboxPlanId", (mailboxPlanId == 0) ? (object)DBNull.Value : (object)mailboxPlanId) + ); + } + + #endregion + + #region Exchange Disclaimers + public static int AddExchangeDisclaimer(int itemID, ExchangeDisclaimer disclaimer) + { + SqlParameter outParam = new SqlParameter("@ExchangeDisclaimerId", SqlDbType.Int); + outParam.Direction = ParameterDirection.Output; + + SqlHelper.ExecuteNonQuery( + ConnectionString, + CommandType.StoredProcedure, + "AddExchangeDisclaimer", + outParam, + + new SqlParameter("@ItemID", itemID), + new SqlParameter("@DisclaimerName", disclaimer.DisclaimerName), + new SqlParameter("@DisclaimerText", disclaimer.DisclaimerText) + ); + + return Convert.ToInt32(outParam.Value); + } + + public static void UpdateExchangeDisclaimer(int itemID, ExchangeDisclaimer disclaimer) + { + SqlHelper.ExecuteNonQuery( + ConnectionString, + CommandType.StoredProcedure, + "UpdateExchangeDisclaimer", + new SqlParameter("@ExchangeDisclaimerId", disclaimer.ExchangeDisclaimerId), + new SqlParameter("@DisclaimerName", disclaimer.DisclaimerName), + new SqlParameter("@DisclaimerText", disclaimer.DisclaimerText) + ); + } + + public static void DeleteExchangeDisclaimer(int exchangeDisclaimerId) + { + SqlHelper.ExecuteNonQuery( + ConnectionString, + CommandType.StoredProcedure, + "DeleteExchangeDisclaimer", + new SqlParameter("@ExchangeDisclaimerId", exchangeDisclaimerId) + ); + } + + public static IDataReader GetExchangeDisclaimer(int exchangeDisclaimerId) + { + return SqlHelper.ExecuteReader( + ConnectionString, + CommandType.StoredProcedure, + "GetExchangeDisclaimer", + new SqlParameter("@ExchangeDisclaimerId", exchangeDisclaimerId) + ); + } + + public static IDataReader GetExchangeDisclaimers(int itemId) + { + return SqlHelper.ExecuteReader( + ConnectionString, + CommandType.StoredProcedure, + "GetExchangeDisclaimers", + new SqlParameter("@ItemID", itemId) + ); + } + + public static void SetExchangeAccountDisclaimerId(int AccountID, int ExchangeDisclaimerId) + { + object id = null; + if (ExchangeDisclaimerId != -1) id = ExchangeDisclaimerId; + + SqlHelper.ExecuteNonQuery( + ConnectionString, + CommandType.StoredProcedure, + "SetExchangeAccountDisclaimerId", + new SqlParameter("@AccountID", AccountID), + new SqlParameter("@ExchangeDisclaimerId", id) + ); + } + + public static int GetExchangeAccountDisclaimerId(int AccountID) + { + object objReturn = SqlHelper.ExecuteScalar( + ConnectionString, + CommandType.StoredProcedure, + "GetExchangeAccountDisclaimerId", + new SqlParameter("@AccountID", AccountID) + ); + + int ret; + if (!int.TryParse(objReturn.ToString(), out ret)) return -1; + return ret; + } + + #endregion + + #region Organizations + + public static void DeleteOrganizationUser(int itemId) + { + SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.StoredProcedure, "DeleteOrganizationUsers", new SqlParameter("@ItemID", itemId)); + } + + public static int GetItemIdByOrganizationId(string id) + { + object obj = SqlHelper.ExecuteScalar(ConnectionString, CommandType.StoredProcedure, "GetItemIdByOrganizationId", + new SqlParameter("@OrganizationId", id)); + + return (obj == null || DBNull.Value == obj) ? 0 : (int)obj; + + } + + public static IDataReader GetOrganizationStatistics(int itemId) + { + return SqlHelper.ExecuteReader( + ConnectionString, + CommandType.StoredProcedure, + "GetOrganizationStatistics", + new SqlParameter("@ItemID", itemId) + ); + } + + public static IDataReader SearchOrganizationAccounts(int actorId, int itemId, + string filterColumn, string filterValue, string sortColumn, bool includeMailboxes) + { + return SqlHelper.ExecuteReader( + ConnectionString, + CommandType.StoredProcedure, + "SearchOrganizationAccounts", + new SqlParameter("@ActorID", actorId), + new SqlParameter("@ItemID", itemId), + new SqlParameter("@FilterColumn", VerifyColumnName(filterColumn)), + new SqlParameter("@FilterValue", VerifyColumnValue(filterValue)), + new SqlParameter("@SortColumn", VerifyColumnName(sortColumn)), + new SqlParameter("@IncludeMailboxes", includeMailboxes) + ); + } + + #endregion + + #region CRM + + public static int GetCRMUsersCount(int itemId, string name, string email) + { + SqlParameter[] sqlParams = new SqlParameter[] + { + new SqlParameter("@ItemID", itemId), + GetFilterSqlParam("@Name", name), + GetFilterSqlParam("@Email", email), + }; + + return (int)SqlHelper.ExecuteScalar(ConnectionString, CommandType.StoredProcedure, "GetCRMUsersCount", sqlParams); + + } + + private static SqlParameter GetFilterSqlParam(string paramName, string value) + { + if (string.IsNullOrEmpty(value)) + return new SqlParameter(paramName, DBNull.Value); + + return new SqlParameter(paramName, value); + } + + public static IDataReader GetCrmUsers(int itemId, string sortColumn, string sortDirection, string name, string email, int startRow, int count) + { + SqlParameter[] sqlParams = new SqlParameter[] + { + new SqlParameter("@ItemID", itemId), + new SqlParameter("@SortColumn", sortColumn), + new SqlParameter("@SortDirection", sortDirection), + GetFilterSqlParam("@Name", name), + GetFilterSqlParam("@Email", email), + new SqlParameter("@StartRow", startRow), + new SqlParameter("Count", count) + }; + + + return SqlHelper.ExecuteReader( + ConnectionString, + CommandType.StoredProcedure, + "GetCRMUsers", sqlParams); + } + + public static IDataReader GetCRMOrganizationUsers(int itemId) + { + return SqlHelper.ExecuteReader(ConnectionString, CommandType.StoredProcedure, "GetCRMOrganizationUsers", + new SqlParameter[] { new SqlParameter("@ItemID", itemId) }); + } + + public static void CreateCRMUser(int itemId, Guid crmId, Guid businessUnitId) + { + SqlHelper.ExecuteReader(ConnectionString, CommandType.StoredProcedure, "InsertCRMUser", + new SqlParameter[] + { + new SqlParameter("@ItemID", itemId), + new SqlParameter("@CrmUserID", crmId), + new SqlParameter("@BusinessUnitId", businessUnitId) + }); + + } + + + public static IDataReader GetCrmUser(int itemId) + { + IDataReader reader = SqlHelper.ExecuteReader(ConnectionString, CommandType.StoredProcedure, "GetCRMUser", + new SqlParameter[] + { + new SqlParameter("@AccountID", itemId) + }); + return reader; + + } + + public static int GetCrmUserCount(int itemId) + { + return (int)SqlHelper.ExecuteScalar(ConnectionString, CommandType.StoredProcedure, "GetOrganizationCRMUserCount", + new SqlParameter[] { new SqlParameter("@ItemID", itemId) }); + } + + public static void DeleteCrmOrganization(int organizationId) + { + SqlHelper.ExecuteScalar(ConnectionString, CommandType.StoredProcedure, "DeleteCRMOrganization", + new SqlParameter[] { new SqlParameter("@ItemID", organizationId) }); + } + + #endregion + + #region VPS - Virtual Private Servers + + public static IDataReader GetVirtualMachinesPaged(int actorId, int packageId, string filterColumn, string filterValue, + string sortColumn, int startRow, int maximumRows, bool recursive) + { + IDataReader reader = SqlHelper.ExecuteReader(ConnectionString, CommandType.StoredProcedure, + "GetVirtualMachinesPaged", + new SqlParameter("@ActorID", actorId), + new SqlParameter("@PackageID", packageId), + new SqlParameter("@FilterColumn", VerifyColumnName(filterColumn)), + new SqlParameter("@FilterValue", VerifyColumnValue(filterValue)), + new SqlParameter("@SortColumn", VerifyColumnName(sortColumn)), + new SqlParameter("@StartRow", startRow), + new SqlParameter("@MaximumRows", maximumRows), + new SqlParameter("@Recursive", recursive)); + return reader; + } + #endregion + + public static IDataReader GetVirtualMachinesForPCPaged(int actorId, int packageId, string filterColumn, string filterValue, + string sortColumn, int startRow, int maximumRows, bool recursive) + { + IDataReader reader = SqlHelper.ExecuteReader(ConnectionString, CommandType.StoredProcedure, + "GetVirtualMachinesPagedForPC", + new SqlParameter("@ActorID", actorId), + new SqlParameter("@PackageID", packageId), + new SqlParameter("@FilterColumn", VerifyColumnName(filterColumn)), + new SqlParameter("@FilterValue", VerifyColumnValue(filterValue)), + new SqlParameter("@SortColumn", VerifyColumnName(sortColumn)), + new SqlParameter("@StartRow", startRow), + new SqlParameter("@MaximumRows", maximumRows), + new SqlParameter("@Recursive", recursive)); + return reader; + } + + + #region VPS - External Network + + public static IDataReader GetUnallottedIPAddresses(int packageId, int serviceId, int poolId) + { + return SqlHelper.ExecuteReader(ConnectionString, CommandType.StoredProcedure, + "GetUnallottedIPAddresses", + new SqlParameter("@PackageId", packageId), + new SqlParameter("@ServiceId", serviceId), + new SqlParameter("@PoolId", poolId)); + } + + + public static void AllocatePackageIPAddresses(int packageId, string xml) + { + SqlParameter[] param = new[] + { + new SqlParameter("@PackageID", packageId), + new SqlParameter("@xml", xml) + }; + + ExecuteLongNonQuery("AllocatePackageIPAddresses", param); + } + + public static IDataReader GetPackageIPAddresses(int packageId, int poolId, string filterColumn, string filterValue, + string sortColumn, int startRow, int maximumRows, bool recursive) + { + IDataReader reader = SqlHelper.ExecuteReader(ConnectionString, CommandType.StoredProcedure, + "GetPackageIPAddresses", + new SqlParameter("@PackageID", packageId), + new SqlParameter("@PoolId", poolId), + new SqlParameter("@FilterColumn", VerifyColumnName(filterColumn)), + new SqlParameter("@FilterValue", VerifyColumnValue(filterValue)), + new SqlParameter("@SortColumn", VerifyColumnName(sortColumn)), + new SqlParameter("@startRow", startRow), + new SqlParameter("@maximumRows", maximumRows), + new SqlParameter("@Recursive", recursive)); + return reader; + } + + + public static void DeallocatePackageIPAddress(int id) + { + SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.StoredProcedure, "DeallocatePackageIPAddress", + new SqlParameter("@PackageAddressID", id)); + } + #endregion + + #region VPS - Private Network + + public static IDataReader GetPackagePrivateIPAddressesPaged(int packageId, string filterColumn, string filterValue, + string sortColumn, int startRow, int maximumRows) + { + IDataReader reader = SqlHelper.ExecuteReader(ConnectionString, CommandType.StoredProcedure, + "GetPackagePrivateIPAddressesPaged", + new SqlParameter("@PackageID", packageId), + new SqlParameter("@FilterColumn", VerifyColumnName(filterColumn)), + new SqlParameter("@FilterValue", VerifyColumnValue(filterValue)), + new SqlParameter("@SortColumn", VerifyColumnName(sortColumn)), + new SqlParameter("@startRow", startRow), + new SqlParameter("@maximumRows", maximumRows)); + return reader; + } + + public static IDataReader GetPackagePrivateIPAddresses(int packageId) + { + IDataReader reader = SqlHelper.ExecuteReader(ConnectionString, CommandType.StoredProcedure, + "GetPackagePrivateIPAddresses", + new SqlParameter("@PackageID", packageId)); + return reader; + } + #endregion + + #region VPS - External Network Adapter + public static IDataReader GetPackageUnassignedIPAddresses(int actorId, int packageId, int poolId) + { + return SqlHelper.ExecuteReader(ConnectionString, CommandType.StoredProcedure, + "GetPackageUnassignedIPAddresses", + new SqlParameter("@ActorID", actorId), + new SqlParameter("@PackageID", packageId), + new SqlParameter("@PoolId", poolId)); + } + + public static IDataReader GetPackageIPAddress(int packageAddressId) + { + return SqlHelper.ExecuteReader(ConnectionString, CommandType.StoredProcedure, + "GetPackageIPAddress", + new SqlParameter("@PackageAddressId", packageAddressId)); + } + + public static IDataReader GetItemIPAddresses(int actorId, int itemId, int poolId) + { + return SqlHelper.ExecuteReader(ConnectionString, CommandType.StoredProcedure, + "GetItemIPAddresses", + new SqlParameter("@ActorID", actorId), + new SqlParameter("@ItemID", itemId), + new SqlParameter("@PoolID", poolId)); + } + + public static int AddItemIPAddress(int actorId, int itemId, int packageAddressId) + { + return SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.StoredProcedure, + "AddItemIPAddress", + new SqlParameter("@ActorID", actorId), + new SqlParameter("@ItemID", itemId), + new SqlParameter("@PackageAddressID", packageAddressId)); + } + + public static int SetItemPrimaryIPAddress(int actorId, int itemId, int packageAddressId) + { + return SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.StoredProcedure, + "SetItemPrimaryIPAddress", + new SqlParameter("@ActorID", actorId), + new SqlParameter("@ItemID", itemId), + new SqlParameter("@PackageAddressID", packageAddressId)); + } + + public static int DeleteItemIPAddress(int actorId, int itemId, int packageAddressId) + { + return SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.StoredProcedure, + "DeleteItemIPAddress", + new SqlParameter("@ActorID", actorId), + new SqlParameter("@ItemID", itemId), + new SqlParameter("@PackageAddressID", packageAddressId)); + } + + public static int DeleteItemIPAddresses(int actorId, int itemId) + { + return SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.StoredProcedure, + "DeleteItemIPAddresses", + new SqlParameter("@ActorID", actorId), + new SqlParameter("@ItemID", itemId)); + } + #endregion + + #region VPS - Private Network Adapter + public static IDataReader GetItemPrivateIPAddresses(int actorId, int itemId) + { + return SqlHelper.ExecuteReader(ConnectionString, CommandType.StoredProcedure, + "GetItemPrivateIPAddresses", + new SqlParameter("@ActorID", actorId), + new SqlParameter("@ItemID", itemId)); + } + + public static int AddItemPrivateIPAddress(int actorId, int itemId, string ipAddress) + { + return SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.StoredProcedure, + "AddItemPrivateIPAddress", + new SqlParameter("@ActorID", actorId), + new SqlParameter("@ItemID", itemId), + new SqlParameter("@IPAddress", ipAddress)); + } + + public static int SetItemPrivatePrimaryIPAddress(int actorId, int itemId, int privateAddressId) + { + return SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.StoredProcedure, + "SetItemPrivatePrimaryIPAddress", + new SqlParameter("@ActorID", actorId), + new SqlParameter("@ItemID", itemId), + new SqlParameter("@PrivateAddressID", privateAddressId)); + } + + public static int DeleteItemPrivateIPAddress(int actorId, int itemId, int privateAddressId) + { + return SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.StoredProcedure, + "DeleteItemPrivateIPAddress", + new SqlParameter("@ActorID", actorId), + new SqlParameter("@ItemID", itemId), + new SqlParameter("@PrivateAddressID", privateAddressId)); + } + + public static int DeleteItemPrivateIPAddresses(int actorId, int itemId) + { + return SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.StoredProcedure, + "DeleteItemPrivateIPAddresses", + new SqlParameter("@ActorID", actorId), + new SqlParameter("@ItemID", itemId)); + } + #endregion + + #region BlackBerry + + public static void AddBlackBerryUser(int accountId) + { + SqlHelper.ExecuteNonQuery(ConnectionString, + CommandType.StoredProcedure, + "AddBlackBerryUser", + new[] + { + new SqlParameter("@AccountID", accountId) + }); + } + + + public static bool CheckBlackBerryUserExists(int accountId) + { + int res = (int)SqlHelper.ExecuteScalar(ConnectionString, CommandType.StoredProcedure, "CheckBlackBerryUserExists", + new SqlParameter("@AccountID", accountId)); + return res > 0; + } + + + public static IDataReader GetBlackBerryUsers(int itemId, string sortColumn, string sortDirection, string name, string email, int startRow, int count) + { + SqlParameter[] sqlParams = new SqlParameter[] + { + new SqlParameter("@ItemID", itemId), + new SqlParameter("@SortColumn", sortColumn), + new SqlParameter("@SortDirection", sortDirection), + GetFilterSqlParam("@Name", name), + GetFilterSqlParam("@Email", email), + new SqlParameter("@StartRow", startRow), + new SqlParameter("Count", count) + }; + + + return SqlHelper.ExecuteReader( + ConnectionString, + CommandType.StoredProcedure, + "GetBlackBerryUsers", sqlParams); + } + + public static int GetBlackBerryUsersCount(int itemId, string name, string email) + { + SqlParameter[] sqlParams = new SqlParameter[] + { + new SqlParameter("@ItemID", itemId), + GetFilterSqlParam("@Name", name), + GetFilterSqlParam("@Email", email), + }; + + return + (int) + SqlHelper.ExecuteScalar(ConnectionString, CommandType.StoredProcedure, "GetBlackBerryUsersCount", sqlParams); + } + + public static void DeleteBlackBerryUser(int accountId) + { + SqlHelper.ExecuteNonQuery(ConnectionString, + CommandType.StoredProcedure, + "DeleteBlackBerryUser", + new[] + { + new SqlParameter("@AccountID", accountId) + }); + + } + + #endregion + + #region OCS + + public static void AddOCSUser(int accountId, string instanceId) + { + SqlHelper.ExecuteNonQuery(ConnectionString, + CommandType.StoredProcedure, + "AddOCSUser", + new[] + { + new SqlParameter("@AccountID", accountId), + new SqlParameter("@InstanceID", instanceId) + }); + } + + + public static bool CheckOCSUserExists(int accountId) + { + int res = (int)SqlHelper.ExecuteScalar(ConnectionString, CommandType.StoredProcedure, "CheckOCSUserExists", + new SqlParameter("@AccountID", accountId)); + return res > 0; + } + + + public static IDataReader GetOCSUsers(int itemId, string sortColumn, string sortDirection, string name, string email, int startRow, int count) + { + SqlParameter[] sqlParams = new SqlParameter[] + { + new SqlParameter("@ItemID", itemId), + new SqlParameter("@SortColumn", sortColumn), + new SqlParameter("@SortDirection", sortDirection), + GetFilterSqlParam("@Name", name), + GetFilterSqlParam("@Email", email), + new SqlParameter("@StartRow", startRow), + new SqlParameter("Count", count) + }; + + + return SqlHelper.ExecuteReader( + ConnectionString, + CommandType.StoredProcedure, + "GetOCSUsers", sqlParams); + } + + public static int GetOCSUsersCount(int itemId, string name, string email) + { + SqlParameter[] sqlParams = new SqlParameter[] + { + new SqlParameter("@ItemID", itemId), + GetFilterSqlParam("@Name", name), + GetFilterSqlParam("@Email", email), + }; + + return + (int) + SqlHelper.ExecuteScalar(ConnectionString, CommandType.StoredProcedure, "GetOCSUsersCount", sqlParams); + } + + public static void DeleteOCSUser(string instanceId) + { + SqlHelper.ExecuteNonQuery(ConnectionString, + CommandType.StoredProcedure, + "DeleteOCSUser", + new[] + { + new SqlParameter("@InstanceId", instanceId) + }); + + } + + public static string GetOCSUserInstanceID(int accountId) + { + return (string)SqlHelper.ExecuteScalar(ConnectionString, + CommandType.StoredProcedure, + "GetInstanceID", + new[] + { + new SqlParameter("@AccountID", accountId) + }); + } + + #endregion + + #region SSL + public static int AddSSLRequest(int actorId, int packageId, int siteID, int userID, string friendlyname, string hostname, string csr, int csrLength, string distinguishedName, bool isRenewal, int previousID) + { + SqlParameter prmId = new SqlParameter("@SSLID", SqlDbType.Int); + prmId.Direction = ParameterDirection.Output; + SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "AddSSLRequest", prmId, + new SqlParameter("@ActorId", actorId), + new SqlParameter("@PackageId", packageId), + new SqlParameter("@UserID", userID), + new SqlParameter("@WebSiteID", siteID), + new SqlParameter("@FriendlyName", friendlyname), + new SqlParameter("@HostName", hostname), + new SqlParameter("@CSR", csr), + new SqlParameter("@CSRLength", csrLength), + new SqlParameter("@DistinguishedName", distinguishedName), + new SqlParameter("@IsRenewal", isRenewal), + new SqlParameter("@PreviousId", previousID) + ); + return Convert.ToInt32(prmId.Value); + + } + + public static void CompleteSSLRequest(int actorId, int packageId, int id, string certificate, string distinguishedName, string serialNumber, byte[] hash, DateTime validFrom, DateTime expiryDate) + { + SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "CompleteSSLRequest", + new SqlParameter("@ActorID", actorId), + new SqlParameter("@PackageID", packageId), + new SqlParameter("@ID", id), + new SqlParameter("@DistinguishedName", distinguishedName), + new SqlParameter("@Certificate", certificate), + new SqlParameter("@SerialNumber", serialNumber), + new SqlParameter("@Hash", Convert.ToBase64String(hash)), + new SqlParameter("@ValidFrom", validFrom), + new SqlParameter("@ExpiryDate", expiryDate)); + + } + + public static void AddPFX(int actorId, int packageId, int siteID, int userID, string hostname, string friendlyName, string distinguishedName, int csrLength, string serialNumber, DateTime validFrom, DateTime expiryDate) + { + SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "AddPFX", + new SqlParameter("@ActorId", actorId), + new SqlParameter("@PackageId", packageId), + new SqlParameter("@UserID", userID), + new SqlParameter("@WebSiteID", siteID), + new SqlParameter("@FriendlyName", friendlyName), + new SqlParameter("@HostName", hostname), + new SqlParameter("@CSRLength", csrLength), + new SqlParameter("@DistinguishedName", distinguishedName), + new SqlParameter("@SerialNumber", serialNumber), + new SqlParameter("@ValidFrom", validFrom), + new SqlParameter("@ExpiryDate", expiryDate)); + + } + + public static DataSet GetSSL(int actorId, int packageId, int id) + { + return SqlHelper.ExecuteDataset(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetSSL", + new SqlParameter("@SSLID", id)); + + } + + public static DataSet GetCertificatesForSite(int actorId, int packageId, int siteId) + { + return SqlHelper.ExecuteDataset(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetCertificatesForSite", + new SqlParameter("@ActorId", actorId), + new SqlParameter("@PackageId", packageId), + new SqlParameter("@websiteid", siteId)); + + } + + public static DataSet GetPendingCertificates(int actorId, int packageId, int id, bool recursive) + { + return SqlHelper.ExecuteDataset(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetPendingSSLForWebsite", + new SqlParameter("@ActorId", actorId), + new SqlParameter("@PackageId", packageId), + new SqlParameter("@websiteid", id), + new SqlParameter("@Recursive", recursive)); + + } + + public static IDataReader GetSSLCertificateByID(int actorId, int id) + { + return SqlHelper.ExecuteReader(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetSSLCertificateByID", + new SqlParameter("@ActorId", actorId), + new SqlParameter("@ID", id)); + } + + public static int CheckSSL(int siteID, bool renewal) + { + SqlParameter prmId = new SqlParameter("@Result", SqlDbType.Int); + prmId.Direction = ParameterDirection.Output; + + SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "CheckSSL", + prmId, + new SqlParameter("@siteID", siteID), + new SqlParameter("@Renewal", renewal)); + + return Convert.ToInt32(prmId.Value); + } + + public static IDataReader GetSiteCert(int actorId, int siteID) + { + return SqlHelper.ExecuteReader(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetSSLCertificateByID", + new SqlParameter("@ActorId", actorId), + new SqlParameter("@ID", siteID)); + } + + public static void DeleteCertificate(int actorId, int packageId, int id) + { + SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "DeleteCertificate", + new SqlParameter("@ActorID", actorId), + new SqlParameter("@PackageID", packageId), + new SqlParameter("@id", id)); + } + + public static bool CheckSSLExistsForWebsite(int siteId) + { + SqlParameter prmId = new SqlParameter("@Result", SqlDbType.Bit); + prmId.Direction = ParameterDirection.Output; + SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "CheckSSLExistsForWebsite", prmId, + new SqlParameter("@siteID", siteId), + new SqlParameter("@SerialNumber", "")); + return Convert.ToBoolean(prmId.Value); + } + #endregion + + #region Lync + + public static void AddLyncUser(int accountId, int lyncUserPlanId, string sipAddress) + { + SqlHelper.ExecuteNonQuery(ConnectionString, + CommandType.StoredProcedure, + "AddLyncUser", + new[] + { + new SqlParameter("@AccountID", accountId), + new SqlParameter("@LyncUserPlanID", lyncUserPlanId), + new SqlParameter("@SipAddress", sipAddress) + }); + } + + public static void UpdateLyncUser(int accountId, string sipAddress) + { + SqlHelper.ExecuteNonQuery(ConnectionString, + CommandType.StoredProcedure, + "UpdateLyncUser", + new[] + { + new SqlParameter("@AccountID", accountId), + new SqlParameter("@SipAddress", sipAddress) + }); + } + + + public static bool CheckLyncUserExists(int accountId) + { + int res = (int)SqlHelper.ExecuteScalar(ConnectionString, CommandType.StoredProcedure, "CheckLyncUserExists", + new SqlParameter("@AccountID", accountId)); + return res > 0; + } + + public static bool LyncUserExists(int accountId, string sipAddress) + { + SqlParameter outParam = new SqlParameter("@Exists", SqlDbType.Bit); + outParam.Direction = ParameterDirection.Output; + + SqlHelper.ExecuteNonQuery( + ConnectionString, + CommandType.StoredProcedure, + "LyncUserExists", + new SqlParameter("@AccountID", accountId), + new SqlParameter("@SipAddress", sipAddress), + outParam + ); + + return Convert.ToBoolean(outParam.Value); + } + + + + public static IDataReader GetLyncUsers(int itemId, string sortColumn, string sortDirection, int startRow, int count) + { + SqlParameter[] sqlParams = new SqlParameter[] + { + new SqlParameter("@ItemID", itemId), + new SqlParameter("@SortColumn", sortColumn), + new SqlParameter("@SortDirection", sortDirection), + new SqlParameter("@StartRow", startRow), + new SqlParameter("Count", count) + }; + + + return SqlHelper.ExecuteReader( + ConnectionString, + CommandType.StoredProcedure, + "GetLyncUsers", sqlParams); + } + + + public static IDataReader GetLyncUsersByPlanId(int itemId, int planId) + { + return SqlHelper.ExecuteReader( + ConnectionString, + CommandType.StoredProcedure, + "GetLyncUsersByPlanId", + new SqlParameter("@ItemID", itemId), + new SqlParameter("@PlanId", planId) + ); + } + + public static int GetLyncUsersCount(int itemId) + { + SqlParameter[] sqlParams = new SqlParameter[] + { + new SqlParameter("@ItemID", itemId) + }; + + return + (int) + SqlHelper.ExecuteScalar(ConnectionString, CommandType.StoredProcedure, "GetLyncUsersCount", sqlParams); + } + + public static void DeleteLyncUser(int accountId) + { + SqlHelper.ExecuteNonQuery(ConnectionString, + CommandType.StoredProcedure, + "DeleteLyncUser", + new[] + { + new SqlParameter("@AccountId", accountId) + }); + + } + + public static int AddLyncUserPlan(int itemID, LyncUserPlan lyncUserPlan) + { + SqlParameter outParam = new SqlParameter("@LyncUserPlanId", SqlDbType.Int); + outParam.Direction = ParameterDirection.Output; + + SqlHelper.ExecuteNonQuery( + ConnectionString, + CommandType.StoredProcedure, + "AddLyncUserPlan", + outParam, + + new SqlParameter("@ItemID", itemID), + new SqlParameter("@LyncUserPlanName", lyncUserPlan.LyncUserPlanName), + new SqlParameter("@LyncUserPlanType", lyncUserPlan.LyncUserPlanType), + new SqlParameter("@IM", lyncUserPlan.IM), + new SqlParameter("@Mobility", lyncUserPlan.Mobility), + new SqlParameter("@MobilityEnableOutsideVoice", lyncUserPlan.MobilityEnableOutsideVoice), + new SqlParameter("@Federation", lyncUserPlan.Federation), + new SqlParameter("@Conferencing", lyncUserPlan.Conferencing), + new SqlParameter("@EnterpriseVoice", lyncUserPlan.EnterpriseVoice), + new SqlParameter("@VoicePolicy", lyncUserPlan.VoicePolicy), + new SqlParameter("@IsDefault", lyncUserPlan.IsDefault) + ); + + return Convert.ToInt32(outParam.Value); + } + + + public static void UpdateLyncUserPlan(int itemID, LyncUserPlan lyncUserPlan) + { + SqlHelper.ExecuteNonQuery( + ConnectionString, + CommandType.StoredProcedure, + "UpdateLyncUserPlan", + new SqlParameter("@LyncUserPlanId", lyncUserPlan.LyncUserPlanId), + new SqlParameter("@LyncUserPlanName", lyncUserPlan.LyncUserPlanName), + new SqlParameter("@LyncUserPlanType", lyncUserPlan.LyncUserPlanType), + new SqlParameter("@IM", lyncUserPlan.IM), + new SqlParameter("@Mobility", lyncUserPlan.Mobility), + new SqlParameter("@MobilityEnableOutsideVoice", lyncUserPlan.MobilityEnableOutsideVoice), + new SqlParameter("@Federation", lyncUserPlan.Federation), + new SqlParameter("@Conferencing", lyncUserPlan.Conferencing), + new SqlParameter("@EnterpriseVoice", lyncUserPlan.EnterpriseVoice), + new SqlParameter("@VoicePolicy", lyncUserPlan.VoicePolicy), + new SqlParameter("@IsDefault", lyncUserPlan.IsDefault) + ); + } + + public static void DeleteLyncUserPlan(int lyncUserPlanId) + { + SqlHelper.ExecuteNonQuery( + ConnectionString, + CommandType.StoredProcedure, + "DeleteLyncUserPlan", + new SqlParameter("@LyncUserPlanId", lyncUserPlanId) + ); + } + + public static IDataReader GetLyncUserPlan(int lyncUserPlanId) + { + return SqlHelper.ExecuteReader( + ConnectionString, + CommandType.StoredProcedure, + "GetLyncUserPlan", + new SqlParameter("@LyncUserPlanId", lyncUserPlanId) + ); + } + + + public static IDataReader GetLyncUserPlans(int itemId) + { + return SqlHelper.ExecuteReader( + ConnectionString, + CommandType.StoredProcedure, + "GetLyncUserPlans", + new SqlParameter("@ItemID", itemId) + ); + } + + + public static void SetOrganizationDefaultLyncUserPlan(int itemId, int lyncUserPlanId) + { + SqlHelper.ExecuteNonQuery( + ConnectionString, + CommandType.StoredProcedure, + "SetOrganizationDefaultLyncUserPlan", + new SqlParameter("@ItemID", itemId), + new SqlParameter("@LyncUserPlanId", lyncUserPlanId) + ); + } + + public static IDataReader GetLyncUserPlanByAccountId(int AccountId) + { + return SqlHelper.ExecuteReader( + ConnectionString, + CommandType.StoredProcedure, + "GetLyncUserPlanByAccountId", + new SqlParameter("@AccountID", AccountId) + ); + } + + + public static void SetLyncUserLyncUserplan(int accountId, int lyncUserPlanId) + { + SqlHelper.ExecuteNonQuery( + ConnectionString, + CommandType.StoredProcedure, + "SetLyncUserLyncUserplan", + new SqlParameter("@AccountID", accountId), + new SqlParameter("@LyncUserPlanId", (lyncUserPlanId == 0) ? (object)DBNull.Value : (object)lyncUserPlanId) + ); + } + + + #endregion + + public static int GetPackageIdByName(string Name) + { + int packageId = -1; + List providers = ServerController.GetProviders(); + foreach (ProviderInfo providerInfo in providers) + { + if (string.Equals(Name, providerInfo.ProviderName, StringComparison.OrdinalIgnoreCase)) + { + packageId = providerInfo.ProviderId; + break; + } + } + + //if (-1 == packageId) + //{ + // throw new Exception("Provider not found"); + //} + + return packageId; + } + + public static int GetServiceIdByProviderForServer(int providerId, int serverId) + { + IDataReader reader = SqlHelper.ExecuteReader(ConnectionString, CommandType.Text, + @"SELECT TOP 1 + ServiceID + FROM Services + WHERE ProviderID = @ProviderID AND ServerID = @ServerID", + new SqlParameter("@ProviderID", providerId), + new SqlParameter("@ServerID", serverId)); + + if (reader.Read()) + { + return (int)reader["ServiceID"]; + } + + return -1; + } + + #region Helicon Zoo + + public static void GetHeliconZooProviderAndGroup(string providerName, out int providerId, out int groupId) + { + IDataReader reader = SqlHelper.ExecuteReader(ConnectionString, CommandType.Text, + @"SELECT TOP 1 + ProviderID, GroupID + FROM Providers + WHERE ProviderName = @ProviderName", + new SqlParameter("@ProviderName", providerName)); + + reader.Read(); + + providerId = (int)reader["ProviderID"]; + groupId = (int)reader["GroupID"]; + + } + + public static IDataReader GetHeliconZooQuotas(int providerId) + { + IDataReader reader = SqlHelper.ExecuteReader(ConnectionString, CommandType.Text, + @"SELECT + Q.QuotaID, + Q.GroupID, + Q.QuotaName, + Q.QuotaDescription, + Q.QuotaTypeID, + Q.ServiceQuota + FROM Providers AS P + INNER JOIN Quotas AS Q ON P.GroupID = Q.GroupID + WHERE P.ProviderID = @ProviderID", + new SqlParameter("@ProviderID", providerId)); + + return reader; + } + + public static void RemoveHeliconZooQuota(int groupId, string engineName) + { + int quotaId; + + // find quota id + IDataReader reader = SqlHelper.ExecuteReader(ConnectionString, CommandType.Text, + @"SELECT TOP 1 + QuotaID + FROM Quotas + WHERE QuotaName = @QuotaName AND GroupID = @GroupID", + new SqlParameter("@QuotaName", engineName), + new SqlParameter("@GroupID", groupId)); + + reader.Read(); + quotaId = (int)reader["QuotaID"]; + + // delete references from HostingPlanQuotas + SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.Text, + "DELETE FROM HostingPlanQuotas WHERE QuotaID = @QuotaID", + new SqlParameter("@QuotaID", quotaId) + ); + + // delete from Quotas + SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.Text, + "DELETE FROM Quotas WHERE QuotaID = @QuotaID", + new SqlParameter("@QuotaID", quotaId) + ); + + } + + public static void AddHeliconZooQuota(int groupId, int quotaId, string engineName, string engineDescription, int quotaOrder) + { + SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.Text, + @"INSERT INTO Quotas (QuotaID, GroupID, QuotaOrder, QuotaName, QuotaDescription, QuotaTypeID, ServiceQuota) + VALUES (@QuotaID, @GroupID, @QuotaOrder, @QuotaName, @QuotaDescription, 1, 0)", + new SqlParameter("@QuotaID", quotaId), + new SqlParameter("@GroupID", groupId), + new SqlParameter("@QuotaOrder", quotaOrder), + new SqlParameter("@QuotaName", engineName), + new SqlParameter("@QuotaDescription", engineDescription) + ); + } + + public static IDataReader GetEnabledHeliconZooQuotasForPackage(int packageId) + { + int providerId, groupId; + + GetHeliconZooProviderAndGroup("HeliconZoo", out providerId, out groupId); + + IDataReader reader = SqlHelper.ExecuteReader(ConnectionString, CommandType.Text, + @"SELECT HostingPlanQuotas.QuotaID, Quotas.QuotaName, Quotas.QuotaDescription + FROM HostingPlanQuotas + INNER JOIN Packages ON HostingPlanQuotas.PlanID = Packages.PlanID + INNER JOIN Quotas ON HostingPlanQuotas.QuotaID = Quotas.QuotaID + WHERE + (Packages.PackageID = @PackageID) AND (Quotas.GroupID = @GroupID) AND (HostingPlanQuotas.QuotaValue = 1)", + new SqlParameter("@PackageID", packageId), + new SqlParameter("@GroupID", groupId) + ); + + return reader; + } + + public static int GetServerIdForPackage(int packageId) + { + IDataReader reader = SqlHelper.ExecuteReader(ConnectionString, CommandType.Text, + @"SELECT TOP 1 + ServerID + FROM Packages + WHERE PackageID = @PackageID", + new SqlParameter("@PackageID", packageId) + ); + + if (reader.Read()) + { + return (int)reader["ServerID"]; + } + + return -1; + } + + #endregion + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Data/EcommerceProvider.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Data/EcommerceProvider.cs similarity index 100% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Data/EcommerceProvider.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Data/EcommerceProvider.cs diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Data/SQLHelper.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Data/SQLHelper.cs similarity index 100% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Data/SQLHelper.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Data/SQLHelper.cs diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/DatabaseServers/DatabaseServerController.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/DatabaseServers/DatabaseServerController.cs similarity index 96% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/DatabaseServers/DatabaseServerController.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/DatabaseServers/DatabaseServerController.cs index 26a3fac9..99e2d55d 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/DatabaseServers/DatabaseServerController.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/DatabaseServers/DatabaseServerController.cs @@ -200,8 +200,8 @@ namespace WebsitePanel.EnterpriseServer if (packageCheck < 0) return packageCheck; // place log record - TaskManager.StartTask("SQL_DATABASE", "UPDATE", origItem.Name); - TaskManager.ItemId = item.Id; + TaskManager.StartTask("SQL_DATABASE", "UPDATE", origItem.Name, item.Id); + TaskManager.WriteParameter("Provider", origItem.GroupName); try @@ -237,9 +237,7 @@ namespace WebsitePanel.EnterpriseServer return BusinessErrorCodes.ERROR_MSSQL_DATABASES_PACKAGE_ITEM_NOT_FOUND; // place log record - TaskManager.StartTask("SQL_DATABASE", "DELETE", origItem.Name); - TaskManager.ItemId = itemId; - TaskManager.WriteParameter("Provider", origItem.GroupName); + TaskManager.StartTask("SQL_DATABASE", "DELETE", origItem.Name, itemId, new BackgroundTaskParameter("Provider", origItem.GroupName)); try { @@ -305,8 +303,7 @@ namespace WebsitePanel.EnterpriseServer return null; // place log record - TaskManager.StartTask("SQL_DATABASE", "BACKUP", item.Name); - TaskManager.ItemId = itemId; + TaskManager.StartTask("SQL_DATABASE", "BACKUP", item.Name, itemId); try { @@ -398,8 +395,7 @@ namespace WebsitePanel.EnterpriseServer if (packageCheck < 0) return packageCheck; // place log record - TaskManager.StartTask("SQL_DATABASE", "RESTORE", item.Name); - TaskManager.ItemId = itemId; + TaskManager.StartTask("SQL_DATABASE", "RESTORE", item.Name, itemId); try { @@ -468,8 +464,7 @@ namespace WebsitePanel.EnterpriseServer return BusinessErrorCodes.ERROR_MSSQL_DATABASES_PACKAGE_ITEM_NOT_FOUND; // place log record - TaskManager.StartTask("SQL_DATABASE", "TRUNCATE", origItem.Name); - TaskManager.ItemId = itemId; + TaskManager.StartTask("SQL_DATABASE", "TRUNCATE", origItem.Name, itemId); try { @@ -701,8 +696,7 @@ namespace WebsitePanel.EnterpriseServer if (packageCheck < 0) return packageCheck; // place log record - TaskManager.StartTask("SQL_USER", "UPDATE", origItem.Name); - TaskManager.ItemId = item.Id; + TaskManager.StartTask("SQL_USER", "UPDATE", origItem.Name, item.Id); try { @@ -746,8 +740,7 @@ namespace WebsitePanel.EnterpriseServer return BusinessErrorCodes.ERROR_MSSQL_USERS_PACKAGE_ITEM_NOT_FOUND; // place log record - TaskManager.StartTask("SQL_USER", "DELETE", origItem.Name); - TaskManager.ItemId = itemId; + TaskManager.StartTask("SQL_USER", "DELETE", origItem.Name, itemId); try { diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/DnsServers/DnsServerController.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/DnsServers/DnsServerController.cs similarity index 97% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/DnsServers/DnsServerController.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/DnsServers/DnsServerController.cs index de9aa5fd..10d4bbea 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/DnsServers/DnsServerController.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/DnsServers/DnsServerController.cs @@ -214,12 +214,10 @@ namespace WebsitePanel.EnterpriseServer // if (zoneItem != null) { - TaskManager.StartTask("DNS_ZONE", "DELETE", zoneItem.Name); + TaskManager.StartTask("DNS_ZONE", "DELETE", zoneItem.Name, zoneItemId); // try { - // - TaskManager.ItemId = zoneItemId; // delete DNS zone DNSServer dns = new DNSServer(); ServiceProviderProxy.Init(dns, zoneItem.ServiceId); diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Ecommerce/CategoryController.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Ecommerce/CategoryController.cs similarity index 100% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Ecommerce/CategoryController.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Ecommerce/CategoryController.cs diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Ecommerce/ContractSystem/ContractController.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Ecommerce/ContractSystem/ContractController.cs similarity index 96% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Ecommerce/ContractSystem/ContractController.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Ecommerce/ContractSystem/ContractController.cs index 05920e1a..1fcab30c 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Ecommerce/ContractSystem/ContractController.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Ecommerce/ContractSystem/ContractController.cs @@ -84,8 +84,10 @@ namespace WebsitePanel.Ecommerce.EnterpriseServer.ContractSystem // result.Succeed = true; result.SetProperty("ContractId", contractId); + // Add contract object - ES.TaskManager.TaskParameters[SystemTaskParams.PARAM_CONTRACT] = GetContract(contractId); + ES.TaskManager.UpdateParam(SystemTaskParams.PARAM_CONTRACT, GetContract(contractId)); + // return result; } diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Ecommerce/Helpers.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Ecommerce/Helpers.cs similarity index 100% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Ecommerce/Helpers.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Ecommerce/Helpers.cs diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Ecommerce/InvoiceController.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Ecommerce/InvoiceController.cs similarity index 94% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Ecommerce/InvoiceController.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Ecommerce/InvoiceController.cs index bd06bd04..65ccd06e 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Ecommerce/InvoiceController.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Ecommerce/InvoiceController.cs @@ -224,10 +224,15 @@ namespace WebsitePanel.Ecommerce.EnterpriseServer InvoiceController.UpdateInvoice(invoice.InvoiceId, invoice.InvoiceNumber, invoice.DueDate, invoice.Total, invoice.SubTotal, invoice.TaxationId, invoice.TaxAmount, invoice.Currency); // - ES.TaskManager.TaskParameters[SystemTaskParams.PARAM_CONTRACT] = contract; - ES.TaskManager.TaskParameters[SystemTaskParams.PARAM_INVOICE] = invoice; - ES.TaskManager.TaskParameters[SystemTaskParams.PARAM_INVOICE_LINES] = invoiceLines; - ES.TaskManager.TaskParameters[SystemTaskParams.PARAM_EXTRA_ARGS] = extraArgs; + + Hashtable parameters = new Hashtable(); + + parameters.Add(SystemTaskParams.PARAM_CONTRACT, contract); + parameters.Add(SystemTaskParams.PARAM_INVOICE, invoice); + parameters.Add(SystemTaskParams.PARAM_INVOICE_LINES, invoiceLines); + parameters.Add(SystemTaskParams.PARAM_EXTRA_ARGS, extraArgs); + + TaskManager.UpdateParams(parameters); // return result; } @@ -248,7 +253,7 @@ namespace WebsitePanel.Ecommerce.EnterpriseServer invoiceNumber, dueDate, total, subTotal, taxationId, taxAmount, currency); } - internal static Invoice GetCustomerInvoiceInternally(int invoiceId) + public static Invoice GetCustomerInvoiceInternally(int invoiceId) { return ES.ObjectUtils.FillObjectFromDataReader( EcommerceProvider.GetCustomerInvoice(ES.SecurityContext.User.UserId, invoiceId)); @@ -260,7 +265,7 @@ namespace WebsitePanel.Ecommerce.EnterpriseServer EcommerceProvider.GetCustomerInvoiceItems(ES.SecurityContext.User.UserId, invoiceId)); } - internal static string GetCustomerInvoiceFormattedInternally(int invoiceId, string cultureName) + public static string GetCustomerInvoiceFormattedInternally(int invoiceId, string cultureName) { Invoice invoice = GetCustomerInvoiceInternally(invoiceId); // diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Ecommerce/MiscController.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Ecommerce/MiscController.cs similarity index 100% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Ecommerce/MiscController.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Ecommerce/MiscController.cs diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Ecommerce/PaymentGatewayController.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Ecommerce/PaymentGatewayController.cs similarity index 100% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Ecommerce/PaymentGatewayController.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Ecommerce/PaymentGatewayController.cs diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Ecommerce/Provisioning/DomainNameController.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Ecommerce/Provisioning/DomainNameController.cs similarity index 100% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Ecommerce/Provisioning/DomainNameController.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Ecommerce/Provisioning/DomainNameController.cs diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Ecommerce/Provisioning/HostingAddonController.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Ecommerce/Provisioning/HostingAddonController.cs similarity index 100% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Ecommerce/Provisioning/HostingAddonController.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Ecommerce/Provisioning/HostingAddonController.cs diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Ecommerce/Provisioning/HostingPackageController.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Ecommerce/Provisioning/HostingPackageController.cs similarity index 96% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Ecommerce/Provisioning/HostingPackageController.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Ecommerce/Provisioning/HostingPackageController.cs index 196c6f88..dca4232f 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Ecommerce/Provisioning/HostingPackageController.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Ecommerce/Provisioning/HostingPackageController.cs @@ -162,7 +162,8 @@ namespace WebsitePanel.Ecommerce.EnterpriseServer TaskManager.WriteParameter(USERNAME_PARAM, context.ConsumerInfo[ContractAccount.USERNAME]); TaskManager.WriteParameter(SVC_PARAM, context.ServiceInfo.ServiceName); TaskManager.WriteParameter(SVC_ID_PARAM, context.ServiceInfo.ServiceId); - TaskManager.TaskParameters[SystemTaskParams.PARAM_SEND_EMAIL] = context.SendEmail; + + TaskManager.UpdateParam(SystemTaskParams.PARAM_SEND_EMAIL, context.SendEmail); // 0. Do security checks if (!CheckOperationClientPermissions(result)) diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Ecommerce/Provisioning/IServiceProvisioning.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Ecommerce/Provisioning/IServiceProvisioning.cs similarity index 100% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Ecommerce/Provisioning/IServiceProvisioning.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Ecommerce/Provisioning/IServiceProvisioning.cs diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Ecommerce/Provisioning/ProvisioningContext.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Ecommerce/Provisioning/ProvisioningContext.cs similarity index 100% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Ecommerce/Provisioning/ProvisioningContext.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Ecommerce/Provisioning/ProvisioningContext.cs diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Ecommerce/Provisioning/ServiceProvisioningBase.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Ecommerce/Provisioning/ServiceProvisioningBase.cs similarity index 92% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Ecommerce/Provisioning/ServiceProvisioningBase.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Ecommerce/Provisioning/ServiceProvisioningBase.cs index 50673c48..1988b103 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Ecommerce/Provisioning/ServiceProvisioningBase.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Ecommerce/Provisioning/ServiceProvisioningBase.cs @@ -235,10 +235,13 @@ namespace WebsitePanel.Ecommerce.EnterpriseServer protected void SetOutboundParameters(ProvisioningContext context) { // set task outbound parameters - TaskManager.TaskParameters[SystemTaskParams.PARAM_SERVICE] = context.ServiceInfo; - TaskManager.TaskParameters[SystemTaskParams.PARAM_CONTRACT] = context.ContractInfo; - TaskManager.TaskParameters[SystemTaskParams.PARAM_CONTRACT_ACCOUNT] = context.ConsumerInfo; - TaskManager.TaskParameters[SystemTaskParams.PARAM_SEND_EMAIL] = context.SendEmail; + Hashtable parameters = new Hashtable(); + parameters.Add(SystemTaskParams.PARAM_SERVICE, context.ServiceInfo); + parameters.Add(SystemTaskParams.PARAM_CONTRACT, context.ContractInfo); + parameters.Add(SystemTaskParams.PARAM_CONTRACT_ACCOUNT, context.ConsumerInfo); + parameters.Add(SystemTaskParams.PARAM_SEND_EMAIL, context.SendEmail); + + TaskManager.UpdateParams(parameters); } } diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Ecommerce/ServiceController.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Ecommerce/ServiceController.cs similarity index 100% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Ecommerce/ServiceController.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Ecommerce/ServiceController.cs diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Ecommerce/ServiceHandlers/ServiceHandlerController.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Ecommerce/ServiceHandlers/ServiceHandlerController.cs similarity index 100% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Ecommerce/ServiceHandlers/ServiceHandlerController.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Ecommerce/ServiceHandlers/ServiceHandlerController.cs diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Ecommerce/StorefrontController.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Ecommerce/StorefrontController.cs similarity index 100% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Ecommerce/StorefrontController.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Ecommerce/StorefrontController.cs diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Ecommerce/StorehouseController.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Ecommerce/StorehouseController.cs similarity index 95% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Ecommerce/StorehouseController.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Ecommerce/StorehouseController.cs index 737fdb5c..6ea4ddc6 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Ecommerce/StorehouseController.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Ecommerce/StorehouseController.cs @@ -763,7 +763,7 @@ namespace WebsitePanel.Ecommerce.EnterpriseServer return EcommerceProvider.DeleteTaxation(SecurityContext.User.UserId, userId, taxationId); } - internal static void SetPaymentProfile(string contractId, CheckoutDetails newProfile) + public static void SetPaymentProfile(string contractId, CheckoutDetails newProfile) { try { @@ -864,7 +864,7 @@ namespace WebsitePanel.Ecommerce.EnterpriseServer return details; } - internal static bool PaymentProfileExists(string contractId) + public static bool PaymentProfileExists(string contractId) { return EcommerceProvider.PaymentProfileExists(SecurityContext.User.UserId, contractId); } @@ -1145,10 +1145,15 @@ namespace WebsitePanel.Ecommerce.EnterpriseServer // int resultCode = EcommerceProvider.UpdateCustomerPayment(SecurityContext.User.UserId, paymentId, invoiceId, transactionId, total, currency, methodName, pluginId, (int)status); + // - TaskManager.TaskParameters[SystemTaskParams.PARAM_CONTRACT] = ContractSystem.ContractController.GetContract(contractId); - TaskManager.TaskParameters[SystemTaskParams.PARAM_INVOICE] = InvoiceController.GetCustomerInvoiceInternally(invoiceId); - TaskManager.TaskParameters[SystemTaskParams.PARAM_PAYMENT] = GetCustomerPayment(paymentId); + Hashtable parameters = new Hashtable(); + parameters[SystemTaskParams.PARAM_CONTRACT] = ContractSystem.ContractController.GetContract(contractId); + parameters[SystemTaskParams.PARAM_INVOICE] = InvoiceController.GetCustomerInvoiceInternally(invoiceId); + parameters[SystemTaskParams.PARAM_PAYMENT] = GetCustomerPayment(paymentId); + + TaskManager.UpdateParams(parameters); + // return resultCode; } @@ -1209,9 +1214,12 @@ namespace WebsitePanel.Ecommerce.EnterpriseServer // TRACE TaskManager.WriteParameter("PaymentID", resultCode); // - TaskManager.TaskParameters[SystemTaskParams.PARAM_CONTRACT] = contract; - TaskManager.TaskParameters[SystemTaskParams.PARAM_INVOICE] = invoice; - TaskManager.TaskParameters[SystemTaskParams.PARAM_PAYMENT] = GetCustomerPayment(resultCode); + Hashtable parameters = new Hashtable(); + parameters[SystemTaskParams.PARAM_CONTRACT] = contract; + parameters[SystemTaskParams.PARAM_INVOICE] = invoice; + parameters[SystemTaskParams.PARAM_PAYMENT] = GetCustomerPayment(resultCode); + + TaskManager.UpdateParams(parameters); // return resultCode; } diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Ecommerce/SystemPluginController.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Ecommerce/SystemPluginController.cs similarity index 96% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Ecommerce/SystemPluginController.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Ecommerce/SystemPluginController.cs index c9f01256..e93e8cf4 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Ecommerce/SystemPluginController.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Ecommerce/SystemPluginController.cs @@ -252,7 +252,7 @@ namespace WebsitePanel.Ecommerce.EnterpriseServer EcommerceProvider.GetSupportedPluginById(pluginId)); } - internal static CheckoutFormParams GetCheckoutFormParams(string contractId, int invoiceId, + public static CheckoutFormParams GetCheckoutFormParams(string contractId, int invoiceId, string methodName, KeyValueBunch options) { Contract contractInfo = ContractSystem.ContractController.GetContract(contractId); diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Ecommerce/TaskEventHandlers/SendEmailNotification.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Ecommerce/TaskEventHandlers/SendEmailNotification.cs similarity index 81% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Ecommerce/TaskEventHandlers/SendEmailNotification.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Ecommerce/TaskEventHandlers/SendEmailNotification.cs index d13af554..114c09e6 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Ecommerce/TaskEventHandlers/SendEmailNotification.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Ecommerce/TaskEventHandlers/SendEmailNotification.cs @@ -45,9 +45,11 @@ namespace WebsitePanel.Ecommerce.EnterpriseServer.TaskEventHandlers /// public override void OnComplete() { - if (!TaskManager.HasErrors) + BackgroundTask topTask = TaskManager.TopTask; + + if (!TaskManager.HasErrors(topTask)) { - switch (TaskManager.TaskName) + switch (topTask.TaskName) { case SystemTasks.SVC_SUSPEND: case SystemTasks.SVC_CANCEL: @@ -72,7 +74,10 @@ namespace WebsitePanel.Ecommerce.EnterpriseServer.TaskEventHandlers // send an e-mail notification try { - bool sendNotification = (bool)TaskManager.TaskParameters[SystemTaskParams.PARAM_SEND_EMAIL]; + BackgroundTask topTask = TaskManager.TopTask; + + bool sendNotification = Utils.ParseBool(topTask.GetParamValue(SystemTaskParams.PARAM_SEND_EMAIL), false); + // Ensure notification is required if (!sendNotification) { @@ -80,7 +85,7 @@ namespace WebsitePanel.Ecommerce.EnterpriseServer.TaskEventHandlers return; } - Service service = (Service)TaskManager.TaskParameters[SystemTaskParams.PARAM_SERVICE]; + Service service = (Service)topTask.GetParamValue(SystemTaskParams.PARAM_SERVICE); int smtpResult = 0; switch (service.Status) { @@ -112,9 +117,11 @@ namespace WebsitePanel.Ecommerce.EnterpriseServer.TaskEventHandlers // try { + BackgroundTask topTask = TaskManager.TopTask; + // Read task parameters - Invoice invoice = (Invoice)TaskManager.TaskParameters[SystemTaskParams.PARAM_INVOICE]; - CustomerPayment payment = (CustomerPayment)TaskManager.TaskParameters[SystemTaskParams.PARAM_PAYMENT]; + Invoice invoice = (Invoice)topTask.GetParamValue(SystemTaskParams.PARAM_INVOICE); + CustomerPayment payment = (CustomerPayment)topTask.GetParamValue(SystemTaskParams.PARAM_PAYMENT); // if (payment.Status == TransactionStatus.Approved) { @@ -139,11 +146,13 @@ namespace WebsitePanel.Ecommerce.EnterpriseServer.TaskEventHandlers // try { + BackgroundTask topTask = TaskManager.TopTask; + // Read task parameters - Contract contract = (Contract)TaskManager.TaskParameters[SystemTaskParams.PARAM_CONTRACT]; - Invoice invoice = (Invoice)TaskManager.TaskParameters[SystemTaskParams.PARAM_INVOICE]; - List invoiceLines = (List)TaskManager.TaskParameters[SystemTaskParams.PARAM_INVOICE_LINES]; - KeyValueBunch extraArgs = (KeyValueBunch)TaskManager.TaskParameters[SystemTaskParams.PARAM_EXTRA_ARGS]; + Contract contract = (Contract)topTask.GetParamValue(SystemTaskParams.PARAM_CONTRACT); + Invoice invoice = (Invoice)topTask.GetParamValue(SystemTaskParams.PARAM_INVOICE); + List invoiceLines = (List)topTask.GetParamValue(SystemTaskParams.PARAM_INVOICE_LINES); + KeyValueBunch extraArgs = (KeyValueBunch)topTask.GetParamValue(SystemTaskParams.PARAM_EXTRA_ARGS); // modify invoice direct url if (extraArgs != null && !String.IsNullOrEmpty(extraArgs["InvoiceDirectURL"])) extraArgs["InvoiceDirectURL"] += "&InvoiceId=" + invoice.InvoiceId; diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Ecommerce/TaskEventHandlers/SystemTriggersAgent.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Ecommerce/TaskEventHandlers/SystemTriggersAgent.cs similarity index 82% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Ecommerce/TaskEventHandlers/SystemTriggersAgent.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Ecommerce/TaskEventHandlers/SystemTriggersAgent.cs index 1ce637c4..b7b8efec 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Ecommerce/TaskEventHandlers/SystemTriggersAgent.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Ecommerce/TaskEventHandlers/SystemTriggersAgent.cs @@ -44,9 +44,11 @@ namespace WebsitePanel.Ecommerce.EnterpriseServer.TaskEventHandlers public override void OnComplete() { - if (!TaskManager.HasErrors) + BackgroundTask topTask = TaskManager.TopTask; + + if (!TaskManager.HasErrors(topTask)) { - switch (TaskManager.TaskName) + switch (topTask.TaskName) { case SystemTasks.TASK_ADD_INVOICE: RegisterInvoiceActivationTrigger(); @@ -65,7 +67,7 @@ namespace WebsitePanel.Ecommerce.EnterpriseServer.TaskEventHandlers private void RegisterInvoiceActivationTrigger() { // Read contract invoice - Invoice invoice = (Invoice)TaskManager.TaskParameters[SystemTaskParams.PARAM_INVOICE]; + Invoice invoice = (Invoice)TaskManager.TopTask.GetParamValue(SystemTaskParams.PARAM_INVOICE); // TriggerSystem.TriggerController.AddSystemTrigger(invoice.InvoiceId.ToString(), ActivateInvoiceTrigger.STATUS_AWAITING_PAYMENT, typeof(ActivateInvoiceTrigger)); @@ -73,10 +75,12 @@ namespace WebsitePanel.Ecommerce.EnterpriseServer.TaskEventHandlers private void RegisterContractActivationTrigger() { + BackgroundTask topTask = TaskManager.TopTask; + // Ensure the contract has been registered successfully - if (TaskManager.TaskParameters.ContainsKey(SystemTaskParams.PARAM_CONTRACT)) + if (topTask.ContainsParam(SystemTaskParams.PARAM_CONTRACT)) { - Contract contract = (Contract)TaskManager.TaskParameters[SystemTaskParams.PARAM_CONTRACT]; + Contract contract = (Contract)topTask.GetParamValue(SystemTaskParams.PARAM_CONTRACT); // if (contract.Status == ContractStatus.Pending) { @@ -88,8 +92,10 @@ namespace WebsitePanel.Ecommerce.EnterpriseServer.TaskEventHandlers private void ActivatePaymentSystemTriggers() { - CustomerPayment payment = (CustomerPayment)TaskManager.TaskParameters[SystemTaskParams.PARAM_PAYMENT]; - Contract contract = (Contract)TaskManager.TaskParameters[SystemTaskParams.PARAM_CONTRACT]; + BackgroundTask topTask = TaskManager.TopTask; + + CustomerPayment payment = (CustomerPayment)topTask.GetParamValue(SystemTaskParams.PARAM_PAYMENT); + Contract contract = (Contract)topTask.GetParamValue(SystemTaskParams.PARAM_CONTRACT); // Run activate contract trigger if the transaction was approved if (payment.Status == TransactionStatus.Approved) diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Ecommerce/TriggerSystem/CommonTrigger.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Ecommerce/TriggerSystem/CommonTrigger.cs similarity index 100% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Ecommerce/TriggerSystem/CommonTrigger.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Ecommerce/TriggerSystem/CommonTrigger.cs diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Ecommerce/TriggerSystem/TriggerController.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Ecommerce/TriggerSystem/TriggerController.cs similarity index 100% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Ecommerce/TriggerSystem/TriggerController.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Ecommerce/TriggerSystem/TriggerController.cs diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/ExchangeServer/ExchangeServerController.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/ExchangeServer/ExchangeServerController.cs new file mode 100644 index 00000000..c75be2e8 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/ExchangeServer/ExchangeServerController.cs @@ -0,0 +1,5077 @@ +// Copyright (c) 2012, Outercurve Foundation. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Collections.Specialized; +using System.Data; +using System.Net.Mail; +using System.Threading; +using WebsitePanel.EnterpriseServer.Code.HostedSolution; +using WebsitePanel.Providers; +using WebsitePanel.Providers.Common; +using WebsitePanel.Providers.Exchange; +using WebsitePanel.Providers.HostedSolution; +using WebsitePanel.Providers.OCS; +using WebsitePanel.Providers.ResultObjects; + + +namespace WebsitePanel.EnterpriseServer +{ + public class ExchangeServerController + { + #region Organizations + public static DataSet GetRawExchangeOrganizationsPaged(int packageId, bool recursive, + string filterColumn, string filterValue, string sortColumn, int startRow, int maximumRows) + { + #region Demo Mode + if (IsDemoMode) + { + DataSet ds = new DataSet(); + + // total records + DataTable dtTotal = ds.Tables.Add(); + dtTotal.Columns.Add("Records", typeof(int)); + dtTotal.Rows.Add(3); + + // organizations + DataTable dtItems = ds.Tables.Add(); + dtItems.Columns.Add("ItemID", typeof(int)); + dtItems.Columns.Add("OrganizationID", typeof(string)); + dtItems.Columns.Add("ItemName", typeof(string)); + dtItems.Columns.Add("PackageName", typeof(string)); + dtItems.Columns.Add("PackageID", typeof(int)); + dtItems.Columns.Add("Username", typeof(string)); + dtItems.Columns.Add("UserID", typeof(int)); + dtItems.Rows.Add(1, "fabrikam", "Fabrikam Inc", "Hosted Exchange", 1, "Customer", 1); + dtItems.Rows.Add(1, "contoso", "Contoso", "Hosted Exchange", 1, "Customer", 1); + dtItems.Rows.Add(1, "gencons", "General Consultants", "Hosted Exchange", 1, "Customer", 1); + + return ds; + } + #endregion + + return PackageController.GetRawPackageItemsPaged( + packageId, ResourceGroups.Exchange, typeof(Organization), + recursive, filterColumn, filterValue, sortColumn, startRow, maximumRows); + } + + public static OrganizationsPaged GetExchangeOrganizationsPaged(int packageId, bool recursive, + string filterColumn, string filterValue, string sortColumn, int startRow, int maximumRows) + { + ServiceItemsPaged items = PackageController.GetPackageItemsPaged( + packageId, ResourceGroups.Exchange, typeof(Organization), + recursive, filterColumn, filterValue, sortColumn, startRow, maximumRows); + + OrganizationsPaged orgs = new OrganizationsPaged(); + orgs.RecordsCount = items.RecordsCount; + orgs.PageItems = new Organization[items.PageItems.Length]; + + for (int i = 0; i < orgs.PageItems.Length; i++) + orgs.PageItems[i] = (Organization)items.PageItems[i]; + + return orgs; + } + + public static List GetExchangeOrganizations(int packageId, bool recursive) + { + List items = PackageController.GetPackageItemsByType( + packageId, typeof(Organization), recursive); + + return items.ConvertAll( + new Converter( + delegate(ServiceProviderItem item) { return (Organization)item; })); + } + + public static List GetExchangeOrganizationsInternal(int packageId, bool recursive) + { + List items = PackageController.GetPackageItemsByTypeInternal(packageId, null, typeof(Organization), recursive); + + return items.ConvertAll( + new Converter( + delegate(ServiceProviderItem item) { return (Organization)item; })); + } + + public static Organization GetOrganization(int itemId) + { + #region Demo Mode + if (IsDemoMode) + { + // load package by user + Organization org = new Organization(); + org.PackageId = 0; + org.Id = 1; + org.OrganizationId = "fabrikam"; + org.Name = "Fabrikam Inc"; + org.KeepDeletedItemsDays = 14; + return org; + } + #endregion + + return (Organization)PackageController.GetPackageItem(itemId); + } + + public static OrganizationStatistics GetOrganizationStatistics(int itemId) + { + return GetOrganizationStatisticsInternal(itemId, false); + } + + public static OrganizationStatistics GetOrganizationStatisticsByOrganization(int itemId) + { + return GetOrganizationStatisticsInternal(itemId, true); + } + + + private static OrganizationStatistics GetOrganizationStatisticsInternal(int itemId, bool byOrganization) + { + #region Demo Mode + if (IsDemoMode) + { + OrganizationStatistics stats = new OrganizationStatistics(); + stats.AllocatedMailboxes = 10; + stats.CreatedMailboxes = 4; + stats.AllocatedContacts = 4; + stats.CreatedContacts = 2; + stats.AllocatedDistributionLists = 5; + stats.CreatedDistributionLists = 1; + stats.AllocatedPublicFolders = 40; + stats.CreatedPublicFolders = 4; + stats.AllocatedDomains = 5; + stats.CreatedDomains = 2; + stats.AllocatedDiskSpace = 200; + stats.UsedDiskSpace = 70; + return stats; + } + #endregion + + // place log record + TaskManager.StartTask("EXCHANGE", "GET_ORG_STATS", itemId); + + try + { + Organization org = (Organization)PackageController.GetPackageItem(itemId); + if (org == null) + return null; + + OrganizationStatistics stats = new OrganizationStatistics(); + + if (byOrganization) + { + OrganizationStatistics tempStats = ObjectUtils.FillObjectFromDataReader(DataProvider.GetExchangeOrganizationStatistics(org.Id)); + + stats.CreatedMailboxes = tempStats.CreatedMailboxes; + stats.CreatedContacts = tempStats.CreatedContacts; + stats.CreatedDistributionLists = tempStats.CreatedDistributionLists; + stats.CreatedDomains = tempStats.CreatedDomains; + stats.CreatedPublicFolders = tempStats.CreatedPublicFolders; + stats.UsedDiskSpace = tempStats.UsedDiskSpace; + stats.UsedLitigationHoldSpace = tempStats.UsedLitigationHoldSpace; + } + else + { + UserInfo user = ObjectUtils.FillObjectFromDataReader(DataProvider.GetUserByExchangeOrganizationIdInternally(org.Id)); + List Packages = PackageController.GetPackages(user.UserId); + + if ((Packages != null) & (Packages.Count > 0)) + { + foreach (PackageInfo Package in Packages) + { + List orgs = null; + + orgs = GetExchangeOrganizations(Package.PackageId, false); + + if ((orgs != null) & (orgs.Count > 0)) + { + foreach (Organization o in orgs) + { + OrganizationStatistics tempStats = ObjectUtils.FillObjectFromDataReader(DataProvider.GetExchangeOrganizationStatistics(o.Id)); + + stats.CreatedMailboxes += tempStats.CreatedMailboxes; + stats.CreatedContacts += tempStats.CreatedContacts; + stats.CreatedDistributionLists += tempStats.CreatedDistributionLists; + stats.CreatedDomains += tempStats.CreatedDomains; + stats.CreatedPublicFolders += tempStats.CreatedPublicFolders; + stats.UsedDiskSpace += tempStats.UsedDiskSpace; + stats.UsedLitigationHoldSpace += tempStats.UsedLitigationHoldSpace; + } + } + } + } + } + + // disk space + //stats.UsedDiskSpace = org.DiskSpace; + + + // allocated quotas + PackageContext cntx = PackageController.GetPackageContext(org.PackageId); + stats.AllocatedMailboxes = cntx.Quotas[Quotas.EXCHANGE2007_MAILBOXES].QuotaAllocatedValue; + stats.AllocatedContacts = cntx.Quotas[Quotas.EXCHANGE2007_CONTACTS].QuotaAllocatedValue; + stats.AllocatedDistributionLists = cntx.Quotas[Quotas.EXCHANGE2007_DISTRIBUTIONLISTS].QuotaAllocatedValue; + stats.AllocatedPublicFolders = cntx.Quotas[Quotas.EXCHANGE2007_PUBLICFOLDERS].QuotaAllocatedValue; + stats.AllocatedDiskSpace = cntx.Quotas[Quotas.EXCHANGE2007_DISKSPACE].QuotaAllocatedValue; + stats.AllocatedLitigationHoldSpace = cntx.Quotas[Quotas.EXCHANGE2007_RECOVERABLEITEMSSPACE].QuotaAllocatedValue; + + return stats; + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + } + + + + public static int CalculateOrganizationDiskspace(int itemId) + { + // check account + int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo); + if (accountCheck < 0) return accountCheck; + + // place log record + TaskManager.StartTask("EXCHANGE", "CALCULATE_DISKSPACE", itemId); + + try + { + // create thread parameters + ThreadStartParameters prms = new ThreadStartParameters(); + prms.UserId = SecurityContext.User.UserId; + prms.Parameters = new object[] { itemId }; + + Thread t = new Thread(CalculateOrganizationDiskspaceAsync); + t.Start(prms); + return 0; + + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + } + + private static void CalculateOrganizationDiskspaceAsync(object objPrms) + { + ThreadStartParameters prms = (ThreadStartParameters)objPrms; + + // impersonate thread + SecurityContext.SetThreadPrincipal(prms.UserId); + + int itemId = (int)prms.Parameters[0]; + + // calculate disk space + CalculateOrganizationDiskspaceInternal(itemId); + } + + internal static void CalculateOrganizationDiskspaceInternal(int itemId) + { + try + { + // calculate disk space + Organization org = (Organization)PackageController.GetPackageItem(itemId); + if (org == null) + return; + + SoapServiceProviderItem soapOrg = SoapServiceProviderItem.Wrap(org); + + + int exchangeServiceId = PackageController.GetPackageServiceId(org.PackageId, ResourceGroups.Exchange); + + if (exchangeServiceId != 0) + { + ServiceProvider exchange = GetServiceProvider(exchangeServiceId, org.ServiceId); + + ServiceProviderItemDiskSpace[] itemsDiskspace = exchange.GetServiceItemsDiskSpace(new SoapServiceProviderItem[] { soapOrg }); + + + if (itemsDiskspace != null && itemsDiskspace.Length > 0) + { + // set disk space + org.DiskSpace = (int)Math.Round(((float)itemsDiskspace[0].DiskSpace / 1024 / 1024)); + + // save organization + UpdateOrganization(org); + } + } + } + catch (Exception ex) + { + // write to audit log + TaskManager.WriteError(ex); + } + } + + private static bool OrganizationIdentifierExists(string organizationId) + { + return DataProvider.ExchangeOrganizationExists(organizationId); + } + + + + + + private static int ExtendToExchangeOrganization(ref Organization org) + { + // place log record + TaskManager.StartTask("EXCHANGE", "CREATE_ORG", org.Name, new BackgroundTaskParameter("Organization ID", org.OrganizationId)); + + try + { + // provision organization in Exchange + int serviceId = GetExchangeServiceID(org.PackageId); + int[] hubTransportServiceIds; + int[] clientAccessServiceIds; + + GetExchangeServices(serviceId, out hubTransportServiceIds, out clientAccessServiceIds); + + + ExchangeServer mailboxRole = GetExchangeServer(serviceId, org.ServiceId); + + + bool authDomainCreated = false; + int itemId = 0; + bool organizationExtended = false; + + List domains = null; + try + { + PackageContext cntx = PackageController.GetPackageContext(org.PackageId); + + // 1) Create Organization (Mailbox) + // ================================ + Organization exchangeOrganization = mailboxRole.ExtendToExchangeOrganization(org.OrganizationId, + org.SecurityGroup, + Convert.ToBoolean(cntx.Quotas[Quotas.EXCHANGE2007_ISCONSUMER].QuotaAllocatedValue)); + + organizationExtended = true; + + exchangeOrganization.OrganizationId = org.OrganizationId; + exchangeOrganization.PackageId = org.PackageId; + exchangeOrganization.ServiceId = org.ServiceId; + + exchangeOrganization.DefaultDomain = org.DefaultDomain; + exchangeOrganization.Name = org.Name; + exchangeOrganization.Id = org.Id; + exchangeOrganization.SecurityGroup = org.SecurityGroup; + exchangeOrganization.DistinguishedName = org.DistinguishedName; + exchangeOrganization.CrmAdministratorId = org.CrmAdministratorId; + exchangeOrganization.CrmCollation = org.CrmCollation; + exchangeOrganization.CrmCurrency = org.CrmCurrency; + exchangeOrganization.CrmLanguadgeCode = org.CrmLanguadgeCode; + exchangeOrganization.CrmOrganizationId = org.CrmOrganizationId; + exchangeOrganization.CrmOrgState = org.CrmOrgState; + exchangeOrganization.CrmUrl = org.CrmUrl; + + org = exchangeOrganization; + + // 2) Get OAB virtual directories from Client Access servers and + // create Create Organization OAB (Mailbox) + // ========================================== + List oabVirtualDirs = new List(); + foreach (int id in clientAccessServiceIds) + { + ExchangeServer clientAccessRole = null; + try + { + clientAccessRole = GetExchangeServer(id, org.ServiceId); + } + catch(Exception ex) + { + TaskManager.WriteError(ex); + continue; + } + oabVirtualDirs.Add(clientAccessRole.GetOABVirtualDirectory()); + } + + Organization orgOAB = mailboxRole.CreateOrganizationOfflineAddressBook(org.OrganizationId, org.SecurityGroup, string.Join(",", oabVirtualDirs.ToArray())); + org.OfflineAddressBook = orgOAB.OfflineAddressBook; + + + // 3) Add organization domains (Hub Transport) + domains = OrganizationController.GetOrganizationDomains(org.Id); + + foreach (int id in hubTransportServiceIds) + { + ExchangeServer hubTransportRole = null; + try + { + hubTransportRole = GetExchangeServer(id, org.ServiceId); + } + catch(Exception ex) + { + TaskManager.WriteError(ex); + continue; + } + + string[] existingDomains = hubTransportRole.GetAuthoritativeDomains(); + if (existingDomains != null) + Array.Sort(existingDomains); + + foreach (OrganizationDomainName domain in domains) + { + if (existingDomains == null || Array.BinarySearch(existingDomains, domain.DomainName) < 0) + { + hubTransportRole.AddAuthoritativeDomain(domain.DomainName); + } + if (domain.DomainType != ExchangeAcceptedDomainType.Authoritative) + { + hubTransportRole.ChangeAcceptedDomainType(domain.DomainName, domain.DomainType); + } + } + authDomainCreated = true; + break; + } + + foreach (OrganizationDomainName d in domains) + { + DomainInfo domain = ServerController.GetDomain(d.DomainId); + + //Add the service records + if (domain != null) + { + if (domain.ZoneItemId != 0) + { + ServerController.AddServiceDNSRecords(org.PackageId, ResourceGroups.Exchange, domain, ""); + ServerController.AddServiceDNSRecords(org.PackageId, ResourceGroups.BlackBerry, domain, ""); + ServerController.AddServiceDNSRecords(org.PackageId, ResourceGroups.OCS, domain, ""); + } + } + } + + + // 4) Add the address book policy (Exchange 2010 SP2 + // + // ========================================== + Organization OrgTmp = mailboxRole.CreateOrganizationAddressBookPolicy(org.OrganizationId, + org.GlobalAddressList, + org.AddressList, + org.RoomsAddressList, + org.OfflineAddressBook); + + org.AddressBookPolicy = OrgTmp.AddressBookPolicy; + + StringDictionary settings = ServerController.GetServiceSettings(serviceId); + org.KeepDeletedItemsDays = Utils.ParseInt(settings["KeepDeletedItemsDays"], 14); + + } + catch (Exception ex) + { + + // rollback organization creation + if (organizationExtended) + mailboxRole.DeleteOrganization(org.OrganizationId, org.DistinguishedName, + org.GlobalAddressList, org.AddressList, org.RoomsAddressList, org.OfflineAddressBook, org.SecurityGroup, org.AddressBookPolicy); + + // rollback domain + if (authDomainCreated) + foreach (int id in hubTransportServiceIds) + { + ExchangeServer hubTransportRole = null; + try + { + hubTransportRole = GetExchangeServer(id, org.ServiceId); + } + catch (Exception exe) + { + TaskManager.WriteError(exe); + continue; + } + + foreach (OrganizationDomainName domain in domains) + { + hubTransportRole.DeleteAuthoritativeDomain(domain.DomainName); + + } + + break; + } + + throw TaskManager.WriteError(ex); + } + + return itemId; + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + } + + private static int[] ParseMultiSetting(int mailboxServiceId, string settingName) + { + List retIds = new List(); + StringDictionary settings = ServerController.GetServiceSettings(mailboxServiceId); + if (!String.IsNullOrEmpty(settings[settingName])) + { + string[] ids = settings[settingName].Split(','); + + int res; + foreach (string id in ids) + { + if (int.TryParse(id, out res)) + retIds.Add(res); + } + } + + if (retIds.Count == 0) + retIds.Add(mailboxServiceId); + + return retIds.ToArray(); + + } + + private static void GetExchangeServices(int mailboxServiceId, + out int[] hubTransportServiceIds, out int[] clientAccessServiceIds) + { + hubTransportServiceIds = ParseMultiSetting(mailboxServiceId, "HubTransportServiceID"); + + clientAccessServiceIds = ParseMultiSetting(mailboxServiceId, "ClientAccessServiceID"); + } + + public static int DeleteOrganization(int itemId) + { + // check account + int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); + if (accountCheck < 0) return accountCheck; + + // place log record + TaskManager.StartTask("EXCHANGE", "DELETE_ORG", itemId); + + try + { + // delete organization in Exchange + //System.Threading.Thread.Sleep(5000); + Organization org = (Organization)PackageController.GetPackageItem(itemId); + + int exchangeServiceId = GetExchangeServiceID(org.PackageId); + ExchangeServer exchange = GetExchangeServer(exchangeServiceId, org.ServiceId); + + bool successful = exchange.DeleteOrganization( + org.OrganizationId, + org.DistinguishedName, + org.GlobalAddressList, + org.AddressList, + org.RoomsAddressList, + org.OfflineAddressBook, + org.SecurityGroup, + org.AddressBookPolicy); + + + return successful ? 0 : BusinessErrorCodes.ERROR_EXCHANGE_DELETE_SOME_PROBLEMS; + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + } + + public static Organization GetOrganizationStorageLimits(int itemId) + { + // place log record + TaskManager.StartTask("EXCHANGE", "GET_ORG_LIMITS", itemId); + + try + { + return GetOrganization(itemId); + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + } + + public static int SetOrganizationStorageLimits(int itemId, int issueWarningKB, int prohibitSendKB, + int prohibitSendReceiveKB, int keepDeletedItemsDays, bool applyToMailboxes) + { + // check account + int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); + if (accountCheck < 0) return accountCheck; + + // place log record + TaskManager.StartTask("EXCHANGE", "SET_ORG_LIMITS", itemId); + + try + { + Organization org = (Organization)PackageController.GetPackageItem(itemId); + if (org == null) + return 0; + + // load package context + PackageContext cntx = PackageController.GetPackageContext(org.PackageId); + + int maxDiskSpace = 0; + if (cntx.Quotas.ContainsKey(Quotas.EXCHANGE2007_DISKSPACE) + && cntx.Quotas[Quotas.EXCHANGE2007_DISKSPACE].QuotaAllocatedValue > 0) + maxDiskSpace = cntx.Quotas[Quotas.EXCHANGE2007_DISKSPACE].QuotaAllocatedValue * 1024; + + if (maxDiskSpace > 0 && (issueWarningKB > maxDiskSpace || prohibitSendKB > maxDiskSpace || prohibitSendReceiveKB > maxDiskSpace || issueWarningKB == -1 || prohibitSendKB == -1 || prohibitSendReceiveKB == -1)) + return BusinessErrorCodes.ERROR_EXCHANGE_STORAGE_QUOTAS_EXCEED_HOST_VALUES; + + // set limits + org.KeepDeletedItemsDays = keepDeletedItemsDays; + + // save organization + UpdateOrganization(org); + + if (applyToMailboxes) + { + + int exchangeServiceId = GetExchangeServiceID(org.PackageId); + ExchangeServer exchange = GetExchangeServer(exchangeServiceId, org.ServiceId); + + exchange.SetOrganizationStorageLimits(org.DistinguishedName, + issueWarningKB, + prohibitSendKB, + prohibitSendReceiveKB, + keepDeletedItemsDays); + } + + return 0; + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + } + + public static ExchangeItemStatistics[] GetMailboxesStatistics(int itemId) + { + #region Demo Mode + if (IsDemoMode) + { + List items = new List(); + ExchangeItemStatistics item1 = new ExchangeItemStatistics(); + item1.ItemName = "John Smith"; + item1.TotalItems = 105; + item1.TotalSizeMB = 14; + item1.LastLogon = DateTime.Now; + item1.LastLogoff = DateTime.Now; + items.Add(item1); + + ExchangeItemStatistics item2 = new ExchangeItemStatistics(); + item2.ItemName = "Jack Brown"; + item2.TotalItems = 5; + item2.TotalSizeMB = 2; + item2.LastLogon = DateTime.Now; + item2.LastLogoff = DateTime.Now; + items.Add(item2); + + ExchangeItemStatistics item3 = new ExchangeItemStatistics(); + item3.ItemName = "Marry Smith"; + item3.TotalItems = 1302; + item3.TotalSizeMB = 45; + item3.LastLogon = DateTime.Now; + item3.LastLogoff = DateTime.Now; + items.Add(item3); + + return items.ToArray(); + } + #endregion + + // place log record + TaskManager.StartTask("EXCHANGE", "GET_MAILBOXES_STATS", itemId); + + try + { + Organization org = (Organization)PackageController.GetPackageItem(itemId); + if (org == null) + return null; + + + // get stats + int exchangeServiceId = GetExchangeServiceID(org.PackageId); + ExchangeServer exchange = GetExchangeServer(exchangeServiceId, org.ServiceId); + + return exchange.GetMailboxesStatistics(org.DistinguishedName); + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + } + + public static ExchangeMailboxStatistics GetMailboxStatistics(int itemId, int accountId) + { + // place log record + TaskManager.StartTask("EXCHANGE", "GET_MAILBOX_STATS", itemId); + + try + { + Organization org = (Organization)PackageController.GetPackageItem(itemId); + if (org == null) + return null; + + + // get stats + int exchangeServiceId = GetExchangeServiceID(org.PackageId); + ExchangeServer exchange = GetExchangeServer(exchangeServiceId, org.ServiceId); + + // load account + ExchangeAccount account = GetAccount(itemId, accountId); + + return exchange.GetMailboxStatistics(account.UserPrincipalName); + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + } + + + public static ExchangeItemStatistics[] GetPublicFoldersStatistics(int itemId) + { + #region Demo Mode + if (IsDemoMode) + { + List items = new List(); + ExchangeItemStatistics item1 = new ExchangeItemStatistics(); + item1.ItemName = "\\fabrikam\\Documents"; + item1.TotalItems = 6; + item1.TotalSizeMB = 56; + item1.LastModificationTime = DateTime.Now; + item1.LastAccessTime = DateTime.Now; + items.Add(item1); + + ExchangeItemStatistics item2 = new ExchangeItemStatistics(); + item2.ItemName = "\\fabrikam\\Documents\\Legal"; + item2.TotalItems = 5; + item2.TotalSizeMB = 4; + item2.LastModificationTime = DateTime.Now; + item2.LastAccessTime = DateTime.Now; + items.Add(item2); + + ExchangeItemStatistics item3 = new ExchangeItemStatistics(); + item3.ItemName = "\\fabrikam\\Documents\\Contracts"; + item3.TotalItems = 8; + item3.TotalSizeMB = 2; + item3.LastModificationTime = DateTime.Now; + item3.LastAccessTime = DateTime.Now; + items.Add(item3); + + return items.ToArray(); + } + #endregion + + // place log record + TaskManager.StartTask("EXCHANGE", "GET_FOLDERS_STATS", itemId); + + try + { + Organization org = (Organization)PackageController.GetPackageItem(itemId); + if (org == null) + return null; + + // get the list of all public folders + List folderNames = new List(); + List folders = GetAccounts(itemId, ExchangeAccountType.PublicFolder); + foreach (ExchangeAccount folder in folders) + folderNames.Add(folder.DisplayName); + + // get stats + int exchangeServiceId = GetExchangeServiceID(org.PackageId); + ExchangeServer exchange = GetExchangeServer(exchangeServiceId, org.ServiceId); + return exchange.GetPublicFoldersStatistics(org.OrganizationId, folderNames.ToArray()); + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + } + + public static ExchangeActiveSyncPolicy GetActiveSyncPolicy(int itemId) + { + #region Demo Mode + if (IsDemoMode) + { + ExchangeActiveSyncPolicy p = new ExchangeActiveSyncPolicy(); + p.MaxAttachmentSizeKB = -1; + p.MaxPasswordFailedAttempts = -1; + p.MinPasswordLength = 0; + p.InactivityLockMin = -1; + p.PasswordExpirationDays = -1; + p.PasswordHistory = 0; + return p; + } + #endregion + + // place log record + TaskManager.StartTask("EXCHANGE", "GET_ACTIVESYNC_POLICY", itemId); + + try + { + Organization org = (Organization)PackageController.GetPackageItem(itemId); + if (org == null) + return null; + + // get policy + int exchangeServiceId = GetExchangeServiceID(org.PackageId); + ExchangeServer exchange = GetExchangeServer(exchangeServiceId, org.ServiceId); + + //Create Exchange Organization + if (string.IsNullOrEmpty(org.GlobalAddressList)) + { + ExtendToExchangeOrganization(ref org); + + PackageController.UpdatePackageItem(org); + } + ExchangeActiveSyncPolicy policy = exchange.GetActiveSyncPolicy(org.OrganizationId); + + // create policy if required + if (policy == null) + { + exchange.CreateOrganizationActiveSyncPolicy(org.OrganizationId); + return exchange.GetActiveSyncPolicy(org.OrganizationId); + } + + return policy; + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + } + + public static int SetActiveSyncPolicy(int itemId, bool allowNonProvisionableDevices, + bool attachmentsEnabled, int maxAttachmentSizeKB, bool uncAccessEnabled, bool wssAccessEnabled, + bool devicePasswordEnabled, bool alphanumericPasswordRequired, bool passwordRecoveryEnabled, + bool deviceEncryptionEnabled, bool allowSimplePassword, int maxPasswordFailedAttempts, int minPasswordLength, + int inactivityLockMin, int passwordExpirationDays, int passwordHistory, int refreshInterval) + { + // check account + int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); + if (accountCheck < 0) return accountCheck; + + // place log record + TaskManager.StartTask("EXCHANGE", "SET_ACTIVESYNC_POLICY", itemId); + + try + { + Organization org = (Organization)PackageController.GetPackageItem(itemId); + if (org == null) + return 0; + + // get policy + int exchangeServiceId = GetExchangeServiceID(org.PackageId); + ExchangeServer exchange = GetExchangeServer(exchangeServiceId, org.ServiceId); + exchange.SetActiveSyncPolicy(org.OrganizationId, allowNonProvisionableDevices, attachmentsEnabled, + maxAttachmentSizeKB, uncAccessEnabled, wssAccessEnabled, devicePasswordEnabled, alphanumericPasswordRequired, + passwordRecoveryEnabled, deviceEncryptionEnabled, allowSimplePassword, maxPasswordFailedAttempts, + minPasswordLength, inactivityLockMin, passwordExpirationDays, passwordHistory, refreshInterval); + + return 0; + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + } + + private static void UpdateOrganization(Organization organization) + { + PackageController.UpdatePackageItem(organization); + } + #endregion + + #region Accounts + + private static bool AccountExists(string accountName) + { + return DataProvider.ExchangeAccountExists(accountName); + } + + public static ExchangeAccountsPaged GetAccountsPaged(int itemId, string accountTypes, + string filterColumn, string filterValue, string sortColumn, + int startRow, int maximumRows) + { + #region Demo Mode + if (IsDemoMode) + { + string []parseedAccountTypes = Utils.ParseDelimitedString(accountTypes, ','); + + ExchangeAccountsPaged res = new ExchangeAccountsPaged(); + res.PageItems = GetAccounts(itemId, (ExchangeAccountType)Utils.ParseInt(parseedAccountTypes[0], 1)).ToArray(); + res.RecordsCount = res.PageItems.Length; + return res; + } + #endregion + + DataSet ds = DataProvider.GetExchangeAccountsPaged(SecurityContext.User.UserId, itemId, + accountTypes, filterColumn, filterValue, sortColumn, startRow, maximumRows); + + ExchangeAccountsPaged result = new ExchangeAccountsPaged(); + result.RecordsCount = (int)ds.Tables[0].Rows[0][0]; + + List accounts = new List(); + ObjectUtils.FillCollectionFromDataView(accounts, ds.Tables[1].DefaultView); + result.PageItems = accounts.ToArray(); + return result; + } + + public static List GetAccounts(int itemId, ExchangeAccountType accountType) + { + #region Demo Mode + if (IsDemoMode) + { + if (accountType == ExchangeAccountType.Mailbox) + return SearchAccounts(0, true, false, false, true, true, "", "", ""); + else if (accountType == ExchangeAccountType.Contact) + return SearchAccounts(0, false, true, false, false, false, "", "", ""); + else if (accountType == ExchangeAccountType.DistributionList) + return SearchAccounts(0, false, false, true, false, false, "", "", ""); + else + { + List demoAccounts = new List(); + ExchangeAccount f1 = new ExchangeAccount(); + f1.AccountId = 7; + f1.AccountName = "documents_fabrikam"; + f1.AccountType = ExchangeAccountType.PublicFolder; + f1.DisplayName = "\\fabrikam\\Documents"; + f1.PrimaryEmailAddress = "documents@fabrikam.net"; + f1.MailEnabledPublicFolder = true; + demoAccounts.Add(f1); + + ExchangeAccount f2 = new ExchangeAccount(); + f2.AccountId = 8; + f2.AccountName = "documents_fabrikam"; + f2.AccountType = ExchangeAccountType.PublicFolder; + f2.DisplayName = "\\fabrikam\\Documents\\Legal"; + f2.PrimaryEmailAddress = ""; + demoAccounts.Add(f2); + + ExchangeAccount f3 = new ExchangeAccount(); + f3.AccountId = 9; + f3.AccountName = "documents_fabrikam"; + f3.AccountType = ExchangeAccountType.PublicFolder; + f3.DisplayName = "\\fabrikam\\Documents\\Contracts"; + f3.PrimaryEmailAddress = ""; + demoAccounts.Add(f3); + return demoAccounts; + } + } + #endregion + + return ObjectUtils.CreateListFromDataReader( + DataProvider.GetExchangeAccounts(itemId, (int)accountType)); + } + + + public static List GetExchangeAccountByMailboxPlanId(int itemId, int mailboxPlanId) + { + return ObjectUtils.CreateListFromDataReader(DataProvider.GetExchangeAccountByMailboxPlanId(itemId, mailboxPlanId)); + } + + + public static List GetExchangeMailboxes(int itemId) + { + return ObjectUtils.CreateListFromDataReader(DataProvider.GetExchangeMailboxes(itemId)); + } + + public static List SearchAccounts(int itemId, + bool includeMailboxes, bool includeContacts, bool includeDistributionLists, + bool includeRooms, bool includeEquipment, + string filterColumn, string filterValue, string sortColumn) + { + #region Demo Mode + if (IsDemoMode) + { + List demoAccounts = new List(); + + if (includeMailboxes) + { + ExchangeAccount m1 = new ExchangeAccount(); + m1.AccountId = 1; + m1.AccountName = "john_fabrikam"; + m1.AccountType = ExchangeAccountType.Mailbox; + m1.DisplayName = "John Smith"; + m1.PrimaryEmailAddress = "john@fabrikam.net"; + demoAccounts.Add(m1); + + + + ExchangeAccount m3 = new ExchangeAccount(); + m3.AccountId = 3; + m3.AccountName = "marry_fabrikam"; + m3.AccountType = ExchangeAccountType.Mailbox; + m3.DisplayName = "Marry Smith"; + m3.PrimaryEmailAddress = "marry@fabrikam.net"; + demoAccounts.Add(m3); + } + + if (includeRooms) + { + ExchangeAccount r1 = new ExchangeAccount(); + r1.AccountId = 20; + r1.AccountName = "room1_fabrikam"; + r1.AccountType = ExchangeAccountType.Room; + r1.DisplayName = "Meeting Room 1"; + r1.PrimaryEmailAddress = "room1@fabrikam.net"; + demoAccounts.Add(r1); + } + + if (includeEquipment) + { + ExchangeAccount e1 = new ExchangeAccount(); + e1.AccountId = 21; + e1.AccountName = "projector_fabrikam"; + e1.AccountType = ExchangeAccountType.Equipment; + e1.DisplayName = "Projector 1"; + e1.PrimaryEmailAddress = "projector@fabrikam.net"; + demoAccounts.Add(e1); + } + + if (includeContacts) + { + ExchangeAccount c1 = new ExchangeAccount(); + c1.AccountId = 4; + c1.AccountName = "pntr1_fabrikam"; + c1.AccountType = ExchangeAccountType.Contact; + c1.DisplayName = "WebsitePanel Support"; + c1.PrimaryEmailAddress = "support@websitepanel.net"; + demoAccounts.Add(c1); + + ExchangeAccount c2 = new ExchangeAccount(); + c2.AccountId = 5; + c2.AccountName = "acc1_fabrikam"; + c2.AccountType = ExchangeAccountType.Contact; + c2.DisplayName = "John Home Account"; + c2.PrimaryEmailAddress = "john@yahoo.com"; + demoAccounts.Add(c2); + } + + if (includeDistributionLists) + { + ExchangeAccount d1 = new ExchangeAccount(); + d1.AccountId = 6; + d1.AccountName = "sales_fabrikam"; + d1.AccountType = ExchangeAccountType.DistributionList; + d1.DisplayName = "Fabrikam Sales Dept"; + d1.PrimaryEmailAddress = "sales@fabrikam.net"; + demoAccounts.Add(d1); + } + + return demoAccounts; + } + #endregion + + return ObjectUtils.CreateListFromDataReader( + DataProvider.SearchExchangeAccounts(SecurityContext.User.UserId, itemId, includeMailboxes, includeContacts, + includeDistributionLists, includeRooms, includeEquipment, + filterColumn, filterValue, sortColumn)); + } + + + + public static ExchangeAccount GetAccount(int itemId, int accountId) + { + #region Demo Mode + if (IsDemoMode) + { + ExchangeAccount m1 = new ExchangeAccount(); + m1.AccountId = 1; + m1.AccountName = "john_fabrikam"; + m1.AccountType = ExchangeAccountType.Mailbox; + m1.DisplayName = "John Smith"; + m1.PrimaryEmailAddress = "john@fabrikam.net"; + return m1; + } + #endregion + + ExchangeAccount account = ObjectUtils.FillObjectFromDataReader( + DataProvider.GetExchangeAccount(itemId, accountId)); + + if (account == null) + return null; + + // decrypt password + account.AccountPassword = CryptoUtils.Decrypt(account.AccountPassword); + + return account; + } + + public static bool CheckAccountCredentials(int itemId, string email, string password) + { + // place log record + TaskManager.StartTask("EXCHANGE", "AUTHENTICATE", email, itemId); + + try + { + // load organization + Organization org = GetOrganization(itemId); + if (org == null) + return false; + + // check credentials + int exchangeServiceId = GetExchangeServiceID(org.PackageId); + ExchangeServer exchange = GetExchangeServer(exchangeServiceId, org.ServiceId); + return exchange.CheckAccountCredentials(email, password); + } + catch (Exception ex) + { + TaskManager.WriteError(ex); + return false; + } + finally + { + TaskManager.CompleteTask(); + } + } + + public static ExchangeAccount SearchAccount(ExchangeAccountType accountType, string primaryEmailAddress) + { + ExchangeAccount account = ObjectUtils.FillObjectFromDataReader( + DataProvider.SearchExchangeAccount(SecurityContext.User.UserId, + (int)accountType, primaryEmailAddress)); + + if (account == null) + return null; + + // decrypt password + account.AccountPassword = CryptoUtils.Decrypt(account.AccountPassword); + + return account; + } + + private static int AddAccount(int itemId, ExchangeAccountType accountType, + string accountName, string displayName, string primaryEmailAddress, bool mailEnabledPublicFolder, + MailboxManagerActions mailboxManagerActions, string samAccountName, string accountPassword, int mailboxPlanId, string subscriberNumber) + { + return DataProvider.AddExchangeAccount(itemId, (int)accountType, + accountName, displayName, primaryEmailAddress, mailEnabledPublicFolder, + mailboxManagerActions.ToString(), samAccountName, CryptoUtils.Encrypt(accountPassword), mailboxPlanId, (string.IsNullOrEmpty(subscriberNumber) ? null : subscriberNumber.Trim())); + } + + private static void UpdateAccount(ExchangeAccount account) + { + DataProvider.UpdateExchangeAccount(account.AccountId, account.AccountName, account.AccountType, account.DisplayName, + account.PrimaryEmailAddress, account.MailEnabledPublicFolder, + account.MailboxManagerActions.ToString(), account.SamAccountName, account.AccountPassword, account.MailboxPlanId, + (string.IsNullOrEmpty(account.SubscriberNumber) ? null : account.SubscriberNumber.Trim())); + } + + private static void DeleteAccount(int itemId, int accountId) + { + // try to get organization + if (GetOrganization(itemId) == null) + return; + + DataProvider.DeleteExchangeAccount(itemId, accountId); + } + + private static string BuildAccountName(string orgId, string name) + { + string accountName = name = name.Replace(" ", ""); + int counter = 0; + bool bFound = false; + + if (!AccountExists(accountName)) return accountName; + + do + { + accountName = genSamLogin(name, counter.ToString("d5")); + + if (!AccountExists(accountName)) bFound = true; + + counter++; + } + while (!bFound); + + return accountName; + } + + private static string genSamLogin(string login, string strCounter) + { + int maxLogin = 20; + int fullLen = login.Length + strCounter.Length; + if (fullLen <= maxLogin) + return login + strCounter; + else + { + if (login.Length - (fullLen - maxLogin) > 0) + return login.Substring(0, login.Length - (fullLen - maxLogin)) + strCounter; + else return strCounter; // ???? + } + + } + + + #endregion + + #region Account Email Addresses + private static bool EmailAddressExists(string emailAddress) + { + return DataProvider.ExchangeAccountEmailAddressExists(emailAddress); + } + + + private static ExchangeEmailAddress[] GetAccountEmailAddresses(int itemId, int accountId) + { + #region Demo Mode + if (IsDemoMode) + { + List demoEmails = new List(); + ExchangeEmailAddress e1 = new ExchangeEmailAddress(); + e1.EmailAddress = "john@fabrikam.net"; + e1.IsPrimary = true; + demoEmails.Add(e1); + + ExchangeEmailAddress e2 = new ExchangeEmailAddress(); + e2.EmailAddress = "john.smith@fabrikam.net"; + demoEmails.Add(e2); + + ExchangeEmailAddress e3 = new ExchangeEmailAddress(); + e3.EmailAddress = "john@fabrikam.hosted-exchange.com"; + demoEmails.Add(e3); + return demoEmails.ToArray(); + } + #endregion + + List emails = ObjectUtils.CreateListFromDataReader( + DataProvider.GetExchangeAccountEmailAddresses(accountId)); + + // load account + ExchangeAccount account = GetAccount(itemId, accountId); + + foreach (ExchangeEmailAddress email in emails) + { + if (String.Compare(account.PrimaryEmailAddress, email.EmailAddress, true) == 0) + { + email.IsPrimary = true; + } + + if (String.Compare(account.UserPrincipalName, email.EmailAddress, true) == 0) + { + email.IsUserPrincipalName = true; + } + + } + + return emails.ToArray(); + } + + private static void AddAccountEmailAddress(int accountId, string emailAddress) + { + DataProvider.AddExchangeAccountEmailAddress(accountId, emailAddress); + } + + private static void DeleteAccountEmailAddresses(int accountId, string[] emailAddresses) + { + foreach (string emailAddress in emailAddresses) + DataProvider.DeleteExchangeAccountEmailAddress(accountId, emailAddress); + } + + #endregion + + #region Domains + public static List GetOrganizationDomains(int itemId) + { + #region Demo Mode + if (IsDemoMode) + { + List demoDomains = new List(); + ExchangeDomainName d1 = new ExchangeDomainName(); + d1.DomainId = 1; + d1.DomainName = "fabrikam.hosted-exchange.com"; + d1.IsDefault = false; + d1.IsHost = true; + demoDomains.Add(d1); + + ExchangeDomainName d2 = new ExchangeDomainName(); + d2.DomainId = 2; + d2.DomainName = "fabrikam.net"; + d2.IsDefault = true; + d2.IsHost = false; + demoDomains.Add(d2); + + return demoDomains; + } + #endregion + + // load organization + Organization org = (Organization)PackageController.GetPackageItem(itemId); + if (org == null) + return null; + + // load all domains + List domains = ObjectUtils.CreateListFromDataReader( + DataProvider.GetExchangeOrganizationDomains(itemId)); + + // set default domain + foreach (ExchangeDomainName domain in domains) + { + if (String.Compare(domain.DomainName, org.DefaultDomain, true) == 0) + { + domain.IsDefault = true; + break; + } + } + + return domains; + } + + public static int AddAuthoritativeDomain(int itemId, int domainId) + { + // check account + int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); + if (accountCheck < 0) return accountCheck; + + // place log record + TaskManager.StartTask("EXCHANGE", "ADD_DOMAIN", itemId, new BackgroundTaskParameter("Domain ID", domainId)); + + try + { + // load organization + Organization org = (Organization)PackageController.GetPackageItem(itemId); + if (org == null) + return -1; + + // load domain + DomainInfo domain = ServerController.GetDomain(domainId); + if (domain == null) + return -1; + + + // delete domain on Exchange + int[] hubTransportServiceIds; + int[] clientAccessServiceIds; + int exchangeServiceId = GetExchangeServiceID(org.PackageId); + GetExchangeServices(exchangeServiceId, out hubTransportServiceIds, out clientAccessServiceIds); + + foreach (int id in hubTransportServiceIds) + { + ExchangeServer hubTransportRole = null; + try + { + hubTransportRole = GetExchangeServer(id, org.ServiceId); + } + catch (Exception ex) + { + TaskManager.WriteError(ex); + continue; + } + + string[] domains = hubTransportRole.GetAuthoritativeDomains(); + if (domains != null) + Array.Sort(domains); + + if (domains == null || Array.BinarySearch(domains, domain.DomainName) < 0) + hubTransportRole.AddAuthoritativeDomain(domain.DomainName); + break; + } + + //Add the service records + if (domain != null) + { + if (domain.ZoneItemId != 0) + { + ServerController.AddServiceDNSRecords(org.PackageId, ResourceGroups.Exchange, domain, ""); + } + } + + return 0; + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + } + + public static int ChangeAcceptedDomainType(int itemId, int domainId, ExchangeAcceptedDomainType domainType) + { + // check account + int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); + if (accountCheck < 0) return accountCheck; + + // place log record + + List parameters = new List(); + parameters.Add(new BackgroundTaskParameter("Domain ID", domainId)); + parameters.Add(new BackgroundTaskParameter("Domain Type", domainType.ToString())); + + TaskManager.StartTask("EXCHANGE", "CHANGE_DOMAIN_TYPE", itemId, parameters); + + try + { + // load organization + Organization org = (Organization)PackageController.GetPackageItem(itemId); + if (org == null) + return -1; + + // load domain + DomainInfo domain = ServerController.GetDomain(domainId); + if (domain == null) + return -1; + + int[] hubTransportServiceIds; + int[] clientAccessServiceIds; + int exchangeServiceId = GetExchangeServiceID(org.PackageId); + GetExchangeServices(exchangeServiceId, out hubTransportServiceIds, out clientAccessServiceIds); + + foreach (int id in hubTransportServiceIds) + { + ExchangeServer hubTransportRole = null; + try + { + hubTransportRole = GetExchangeServer(id, org.ServiceId); + } + catch (Exception ex) + { + TaskManager.WriteError(ex); + continue; + } + + hubTransportRole.ChangeAcceptedDomainType(domain.DomainName, domainType); + break; + + } + return 0; + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + } + + public static int DeleteAuthoritativeDomain(int itemId, int domainId) + { + // check account + int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); + if (accountCheck < 0) return accountCheck; + + // place log record + TaskManager.StartTask("EXCHANGE", "DELETE_DOMAIN", itemId, new BackgroundTaskParameter("Domain ID", domainId)); + + try + { + // load organization + Organization org = (Organization)PackageController.GetPackageItem(itemId); + if (org == null) + return -1; + + // load domain + DomainInfo domain = ServerController.GetDomain(domainId); + if(domain == null) + return -1; + + if (DataProvider.CheckDomainUsedByHostedOrganization(domain.DomainName) == 1) + { + return -1; + } + + // delete domain on Exchange + int[] hubTransportServiceIds; + int[] clientAccessServiceIds; + int exchangeServiceId = GetExchangeServiceID(org.PackageId); + GetExchangeServices(exchangeServiceId, out hubTransportServiceIds, out clientAccessServiceIds); + + foreach (int id in hubTransportServiceIds) + { + ExchangeServer hubTransportRole = null; + try + { + hubTransportRole = GetExchangeServer(id, org.ServiceId); + } + catch (Exception ex) + { + TaskManager.WriteError(ex); + continue; + } + + hubTransportRole.DeleteAuthoritativeDomain(domain.DomainName); + break; + + } + + //Add the service records + if (domain != null) + { + if (domain.ZoneItemId != 0) + { + ServerController.RemoveServiceDNSRecords(org.PackageId, ResourceGroups.Exchange, domain, "", false); + } + } + + + + return 0; + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + } + + + #endregion + + #region Mailboxes + + private static void UpdateExchangeAccount(int accountId, string accountName, ExchangeAccountType accountType, + string displayName, string primaryEmailAddress, bool mailEnabledPublicFolder, + string mailboxManagerActions, string samAccountName, string accountPassword, int mailboxPlanId, string subscriberNumber) + { + DataProvider.UpdateExchangeAccount(accountId, + accountName, + accountType, + displayName, + primaryEmailAddress, + mailEnabledPublicFolder, + mailboxManagerActions, + samAccountName, + CryptoUtils.Encrypt(accountPassword), + mailboxPlanId, + (string.IsNullOrEmpty(subscriberNumber) ? null : subscriberNumber.Trim())); + } + + + public static int CreateMailbox(int itemId, int accountId, ExchangeAccountType accountType, string accountName, + string displayName, string name, string domain, string password, bool sendSetupInstructions, string setupInstructionMailAddress, int mailboxPlanId, string subscriberNumber) + { + // check account + int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); + if (accountCheck < 0) return accountCheck; + + // check mailbox quota + OrganizationStatistics orgStats = GetOrganizationStatistics(itemId); + if ((orgStats.AllocatedMailboxes > -1) && (orgStats.CreatedMailboxes >= orgStats.AllocatedMailboxes)) + return BusinessErrorCodes.ERROR_EXCHANGE_MAILBOXES_QUOTA_LIMIT; + + + // place log record + TaskManager.StartTask("EXCHANGE", "CREATE_MAILBOX", itemId); + + bool userCreated = false; + Organization org = null; + try + { + accountName = accountName.Trim(); + displayName = displayName.Trim(); + name = name.Trim(); + domain = domain.Trim(); + + + // load organization + org = GetOrganization(itemId); + if (org == null) + return -1; + + // e-mail + string email = name + "@" + domain; + bool enabled = (accountType == ExchangeAccountType.Mailbox); + + + // string accountName = string.Empty; + //Create AD user if needed + if (accountId == 0) + { + accountId = OrganizationController.CreateUser(org.Id, displayName, name, domain, password, subscriberNumber, enabled, false, string.Empty, out accountName); + if (accountId > 0) + userCreated = true; + } + if (accountId < 0) + return accountId; + + // get mailbox settings + Organizations orgProxy = OrganizationController.GetOrganizationProxy(org.ServiceId); + OrganizationUser retUser = orgProxy.GetUserGeneralSettings(accountName, org.OrganizationId); + + + int exchangeServiceId = PackageController.GetPackageServiceId(org.PackageId, ResourceGroups.Exchange); + + ExchangeServer exchange = GetExchangeServer(exchangeServiceId, org.ServiceId); + + + //Create Exchange Organization + if (string.IsNullOrEmpty(org.GlobalAddressList)) + { + ExtendToExchangeOrganization(ref org); + + PackageController.UpdatePackageItem(org); + } + + // check package + int packageCheck = SecurityContext.CheckPackage(org.PackageId, DemandPackage.IsActive); + if (packageCheck < 0) return packageCheck; + + //verify if the mailbox fits in the storage quota + // load package context + PackageContext cntx = PackageController.GetPackageContext(org.PackageId); + + int maxDiskSpace = -1; + int quotaUsed = 0; + if (cntx.Quotas.ContainsKey(Quotas.EXCHANGE2007_DISKSPACE) + && cntx.Quotas[Quotas.EXCHANGE2007_DISKSPACE].QuotaAllocatedValue > 0) + { + maxDiskSpace = cntx.Quotas[Quotas.EXCHANGE2007_DISKSPACE].QuotaAllocatedValue; + quotaUsed = cntx.Quotas[Quotas.EXCHANGE2007_DISKSPACE].QuotaUsedValue; + } + + ExchangeMailboxPlan plan = GetExchangeMailboxPlan(itemId, mailboxPlanId); + if (maxDiskSpace != -1) + { + if (plan.MailboxSizeMB == -1) + return BusinessErrorCodes.ERROR_EXCHANGE_STORAGE_QUOTAS_EXCEED_HOST_VALUES; + + if ((quotaUsed + plan.MailboxSizeMB) > (maxDiskSpace)) + return BusinessErrorCodes.ERROR_EXCHANGE_STORAGE_QUOTAS_EXCEED_HOST_VALUES; + } + + int maxRecoverableItemsSpace = -1; + int quotaRecoverableItemsUsed = 0; + if (cntx.Quotas.ContainsKey(Quotas.EXCHANGE2007_RECOVERABLEITEMSSPACE) + && cntx.Quotas[Quotas.EXCHANGE2007_RECOVERABLEITEMSSPACE].QuotaAllocatedValue > 0) + { + maxRecoverableItemsSpace = cntx.Quotas[Quotas.EXCHANGE2007_RECOVERABLEITEMSSPACE].QuotaAllocatedValue; + quotaRecoverableItemsUsed = cntx.Quotas[Quotas.EXCHANGE2007_RECOVERABLEITEMSSPACE].QuotaUsedValue; + } + + if (maxRecoverableItemsSpace != -1) + { + if (plan.RecoverableItemsSpace == -1) + return BusinessErrorCodes.ERROR_EXCHANGE_STORAGE_QUOTAS_EXCEED_HOST_VALUES; + + if ((quotaRecoverableItemsUsed + plan.RecoverableItemsSpace) > (maxRecoverableItemsSpace)) + return BusinessErrorCodes.ERROR_EXCHANGE_STORAGE_QUOTAS_EXCEED_HOST_VALUES; + } + + + //GetServiceSettings + StringDictionary primSettings = ServerController.GetServiceSettings(exchangeServiceId); + + string samAccount = exchange.CreateMailEnableUser(email, org.OrganizationId, org.DistinguishedName, accountType, primSettings["mailboxdatabase"], + org.OfflineAddressBook, + org.AddressBookPolicy, + retUser.SamAccountName, + plan.EnablePOP, + plan.EnableIMAP, + plan.EnableOWA, + plan.EnableMAPI, + plan.EnableActiveSync, + plan.MailboxSizeMB != -1 ? (((long)plan.IssueWarningPct * (long)plan.MailboxSizeMB * 1024) / 100) : -1, + plan.MailboxSizeMB != -1 ? (((long)plan.ProhibitSendPct * (long)plan.MailboxSizeMB * 1024) / 100) : -1, + plan.MailboxSizeMB != -1 ? (((long)plan.ProhibitSendReceivePct * (long)plan.MailboxSizeMB * 1024) / 100) : -1, + plan.KeepDeletedItemsDays, + plan.MaxRecipients, + plan.MaxSendMessageSizeKB, + plan.MaxReceiveMessageSizeKB, + plan.HideFromAddressBook, + Convert.ToBoolean(cntx.Quotas[Quotas.EXCHANGE2007_ISCONSUMER].QuotaAllocatedValue), + plan.AllowLitigationHold, + plan.RecoverableItemsSpace != -1 ? (plan.RecoverableItemsSpace * 1024) : -1, + plan.RecoverableItemsSpace != -1 ? (((long)plan.RecoverableItemsWarningPct * (long)plan.RecoverableItemsSpace * 1024) / 100) : -1); + + MailboxManagerActions pmmActions = MailboxManagerActions.GeneralSettings + | MailboxManagerActions.MailFlowSettings + | MailboxManagerActions.AdvancedSettings + | MailboxManagerActions.EmailAddresses; + + + UpdateExchangeAccount(accountId, accountName, accountType, displayName, email, false, pmmActions.ToString(), samAccount, password, mailboxPlanId, subscriberNumber); + + + + // send setup instructions + if (sendSetupInstructions) + { + try + { + // send setup instructions + int sendResult = SendMailboxSetupInstructions(itemId, accountId, true, setupInstructionMailAddress, null); + if (sendResult < 0) + TaskManager.WriteWarning("Setup instructions were not sent. Error code: " + sendResult); + } + catch (Exception ex) + { + TaskManager.WriteError(ex); + } + } + + try + { + // update OAB + // check if this is the first mailbox within the organization + if (GetAccounts(itemId, ExchangeAccountType.Mailbox).Count == 1) + exchange.UpdateOrganizationOfflineAddressBook(org.OfflineAddressBook); + } + catch (Exception ex) + { + TaskManager.WriteError(ex); + } + + return accountId; + } + catch (Exception ex) + { + //rollback AD user + if (userCreated) + { + try + { + OrganizationController.DeleteUser(org.Id, accountId); + } + catch (Exception rollbackException) + { + TaskManager.WriteError(rollbackException); + } + } + throw TaskManager.WriteError(ex); + + } + finally + { + TaskManager.CompleteTask(); + } + } + + public static int DisableMailbox(int itemId, int accountId) + { + // check account + int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); + if (accountCheck < 0) return accountCheck; + + // place log record + TaskManager.StartTask("EXCHANGE", "DISABLE_MAILBOX", itemId); + + try + { + // load organization + Organization org = GetOrganization(itemId); + if (org == null) + return -1; + + // load account + ExchangeAccount account = GetAccount(itemId, accountId); + + if (BlackBerryController.CheckBlackBerryUserExists(accountId)) + { + BlackBerryController.DeleteBlackBerryUser(itemId, accountId); + } + + // delete mailbox + int serviceExchangeId = GetExchangeServiceID(org.PackageId); + ExchangeServer exchange = GetExchangeServer(serviceExchangeId, org.ServiceId); + exchange.DisableMailbox(account.UserPrincipalName); + + account.AccountType = ExchangeAccountType.User; + account.MailEnabledPublicFolder = false; + account.AccountPassword = null; + UpdateAccount(account); + DataProvider.DeleteUserEmailAddresses(account.AccountId, account.PrimaryEmailAddress); + + return 0; + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + } + + + public static int DeleteMailbox(int itemId, int accountId) + { + // check account + int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); + if (accountCheck < 0) return accountCheck; + + // place log record + TaskManager.StartTask("EXCHANGE", "DELETE_MAILBOX", itemId); + + try + { + // load organization + Organization org = GetOrganization(itemId); + if (org == null) + return -1; + + // load account + ExchangeAccount account = GetAccount(itemId, accountId); + + if (BlackBerryController.CheckBlackBerryUserExists(accountId)) + { + BlackBerryController.DeleteBlackBerryUser(itemId, accountId); + } + + + // delete mailbox + int serviceExchangeId = GetExchangeServiceID(org.PackageId); + ExchangeServer exchange = GetExchangeServer(serviceExchangeId, org.ServiceId); + exchange.DeleteMailbox(account.UserPrincipalName); + + + + // unregister account + DeleteAccount(itemId, accountId); + + return 0; + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + } + + private static ExchangeMailbox GetDemoMailboxSettings() + { + ExchangeMailbox mb = new ExchangeMailbox(); + mb.DisplayName = "John Smith"; + mb.Domain = "HSTDEXCH1"; + mb.AccountName = "john_fabrikam"; + mb.EnableForwarding = true; + mb.EnableIMAP = true; + mb.EnableMAPI = true; + mb.EnablePOP = true; + mb.FirstName = "John"; + mb.LastName = "Smith"; + mb.ForwardingAccount = GetAccounts(0, ExchangeAccountType.Mailbox)[1]; + mb.EnableForwarding = true; + mb.IssueWarningKB = 150000; + mb.KeepDeletedItemsDays = 14; + mb.LastLogoff = DateTime.Now; + mb.LastLogon = DateTime.Now; + mb.ManagerAccount = GetAccounts(0, ExchangeAccountType.Mailbox)[1]; + mb.MaxReceiveMessageSizeKB = 20000; + mb.MaxRecipients = 30; + mb.MaxSendMessageSizeKB = 10000; + mb.ProhibitSendKB = 160000; + mb.ProhibitSendReceiveKB = 170000; + mb.TotalItems = 5; + mb.TotalSizeMB = 4; + return mb; + } + + public static ExchangeMailbox GetMailboxGeneralSettings(int itemId, int accountId) + { + #region Demo Mode + if (IsDemoMode) + { + return GetDemoMailboxSettings(); + } + #endregion + + // place log record + TaskManager.StartTask("EXCHANGE", "GET_MAILBOX_GENERAL", itemId); + + try + { + // load organization + Organization org = GetOrganization(itemId); + if (org == null) + return null; + + // load account + ExchangeAccount account = GetAccount(itemId, accountId); + + // get mailbox settings + + int exchangeServiceId = GetExchangeServiceID(org.PackageId); + ExchangeServer exchange = GetExchangeServer(exchangeServiceId, org.ServiceId); + return exchange.GetMailboxGeneralSettings(account.UserPrincipalName); + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + } + + public static int SetMailboxGeneralSettings(int itemId, int accountId, bool hideAddressBook, bool disabled) + { + // check account + int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); + if (accountCheck < 0) return accountCheck; + + // place log record + TaskManager.StartTask("EXCHANGE", "UPDATE_MAILBOX_GENERAL", itemId); + + try + { + // load organization + Organization org = GetOrganization(itemId); + if (org == null) + return -1; + + // check package + int packageCheck = SecurityContext.CheckPackage(org.PackageId, DemandPackage.IsActive); + if (packageCheck < 0) return packageCheck; + + // load account + ExchangeAccount account = GetAccount(itemId, accountId); + + // get mailbox settings + int exchangeServiceId = GetExchangeServiceID(org.PackageId); + ExchangeServer exchange = GetExchangeServer(exchangeServiceId, org.ServiceId); + + + PackageContext cntx = PackageController.GetPackageContext(org.PackageId); + + if (Convert.ToBoolean(cntx.Quotas[Quotas.EXCHANGE2007_ISCONSUMER].QuotaAllocatedValue)) + hideAddressBook = true; + + exchange.SetMailboxGeneralSettings( + account.UserPrincipalName, + hideAddressBook, + disabled); + + return 0; + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + } + + public static ExchangeEmailAddress[] GetMailboxEmailAddresses(int itemId, int accountId) + { + // place log record + TaskManager.StartTask("EXCHANGE", "GET_MAILBOX_ADDRESSES", itemId); + + try + { + return GetAccountEmailAddresses(itemId, accountId); + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + } + + public static int AddMailboxEmailAddress(int itemId, int accountId, string emailAddress) + { + // check account + int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); + if (accountCheck < 0) return accountCheck; + + // place log record + TaskManager.StartTask("EXCHANGE", "ADD_MAILBOX_ADDRESS", itemId); + + try + { + // check + if (EmailAddressExists(emailAddress)) + return BusinessErrorCodes.ERROR_EXCHANGE_EMAIL_EXISTS; + + // load organization + Organization org = GetOrganization(itemId); + if (org == null) + return -1; + + // check package + int packageCheck = SecurityContext.CheckPackage(org.PackageId, DemandPackage.IsActive); + if (packageCheck < 0) return packageCheck; + + // load account + ExchangeAccount account = GetAccount(itemId, accountId); + + // add e-mail + AddAccountEmailAddress(accountId, emailAddress); + + // update e-mail addresses + int exchangeServiceId = GetExchangeServiceID(org.PackageId); + ExchangeServer exchange = GetExchangeServer(exchangeServiceId, org.ServiceId); + + exchange.SetMailboxEmailAddresses( + account.UserPrincipalName, + GetAccountSimpleEmailAddresses(itemId, accountId)); + + return 0; + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + } + + private static OCSServer GetOCSProxy(int itemId) + { + Organization org = OrganizationController.GetOrganization(itemId); + int serviceId = PackageController.GetPackageServiceId(org.PackageId, ResourceGroups.OCS); + + OCSServer ocs = new OCSServer(); + ServiceProviderProxy.Init(ocs, serviceId); + + + return ocs; + } + + public static int SetMailboxPrimaryEmailAddress(int itemId, int accountId, string emailAddress) + { + // check account + int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); + if (accountCheck < 0) return accountCheck; + + // place log record + TaskManager.StartTask("EXCHANGE", "SET_PRIMARY_MAILBOX_ADDRESS", itemId); + + try + { + // get account + ExchangeAccount account = GetAccount(itemId, accountId); + account.PrimaryEmailAddress = emailAddress; + + // update exchange + Organization org = GetOrganization(itemId); + if (org == null) + return -1; + + // check package + int packageCheck = SecurityContext.CheckPackage(org.PackageId, DemandPackage.IsActive); + if (packageCheck < 0) return packageCheck; + + int exchangeServiceId = GetExchangeServiceID(org.PackageId); + ExchangeServer exchange = GetExchangeServer(exchangeServiceId, org.ServiceId); + + exchange.SetMailboxPrimaryEmailAddress( + account.UserPrincipalName, + emailAddress); + + if (DataProvider.CheckOCSUserExists(account.AccountId)) + { + OCSServer ocs = GetOCSProxy(itemId); + string instanceId = DataProvider.GetOCSUserInstanceID(account.AccountId); + ocs.SetUserPrimaryUri(instanceId, emailAddress); + } + + if (DataProvider.CheckLyncUserExists(account.AccountId)) + { + LyncController.SetLyncUserGeneralSettings(itemId, accountId, emailAddress, null); + } + + // save account + account.AccountPassword = null; + UpdateAccount(account); + + return 0; + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + } + + public static int DeleteMailboxEmailAddresses(int itemId, int accountId, string[] emailAddresses) + { + // check account + int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); + if (accountCheck < 0) return accountCheck; + + // place log record + TaskManager.StartTask("EXCHANGE", "DELETE_MAILBOX_ADDRESSES", itemId); + + try + { + // get account + ExchangeAccount account = GetAccount(itemId, accountId); + + // delete e-mail addresses + List toDelete = new List(); + foreach (string emailAddress in emailAddresses) + { + if ((String.Compare(account.PrimaryEmailAddress, emailAddress, true) != 0) & + (String.Compare(account.UserPrincipalName, emailAddress, true) != 0)) + toDelete.Add(emailAddress); + } + + // delete from meta-base + DeleteAccountEmailAddresses(accountId, toDelete.ToArray()); + + // delete from Exchange + Organization org = GetOrganization(itemId); + if (org == null) + return -1; + + // update e-mail addresses + int exchangeServiceId = GetExchangeServiceID(org.PackageId); + ExchangeServer exchange = GetExchangeServer(exchangeServiceId, org.ServiceId); + + exchange.SetMailboxEmailAddresses( + account.UserPrincipalName, + GetAccountSimpleEmailAddresses(itemId, accountId)); + + return 0; + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + } + + public static ExchangeMailbox GetMailboxMailFlowSettings(int itemId, int accountId) + { + #region Demo Mode + if (IsDemoMode) + { + return GetDemoMailboxSettings(); + } + #endregion + + // place log record + TaskManager.StartTask("EXCHANGE", "GET_MAILBOX_MAILFLOW", itemId); + + try + { + // load organization + Organization org = GetOrganization(itemId); + if (org == null) + return null; + + // load account + ExchangeAccount account = GetAccount(itemId, accountId); + + // get mailbox settings + int exchangeServiceId = GetExchangeServiceID(org.PackageId); + ExchangeServer exchange = GetExchangeServer(exchangeServiceId, org.ServiceId); + ExchangeMailbox mailbox = exchange.GetMailboxMailFlowSettings(account.UserPrincipalName); + mailbox.DisplayName = account.DisplayName; + return mailbox; + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + } + + public static int SetMailboxMailFlowSettings(int itemId, int accountId, + bool enableForwarding, string forwardingAccountName, bool forwardToBoth, + string[] sendOnBehalfAccounts, string[] acceptAccounts, string[] rejectAccounts, + bool requireSenderAuthentication) + { + // check account + int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); + if (accountCheck < 0) return accountCheck; + + // place log record + TaskManager.StartTask("EXCHANGE", "UPDATE_MAILBOX_MAILFLOW", itemId); + + try + { + // load organization + Organization org = GetOrganization(itemId); + if (org == null) + return -1; + + // check package + int packageCheck = SecurityContext.CheckPackage(org.PackageId, DemandPackage.IsActive); + if (packageCheck < 0) return packageCheck; + + // load account + ExchangeAccount account = GetAccount(itemId, accountId); + + // get mailbox settings + int exchangeServiceId = GetExchangeServiceID(org.PackageId); + ExchangeServer exchange = GetExchangeServer(exchangeServiceId, org.ServiceId); + + exchange.SetMailboxMailFlowSettings(account.UserPrincipalName, + enableForwarding, + forwardingAccountName, + forwardToBoth, + sendOnBehalfAccounts, + acceptAccounts, + rejectAccounts, + requireSenderAuthentication); + + return 0; + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + } + + + public static ExchangeMailbox GetMailboxAdvancedSettings(int itemId, int accountId) + { + #region Demo Mode + if (IsDemoMode) + { + return GetDemoMailboxSettings(); + } + #endregion + + // place log record + TaskManager.StartTask("EXCHANGE", "GET_MAILBOX_ADVANCED", itemId); + + try + { + // load organization + Organization org = GetOrganization(itemId); + if (org == null) + return null; + + // load account + ExchangeAccount account = GetAccount(itemId, accountId); + + // get mailbox settings + int exchangeServiceId = GetExchangeServiceID(org.PackageId); + ExchangeServer exchange = GetExchangeServer(exchangeServiceId, org.ServiceId); + ExchangeMailbox mailbox = exchange.GetMailboxAdvancedSettings(account.UserPrincipalName); + mailbox.DisplayName = account.DisplayName; + return mailbox; + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + } + + public static int SetMailboxManagerSettings(int itemId, int accountId, bool pmmAllowed, MailboxManagerActions action) + { + // check account + int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); + if (accountCheck < 0) return accountCheck; + + // place log record + TaskManager.StartTask("EXCHANGE", "UPDATE_MAILBOX_GENERAL", itemId); + + try + { + // load organization + Organization org = GetOrganization(itemId); + if (org == null) + return -1; + + // check package + int packageCheck = SecurityContext.CheckPackage(org.PackageId, DemandPackage.IsActive); + if (packageCheck < 0) return packageCheck; + + // load account + ExchangeAccount account = GetAccount(itemId, accountId); + + // PMM settings + if (pmmAllowed) account.MailboxManagerActions |= action; + else account.MailboxManagerActions &= ~action; + + // update account + account.AccountPassword = null; + UpdateAccount(account); + + return 0; + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + } + + public static string GetMailboxSetupInstructions(int itemId, int accountId, bool pmm, bool emailMode, bool signup) + { + #region Demo Mode + if (IsDemoMode) + { + return string.Empty; + } + #endregion + + // load organization + Organization org = GetOrganization(itemId); + if (org == null) + return null; + + // load user info + UserInfo user = PackageController.GetPackageOwner(org.PackageId); + + // get letter settings + UserSettings settings = UserController.GetUserSettings(user.UserId, UserSettings.EXCHANGE_MAILBOX_SETUP_LETTER); + + string settingName = user.HtmlMail ? "HtmlBody" : "TextBody"; + string body = settings[settingName]; + if (String.IsNullOrEmpty(body)) + return null; + + string result = EvaluateMailboxTemplate(itemId, accountId, pmm, false, false, body); + return user.HtmlMail ? result : result.Replace("\n", "
"); + } + + private static string EvaluateMailboxTemplate(int itemId, int accountId, + bool pmm, bool emailMode, bool signup, string template) + { + Hashtable items = new Hashtable(); + + // load organization + Organization org = GetOrganization(itemId); + if (org == null) + return null; + + // add organization + items["Organization"] = org; + + // load account + ExchangeAccount account = GetAccount(itemId, accountId); + if (account == null) + return null; + + // add account + items["Account"] = account; + items["AccountDomain"] = account.PrimaryEmailAddress.Substring(account.PrimaryEmailAddress.IndexOf("@") + 1); + items["DefaultDomain"] = org.DefaultDomain; + + if (!String.IsNullOrEmpty(account.SamAccountName)) + { + int idx = account.SamAccountName.IndexOf("\\"); + items["SamDomain"] = account.SamAccountName.Substring(0, idx); + items["SamUsername"] = account.SamAccountName.Substring(idx + 1); + } + + // name servers + PackageSettings packageSettings = PackageController.GetPackageSettings(org.PackageId, PackageSettings.NAME_SERVERS); + string[] nameServers = new string[] { }; + if (!String.IsNullOrEmpty(packageSettings["NameServers"])) + nameServers = packageSettings["NameServers"].Split(';'); + + items["NameServers"] = nameServers; + + // service settings + int exchangeServiceId = GetExchangeServiceID(org.PackageId); + StringDictionary exchangeSettings = ServerController.GetServiceSettings(exchangeServiceId); + if (exchangeSettings != null) + { + items["TempDomain"] = exchangeSettings["TempDomain"]; + items["AutodiscoverIP"] = exchangeSettings["AutodiscoverIP"]; + items["AutodiscoverDomain"] = exchangeSettings["AutodiscoverDomain"]; + items["OwaUrl"] = exchangeSettings["OwaUrl"]; + items["ActiveSyncServer"] = exchangeSettings["ActiveSyncServer"]; + items["SmtpServers"] = Utils.ParseDelimitedString(exchangeSettings["SmtpServers"], '\n'); + } + + items["Email"] = emailMode; + items["Signup"] = signup; + items["PMM"] = pmm; + + // evaluate template + return PackageController.EvaluateTemplate(template, items); + } + + public static int SendMailboxSetupInstructions(int itemId, int accountId, bool signup, string to, string cc) + { + // check account + int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo); + if (accountCheck < 0) return accountCheck; + + // load organization + Organization org = GetOrganization(itemId); + if (org == null) + return -1; + + // load user info + UserInfo user = PackageController.GetPackageOwner(org.PackageId); + + // get letter settings + UserSettings settings = UserController.GetUserSettings(user.UserId, UserSettings.EXCHANGE_MAILBOX_SETUP_LETTER); + + string from = settings["From"]; + if (cc == null) + cc = settings["CC"]; + string subject = settings["Subject"]; + string body = user.HtmlMail ? settings["HtmlBody"] : settings["TextBody"]; + bool isHtml = user.HtmlMail; + + MailPriority priority = MailPriority.Normal; + if (!String.IsNullOrEmpty(settings["Priority"])) + priority = (MailPriority)Enum.Parse(typeof(MailPriority), settings["Priority"], true); + + if (String.IsNullOrEmpty(body)) + return 0;// BusinessErrorCodes.ERROR_SETTINGS_ACCOUNT_LETTER_EMPTY_BODY; + + // load user info + if (to == null) + to = user.Email; + + subject = EvaluateMailboxTemplate(itemId, accountId, false, true, signup, subject); + body = EvaluateMailboxTemplate(itemId, accountId, false, true, signup, body); + + // send message + return MailHelper.SendMessage(from, to, cc, subject, body, priority, isHtml); + } + + + public static ExchangeMailbox GetMailboxPermissions(int itemId, int accountId) + { + // place log record + TaskManager.StartTask("EXCHANGE", "GET_MAILBOX_PERMISSIONS", itemId); + + try + { + // load organization + Organization org = GetOrganization(itemId); + if (org == null) + return null; + + // load account + ExchangeAccount account = GetAccount(itemId, accountId); + + // get mailbox settings + int exchangeServiceId = GetExchangeServiceID(org.PackageId); + ExchangeServer exchange = GetExchangeServer(exchangeServiceId, org.ServiceId); + ExchangeMailbox mailbox = exchange.GetMailboxPermissions(org.OrganizationId, account.UserPrincipalName); + mailbox.DisplayName = account.DisplayName; + return mailbox; + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + } + + public static int SetMailboxPermissions(int itemId, int accountId, string[] sendAsaccounts, string[] fullAccessAcounts) + { + // check account + int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); + if (accountCheck < 0) return accountCheck; + + // place log record + TaskManager.StartTask("EXCHANGE", "SET_MAILBOX_PERMISSIONS", itemId); + + try + { + // load organization + Organization org = GetOrganization(itemId); + if (org == null) + return -1; + + // check package + int packageCheck = SecurityContext.CheckPackage(org.PackageId, DemandPackage.IsActive); + if (packageCheck < 0) return packageCheck; + + // load account + ExchangeAccount account = GetAccount(itemId, accountId); + + // get mailbox settings + int exchangeServiceId = GetExchangeServiceID(org.PackageId); + ExchangeServer exchange = GetExchangeServer(exchangeServiceId, org.ServiceId); + + exchange.SetMailboxPermissions(org.OrganizationId, account.UserPrincipalName, sendAsaccounts, fullAccessAcounts); + + + return 0; + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + + } + + + #endregion + + + #region Mailbox plan + public static int SetExchangeMailboxPlan(int itemId, int accountId, int mailboxPlanId) + { + // check account + int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); + if (accountCheck < 0) return accountCheck; + + // place log record + TaskManager.StartTask("EXCHANGE", "SET_MAILBOXPLAN", itemId); + + try + { + // load organization + Organization org = GetOrganization(itemId); + if (org == null) + return -1; + + // check package + int packageCheck = SecurityContext.CheckPackage(org.PackageId, DemandPackage.IsActive); + if (packageCheck < 0) return packageCheck; + + // load account + ExchangeAccount account = GetAccount(itemId, accountId); + + // load package context + PackageContext cntx = PackageController.GetPackageContext(org.PackageId); + + int maxDiskSpace = -1; + int quotaUsed = 0; + if (cntx.Quotas.ContainsKey(Quotas.EXCHANGE2007_DISKSPACE) + && cntx.Quotas[Quotas.EXCHANGE2007_DISKSPACE].QuotaAllocatedValue > 0) + { + maxDiskSpace = cntx.Quotas[Quotas.EXCHANGE2007_DISKSPACE].QuotaAllocatedValue; + quotaUsed = cntx.Quotas[Quotas.EXCHANGE2007_DISKSPACE].QuotaUsedValue; + } + + ExchangeMailboxPlan plan = GetExchangeMailboxPlan(itemId, mailboxPlanId); + + if (maxDiskSpace != -1) + { + if (plan.MailboxSizeMB == -1) + return BusinessErrorCodes.ERROR_EXCHANGE_STORAGE_QUOTAS_EXCEED_HOST_VALUES; + + ExchangeAccount exchangeAccount = GetAccount(itemId, accountId); + if (exchangeAccount.MailboxPlanId > 0) + { + ExchangeMailboxPlan oldPlan = GetExchangeMailboxPlan(itemId, exchangeAccount.MailboxPlanId); + + if (((quotaUsed - oldPlan.MailboxSizeMB) + plan.MailboxSizeMB) > (maxDiskSpace)) + return BusinessErrorCodes.ERROR_EXCHANGE_STORAGE_QUOTAS_EXCEED_HOST_VALUES; + } + else + { + if ((quotaUsed + plan.MailboxSizeMB) > (maxDiskSpace)) + return BusinessErrorCodes.ERROR_EXCHANGE_STORAGE_QUOTAS_EXCEED_HOST_VALUES; + } + } + + int maxRecoverableItemsSpace = -1; + int quotaRecoverableItemsUsed = 0; + if (cntx.Quotas.ContainsKey(Quotas.EXCHANGE2007_RECOVERABLEITEMSSPACE) + && cntx.Quotas[Quotas.EXCHANGE2007_RECOVERABLEITEMSSPACE].QuotaAllocatedValue > 0) + { + maxRecoverableItemsSpace = cntx.Quotas[Quotas.EXCHANGE2007_RECOVERABLEITEMSSPACE].QuotaAllocatedValue; + quotaRecoverableItemsUsed = cntx.Quotas[Quotas.EXCHANGE2007_RECOVERABLEITEMSSPACE].QuotaUsedValue; + } + + if (maxRecoverableItemsSpace != -1) + { + if (plan.RecoverableItemsSpace == -1) + return BusinessErrorCodes.ERROR_EXCHANGE_STORAGE_QUOTAS_EXCEED_HOST_VALUES; + + if ((quotaRecoverableItemsUsed + plan.RecoverableItemsSpace) > (maxRecoverableItemsSpace)) + return BusinessErrorCodes.ERROR_EXCHANGE_STORAGE_QUOTAS_EXCEED_HOST_VALUES; + } + + // get mailbox settings + int exchangeServiceId = GetExchangeServiceID(org.PackageId); + ExchangeServer exchange = GetExchangeServer(exchangeServiceId, org.ServiceId); + + exchange.SetMailboxAdvancedSettings( + org.OrganizationId, + account.UserPrincipalName, + plan.EnablePOP, + plan.EnableIMAP, + plan.EnableOWA, + plan.EnableMAPI, + plan.EnableActiveSync, + plan.MailboxSizeMB != -1 ? (((long)plan.IssueWarningPct * (long)plan.MailboxSizeMB * 1024) / 100) : -1, + plan.MailboxSizeMB != -1 ? (((long)plan.ProhibitSendPct * (long)plan.MailboxSizeMB * 1024) / 100) : -1, + plan.MailboxSizeMB != -1 ? (((long)plan.ProhibitSendReceivePct * (long)plan.MailboxSizeMB * 1024) / 100) : -1, + plan.KeepDeletedItemsDays, + plan.MaxRecipients, + plan.MaxSendMessageSizeKB, + plan.MaxReceiveMessageSizeKB, + plan.AllowLitigationHold, + plan.RecoverableItemsSpace != -1 ? (plan.RecoverableItemsSpace * 1024) : -1, + plan.RecoverableItemsSpace != -1 ? (((long)plan.RecoverableItemsWarningPct * (long)plan.RecoverableItemsSpace * 1024) / 100) : -1, + plan.LitigationHoldUrl, + plan.LitigationHoldMsg); + + DataProvider.SetExchangeAccountMailboxPlan(accountId, mailboxPlanId); + + return 0; + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + } + + public static List GetExchangeMailboxPlans(int itemId) + { + // place log record + TaskManager.StartTask("EXCHANGE", "GET_EXCHANGE_MAILBOXPLANS", itemId); + + try + { + List mailboxPlans = new List(); + + UserInfo user = ObjectUtils.FillObjectFromDataReader(DataProvider.GetUserByExchangeOrganizationIdInternally(itemId)); + + if (user.Role == UserRole.User) + ExchangeServerController.GetExchangeMailboxPlansByUser(itemId, user, ref mailboxPlans); + else + ExchangeServerController.GetExchangeMailboxPlansByUser(0, user, ref mailboxPlans); + + + ExchangeOrganization ExchangeOrg = ObjectUtils.FillObjectFromDataReader(DataProvider.GetExchangeOrganization(itemId)); + + if (ExchangeOrg != null) + { + foreach (ExchangeMailboxPlan p in mailboxPlans) + { + p.IsDefault = (p.MailboxPlanId == ExchangeOrg.ExchangeMailboxPlanID); + } + } + + return mailboxPlans; + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + } + + private static void GetExchangeMailboxPlansByUser(int itemId, UserInfo user, ref ListmailboxPlans) + { + if ((user != null)) + { + List orgs = null; + + if (user.UserId != 1) + { + List Packages = PackageController.GetPackages(user.UserId); + + if ((Packages != null) & (Packages.Count > 0)) + { + orgs = GetExchangeOrganizationsInternal(Packages[0].PackageId, false); + } + } + else + { + orgs = GetExchangeOrganizationsInternal(1, false); + } + + int OrgId = -1; + if (itemId > 0) OrgId = itemId; + else if ((orgs != null) & (orgs.Count > 0)) OrgId = orgs[0].Id; + + + if (OrgId != -1) + { + List Plans = ObjectUtils.CreateListFromDataReader(DataProvider.GetExchangeMailboxPlans(OrgId)); + + foreach (ExchangeMailboxPlan p in Plans) + { + mailboxPlans.Add(p); + } + } + + UserInfo owner = UserController.GetUserInternally(user.OwnerId); + + GetExchangeMailboxPlansByUser(0, owner, ref mailboxPlans); + } + } + + + public static ExchangeMailboxPlan GetExchangeMailboxPlan(int itemID, int mailboxPlanId) + { + + // place log record + TaskManager.StartTask("EXCHANGE", "GET_EXCHANGE_MAILBOXPLAN", mailboxPlanId); + + try + { + return ObjectUtils.FillObjectFromDataReader( + DataProvider.GetExchangeMailboxPlan(mailboxPlanId)); + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + } + + public static int AddExchangeMailboxPlan(int itemID, ExchangeMailboxPlan mailboxPlan) + { + // place log record + TaskManager.StartTask("EXCHANGE", "ADD_EXCHANGE_MAILBOXPLAN", itemID); + + try + { + Organization org = GetOrganization(itemID); + if (org == null) + return -1; + + // load package context + PackageContext cntx = PackageController.GetPackageContext(org.PackageId); + + if (org.PackageId > 1) + { + mailboxPlan.EnableActiveSync = mailboxPlan.EnableActiveSync & Convert.ToBoolean(cntx.Quotas[Quotas.EXCHANGE2007_ACTIVESYNCALLOWED].QuotaAllocatedValue); + mailboxPlan.EnableIMAP = mailboxPlan.EnableIMAP & Convert.ToBoolean(cntx.Quotas[Quotas.EXCHANGE2007_IMAPALLOWED].QuotaAllocatedValue); + mailboxPlan.EnableMAPI = mailboxPlan.EnableMAPI & Convert.ToBoolean(cntx.Quotas[Quotas.EXCHANGE2007_MAPIALLOWED].QuotaAllocatedValue); + mailboxPlan.EnableOWA = mailboxPlan.EnableOWA & Convert.ToBoolean(cntx.Quotas[Quotas.EXCHANGE2007_OWAALLOWED].QuotaAllocatedValue); + mailboxPlan.EnablePOP = mailboxPlan.EnablePOP & Convert.ToBoolean(cntx.Quotas[Quotas.EXCHANGE2007_POP3ALLOWED].QuotaAllocatedValue); + + if (cntx.Quotas[Quotas.EXCHANGE2007_KEEPDELETEDITEMSDAYS].QuotaAllocatedValue != -1) + if (mailboxPlan.KeepDeletedItemsDays > cntx.Quotas[Quotas.EXCHANGE2007_KEEPDELETEDITEMSDAYS].QuotaAllocatedValue) + mailboxPlan.KeepDeletedItemsDays = cntx.Quotas[Quotas.EXCHANGE2007_KEEPDELETEDITEMSDAYS].QuotaAllocatedValue; + + if (cntx.Quotas[Quotas.EXCHANGE2007_DISKSPACE].QuotaAllocatedValue != -1) + if (mailboxPlan.MailboxSizeMB > cntx.Quotas[Quotas.EXCHANGE2007_DISKSPACE].QuotaAllocatedValue) + mailboxPlan.MailboxSizeMB = cntx.Quotas[Quotas.EXCHANGE2007_DISKSPACE].QuotaAllocatedValue; + + if (cntx.Quotas[Quotas.EXCHANGE2007_MAXRECEIVEMESSAGESIZEKB].QuotaAllocatedValue != -1) + if (mailboxPlan.MaxReceiveMessageSizeKB > cntx.Quotas[Quotas.EXCHANGE2007_MAXRECEIVEMESSAGESIZEKB].QuotaAllocatedValue) + mailboxPlan.MaxReceiveMessageSizeKB = cntx.Quotas[Quotas.EXCHANGE2007_MAXRECEIVEMESSAGESIZEKB].QuotaAllocatedValue; + + if (cntx.Quotas[Quotas.EXCHANGE2007_MAXSENDMESSAGESIZEKB].QuotaAllocatedValue != -1) + if (mailboxPlan.MaxSendMessageSizeKB > cntx.Quotas[Quotas.EXCHANGE2007_MAXSENDMESSAGESIZEKB].QuotaAllocatedValue) + mailboxPlan.MaxSendMessageSizeKB = cntx.Quotas[Quotas.EXCHANGE2007_MAXSENDMESSAGESIZEKB].QuotaAllocatedValue; + + if (cntx.Quotas[Quotas.EXCHANGE2007_MAXRECIPIENTS].QuotaAllocatedValue != -1) + if (mailboxPlan.MaxRecipients > cntx.Quotas[Quotas.EXCHANGE2007_MAXRECIPIENTS].QuotaAllocatedValue) + mailboxPlan.MaxRecipients = cntx.Quotas[Quotas.EXCHANGE2007_MAXRECIPIENTS].QuotaAllocatedValue; + + if (Convert.ToBoolean(cntx.Quotas[Quotas.EXCHANGE2007_ISCONSUMER].QuotaAllocatedValue)) mailboxPlan.HideFromAddressBook = true; + + mailboxPlan.AllowLitigationHold = mailboxPlan.AllowLitigationHold & Convert.ToBoolean(cntx.Quotas[Quotas.EXCHANGE2007_ALLOWLITIGATIONHOLD].QuotaAllocatedValue); + + if (cntx.Quotas[Quotas.EXCHANGE2007_RECOVERABLEITEMSSPACE].QuotaAllocatedValue != -1) + if (mailboxPlan.RecoverableItemsSpace > cntx.Quotas[Quotas.EXCHANGE2007_RECOVERABLEITEMSSPACE].QuotaAllocatedValue) + mailboxPlan.RecoverableItemsSpace = cntx.Quotas[Quotas.EXCHANGE2007_RECOVERABLEITEMSSPACE].QuotaAllocatedValue; + } + + return DataProvider.AddExchangeMailboxPlan(itemID, mailboxPlan.MailboxPlan, mailboxPlan.EnableActiveSync, mailboxPlan.EnableIMAP, mailboxPlan.EnableMAPI, mailboxPlan.EnableOWA, mailboxPlan.EnablePOP, + mailboxPlan.IsDefault, mailboxPlan.IssueWarningPct, mailboxPlan.KeepDeletedItemsDays, mailboxPlan.MailboxSizeMB, mailboxPlan.MaxReceiveMessageSizeKB, mailboxPlan.MaxRecipients, + mailboxPlan.MaxSendMessageSizeKB, mailboxPlan.ProhibitSendPct, mailboxPlan.ProhibitSendReceivePct, mailboxPlan.HideFromAddressBook, mailboxPlan.MailboxPlanType, + mailboxPlan.AllowLitigationHold, mailboxPlan.RecoverableItemsSpace, mailboxPlan.RecoverableItemsWarningPct, + mailboxPlan.LitigationHoldUrl, mailboxPlan.LitigationHoldMsg); + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + + } + + + public static int UpdateExchangeMailboxPlan(int itemID, ExchangeMailboxPlan mailboxPlan) + { + // place log record + TaskManager.StartTask("EXCHANGE", "UPDATE_EXCHANGE_MAILBOXPLAN", itemID); + + try + { + Organization org = GetOrganization(itemID); + if (org == null) + return -1; + + // load package context + PackageContext cntx = PackageController.GetPackageContext(org.PackageId); + + if (org.PackageId > 1) + { + mailboxPlan.EnableActiveSync = mailboxPlan.EnableActiveSync & Convert.ToBoolean(cntx.Quotas[Quotas.EXCHANGE2007_ACTIVESYNCALLOWED].QuotaAllocatedValue); + mailboxPlan.EnableIMAP = mailboxPlan.EnableIMAP & Convert.ToBoolean(cntx.Quotas[Quotas.EXCHANGE2007_IMAPALLOWED].QuotaAllocatedValue); + mailboxPlan.EnableMAPI = mailboxPlan.EnableMAPI & Convert.ToBoolean(cntx.Quotas[Quotas.EXCHANGE2007_MAPIALLOWED].QuotaAllocatedValue); + mailboxPlan.EnableOWA = mailboxPlan.EnableOWA & Convert.ToBoolean(cntx.Quotas[Quotas.EXCHANGE2007_OWAALLOWED].QuotaAllocatedValue); + mailboxPlan.EnablePOP = mailboxPlan.EnablePOP & Convert.ToBoolean(cntx.Quotas[Quotas.EXCHANGE2007_POP3ALLOWED].QuotaAllocatedValue); + + if (cntx.Quotas[Quotas.EXCHANGE2007_KEEPDELETEDITEMSDAYS].QuotaAllocatedValue != -1) + if (mailboxPlan.KeepDeletedItemsDays > cntx.Quotas[Quotas.EXCHANGE2007_KEEPDELETEDITEMSDAYS].QuotaAllocatedValue) + mailboxPlan.KeepDeletedItemsDays = cntx.Quotas[Quotas.EXCHANGE2007_KEEPDELETEDITEMSDAYS].QuotaAllocatedValue; + + if (cntx.Quotas[Quotas.EXCHANGE2007_DISKSPACE].QuotaAllocatedValue != -1) + if (mailboxPlan.MailboxSizeMB > cntx.Quotas[Quotas.EXCHANGE2007_DISKSPACE].QuotaAllocatedValue) + mailboxPlan.MailboxSizeMB = cntx.Quotas[Quotas.EXCHANGE2007_DISKSPACE].QuotaAllocatedValue; + + if (cntx.Quotas[Quotas.EXCHANGE2007_MAXRECEIVEMESSAGESIZEKB].QuotaAllocatedValue != -1) + if (mailboxPlan.MaxReceiveMessageSizeKB > cntx.Quotas[Quotas.EXCHANGE2007_MAXRECEIVEMESSAGESIZEKB].QuotaAllocatedValue) + mailboxPlan.MaxReceiveMessageSizeKB = cntx.Quotas[Quotas.EXCHANGE2007_MAXRECEIVEMESSAGESIZEKB].QuotaAllocatedValue; + + if (cntx.Quotas[Quotas.EXCHANGE2007_MAXSENDMESSAGESIZEKB].QuotaAllocatedValue != -1) + if (mailboxPlan.MaxSendMessageSizeKB > cntx.Quotas[Quotas.EXCHANGE2007_MAXSENDMESSAGESIZEKB].QuotaAllocatedValue) + mailboxPlan.MaxSendMessageSizeKB = cntx.Quotas[Quotas.EXCHANGE2007_MAXSENDMESSAGESIZEKB].QuotaAllocatedValue; + + if (cntx.Quotas[Quotas.EXCHANGE2007_MAXRECIPIENTS].QuotaAllocatedValue != -1) + if (mailboxPlan.MaxRecipients > cntx.Quotas[Quotas.EXCHANGE2007_MAXRECIPIENTS].QuotaAllocatedValue) + mailboxPlan.MaxRecipients = cntx.Quotas[Quotas.EXCHANGE2007_MAXRECIPIENTS].QuotaAllocatedValue; + + if (Convert.ToBoolean(cntx.Quotas[Quotas.EXCHANGE2007_ISCONSUMER].QuotaAllocatedValue)) mailboxPlan.HideFromAddressBook = true; + + mailboxPlan.AllowLitigationHold = mailboxPlan.AllowLitigationHold & Convert.ToBoolean(cntx.Quotas[Quotas.EXCHANGE2007_ALLOWLITIGATIONHOLD].QuotaAllocatedValue); + + if (cntx.Quotas[Quotas.EXCHANGE2007_RECOVERABLEITEMSSPACE].QuotaAllocatedValue != -1) + if (mailboxPlan.RecoverableItemsSpace > cntx.Quotas[Quotas.EXCHANGE2007_RECOVERABLEITEMSSPACE].QuotaAllocatedValue) + mailboxPlan.RecoverableItemsSpace = cntx.Quotas[Quotas.EXCHANGE2007_RECOVERABLEITEMSSPACE].QuotaAllocatedValue; + + } + + DataProvider.UpdateExchangeMailboxPlan(mailboxPlan.MailboxPlanId, mailboxPlan.MailboxPlan, mailboxPlan.EnableActiveSync, mailboxPlan.EnableIMAP, mailboxPlan.EnableMAPI, mailboxPlan.EnableOWA, mailboxPlan.EnablePOP, + mailboxPlan.IsDefault, mailboxPlan.IssueWarningPct, mailboxPlan.KeepDeletedItemsDays, mailboxPlan.MailboxSizeMB, mailboxPlan.MaxReceiveMessageSizeKB, mailboxPlan.MaxRecipients, + mailboxPlan.MaxSendMessageSizeKB, mailboxPlan.ProhibitSendPct, mailboxPlan.ProhibitSendReceivePct, mailboxPlan.HideFromAddressBook, mailboxPlan.MailboxPlanType, + mailboxPlan.AllowLitigationHold, mailboxPlan.RecoverableItemsSpace, mailboxPlan.RecoverableItemsWarningPct, + mailboxPlan.LitigationHoldUrl, mailboxPlan.LitigationHoldMsg); + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + + + return 0; + } + + + + public static int DeleteExchangeMailboxPlan(int itemID, int mailboxPlanId) + { + TaskManager.StartTask("EXCHANGE", "DELETE_EXCHANGE_MAILBOXPLAN", itemID); + + try + { + DataProvider.DeleteExchangeMailboxPlan(mailboxPlanId); + + return 0; + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + + } + + public static void SetOrganizationDefaultExchangeMailboxPlan(int itemId, int mailboxPlanId) + { + TaskManager.StartTask("EXCHANGE", "SET_EXCHANGE_MAILBOXPLAN", itemId); + + try + { + DataProvider.SetOrganizationDefaultExchangeMailboxPlan(itemId, mailboxPlanId); + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + + } + + + + #endregion + + + #region Contacts + public static int CreateContact(int itemId, string displayName, string email) + { + //if (EmailAddressExists(email)) + // return BusinessErrorCodes.ERROR_EXCHANGE_EMAIL_EXISTS; + + + // check account + int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); + if (accountCheck < 0) return accountCheck; + + // check mailbox quota + OrganizationStatistics orgStats = GetOrganizationStatistics(itemId); + if (orgStats.AllocatedContacts > -1 + && orgStats.CreatedContacts >= orgStats.AllocatedContacts) + return BusinessErrorCodes.ERROR_EXCHANGE_CONTACTS_QUOTA_LIMIT; + + // place log record + TaskManager.StartTask("EXCHANGE", "CREATE_CONTACT", itemId); + + try + { + + displayName = displayName.Trim(); + email = email.Trim(); + + // load organization + Organization org = GetOrganization(itemId); + + // check package + int packageCheck = SecurityContext.CheckPackage(org.PackageId, DemandPackage.IsActive); + if (packageCheck < 0) return packageCheck; + + string name = email; + int idx = email.IndexOf("@"); + if (idx > -1) + name = email.Substring(0, idx); + + string accountName = BuildAccountName(org.OrganizationId, name); + + // add contact + int exchangeServiceId = GetExchangeServiceID(org.PackageId); + ExchangeServer exchange = GetExchangeServer(exchangeServiceId, org.ServiceId); + + //Create Exchange Organization + if (string.IsNullOrEmpty(org.GlobalAddressList)) + { + ExtendToExchangeOrganization(ref org); + + PackageController.UpdatePackageItem(org); + } + + exchange.CreateContact( + org.OrganizationId, + org.DistinguishedName, + displayName, + accountName, + email, org.DefaultDomain); + + ExchangeContact contact = exchange.GetContactGeneralSettings(accountName); + + // add meta-item + int accountId = AddAccount(itemId, ExchangeAccountType.Contact, accountName, + displayName, email, false, + 0, contact.SAMAccountName, null, 0, null); + + return accountId; + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + } + + public static int DeleteContact(int itemId, int accountId) + { + // check account + int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); + if (accountCheck < 0) return accountCheck; + + // place log record + TaskManager.StartTask("EXCHANGE", "DELETE_CONTACT", itemId); + + try + { + // load organization + Organization org = GetOrganization(itemId); + if (org == null) + return -1; + + // load account + ExchangeAccount account = GetAccount(itemId, accountId); + + // delete contact + int exchangeServiceId = GetExchangeServiceID(org.PackageId); + ExchangeServer exchange = GetExchangeServer(exchangeServiceId, org.ServiceId); + + exchange.DeleteContact(account.AccountName); + + // remove meta-item + DeleteAccount(itemId, accountId); + + return 0; + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + } + + private static ExchangeContact GetDemoContactSettings() + { + ExchangeContact c = new ExchangeContact(); + c.DisplayName = "WebsitePanel Support"; + c.AccountName = "wsp_fabrikam"; + c.FirstName = "WebsitePanel"; + c.LastName = "Support"; + c.EmailAddress = "support@websitepanel.net"; + c.AcceptAccounts = GetAccounts(0, ExchangeAccountType.Mailbox).ToArray(); + return c; + } + + public static ExchangeContact GetContactGeneralSettings(int itemId, int accountId) + { + #region Demo Mode + if (IsDemoMode) + { + return GetDemoContactSettings(); + } + #endregion + + // place log record + TaskManager.StartTask("EXCHANGE", "GET_CONTACT_GENERAL", itemId); + + try + { + // load organization + Organization org = GetOrganization(itemId); + if (org == null) + return null; + + // load account + ExchangeAccount account = GetAccount(itemId, accountId); + + // get mailbox settings + int exchangeServiceId = GetExchangeServiceID(org.PackageId); + ExchangeServer exchange = GetExchangeServer(exchangeServiceId, org.ServiceId); + + return exchange.GetContactGeneralSettings(account.AccountName); + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + } + + public static int SetContactGeneralSettings(int itemId, int accountId, string displayName, string emailAddress, + bool hideAddressBook, string firstName, string initials, + string lastName, string address, string city, string state, string zip, string country, + string jobTitle, string company, string department, string office, string managerAccountName, + string businessPhone, string fax, string homePhone, string mobilePhone, string pager, + string webPage, string notes, int useMapiRichTextFormat) + { + // check account + int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); + if (accountCheck < 0) return accountCheck; + + // place log record + TaskManager.StartTask("EXCHANGE", "UPDATE_CONTACT_GENERAL", itemId); + + try + { + displayName = displayName.Trim(); + emailAddress = emailAddress.Trim(); + firstName = firstName.Trim(); + lastName = lastName.Trim(); + + // load organization + Organization org = GetOrganization(itemId); + if (org == null) + return -1; + + // check package + int packageCheck = SecurityContext.CheckPackage(org.PackageId, DemandPackage.IsActive); + if (packageCheck < 0) return packageCheck; + + // load account + ExchangeAccount account = GetAccount(itemId, accountId); + + // get mailbox settings + int exchangeServiceId = GetExchangeServiceID(org.PackageId); + ExchangeServer exchange = GetExchangeServer(exchangeServiceId, org.ServiceId); + + exchange.SetContactGeneralSettings( + account.AccountName, + displayName, + emailAddress, + hideAddressBook, + firstName, + initials, + lastName, + address, + city, + state, + zip, + country, + jobTitle, + company, + department, + office, + managerAccountName, + businessPhone, + fax, + homePhone, + mobilePhone, + pager, + webPage, + notes, + useMapiRichTextFormat, org.DefaultDomain); + + // update account + account.DisplayName = displayName; + account.PrimaryEmailAddress = emailAddress; + account.AccountPassword = null; + UpdateAccount(account); + + return 0; + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + } + + public static ExchangeContact GetContactMailFlowSettings(int itemId, int accountId) + { + #region Demo Mode + if (IsDemoMode) + { + return GetDemoContactSettings(); + } + #endregion + + // place log record + TaskManager.StartTask("EXCHANGE", "GET_CONTACT_MAILFLOW", itemId); + + try + { + // load organization + Organization org = GetOrganization(itemId); + if (org == null) + return null; + + // load account + ExchangeAccount account = GetAccount(itemId, accountId); + + // get mailbox settings + int exchangeServiceId = GetExchangeServiceID(org.PackageId); + ExchangeServer exchange = GetExchangeServer(exchangeServiceId, org.ServiceId); + + ExchangeContact contact = exchange.GetContactMailFlowSettings(account.AccountName); + contact.DisplayName = account.DisplayName; + return contact; + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + } + + public static int SetContactMailFlowSettings(int itemId, int accountId, + string[] acceptAccounts, string[] rejectAccounts, bool requireSenderAuthentication) + { + // check account + int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); + if (accountCheck < 0) return accountCheck; + + // place log record + TaskManager.StartTask("EXCHANGE", "UPDATE_CONTACT_MAILFLOW", itemId); + + try + { + // load organization + Organization org = GetOrganization(itemId); + if (org == null) + return -1; + + // check package + int packageCheck = SecurityContext.CheckPackage(org.PackageId, DemandPackage.IsActive); + if (packageCheck < 0) return packageCheck; + + // load account + ExchangeAccount account = GetAccount(itemId, accountId); + + // get mailbox settings + int exchangeServiceId = GetExchangeServiceID(org.PackageId); + ExchangeServer exchange = GetExchangeServer(exchangeServiceId, org.ServiceId); + + exchange.SetContactMailFlowSettings(account.AccountName, + acceptAccounts, + rejectAccounts, + requireSenderAuthentication); + + return 0; + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + } + #endregion + + #region Distribution Lists + public static int CreateDistributionList(int itemId, string displayName, string name, string domain, int managerId) + { + // check account + int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); + if (accountCheck < 0) return accountCheck; + + // check mailbox quota + OrganizationStatistics orgStats = GetOrganizationStatistics(itemId); + if (orgStats.AllocatedDistributionLists > -1 + && orgStats.CreatedDistributionLists >= orgStats.AllocatedDistributionLists) + return BusinessErrorCodes.ERROR_EXCHANGE_DLISTS_QUOTA_LIMIT; + + // place log record + TaskManager.StartTask("EXCHANGE", "CREATE_DISTR_LIST", itemId); + + try + { + displayName = displayName.Trim(); + name = name.Trim(); + domain = domain.Trim(); + + // e-mail + string email = name + "@" + domain; + + // check e-mail + if (EmailAddressExists(email)) + return BusinessErrorCodes.ERROR_EXCHANGE_EMAIL_EXISTS; + + // load organization + Organization org = GetOrganization(itemId); + + // check package + int packageCheck = SecurityContext.CheckPackage(org.PackageId, DemandPackage.IsActive); + if (packageCheck < 0) return packageCheck; + + string accountName = BuildAccountName(org.OrganizationId, name); + + // add account + // add contact + int exchangeServiceId = GetExchangeServiceID(org.PackageId); + ExchangeServer exchange = GetExchangeServer(exchangeServiceId, org.ServiceId); + + //Create Exchange Organization + if (string.IsNullOrEmpty(org.GlobalAddressList)) + { + ExtendToExchangeOrganization(ref org); + + PackageController.UpdatePackageItem(org); + } + + OrganizationUser manager = OrganizationController.GetAccount(itemId, managerId); + + List addressLists = new List(); + addressLists.Add(org.GlobalAddressList); + addressLists.Add(org.AddressList); + + exchange.CreateDistributionList( + org.OrganizationId, + org.DistinguishedName, + displayName, + accountName, + name, + domain, manager.SamAccountName, addressLists.ToArray()); + + ExchangeDistributionList dl = exchange.GetDistributionListGeneralSettings(accountName); + + // add meta-item + int accountId = AddAccount(itemId, ExchangeAccountType.DistributionList, email, + displayName, email, false, + 0, dl.SAMAccountName, null, 0, null); + + // register email address + AddAccountEmailAddress(accountId, email); + + return accountId; + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + } + + public static int DeleteDistributionList(int itemId, int accountId) + { + // check account + int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); + if (accountCheck < 0) return accountCheck; + + // place log record + TaskManager.StartTask("EXCHANGE", "DELETE_DISTR_LIST", itemId); + + try + { + // load organization + Organization org = GetOrganization(itemId); + if (org == null) + return -1; + + // load account + ExchangeAccount account = GetAccount(itemId, accountId); + + // delete mailbox + int exchangeServiceId = GetExchangeServiceID(org.PackageId); + ExchangeServer exchange = GetExchangeServer(exchangeServiceId, org.ServiceId); + + exchange.DeleteDistributionList(account.AccountName); + + // unregister account + DeleteAccount(itemId, accountId); + + return 0; + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + } + + private static ExchangeDistributionList GetDemoDistributionListSettings() + { + ExchangeDistributionList c = new ExchangeDistributionList(); + c.DisplayName = "Fabrikam Sales"; + c.AccountName = "sales_fabrikam"; + c.ManagerAccount = GetAccounts(0, ExchangeAccountType.Mailbox)[0]; + c.MembersAccounts = GetAccounts(0, ExchangeAccountType.Mailbox).ToArray(); + c.AcceptAccounts = GetAccounts(0, ExchangeAccountType.Mailbox).ToArray(); + return c; + } + + public static ExchangeDistributionList GetDistributionListGeneralSettings(int itemId, int accountId) + { + #region Demo Mode + if (IsDemoMode) + { + return GetDemoDistributionListSettings(); + } + #endregion + + // place log record + TaskManager.StartTask("EXCHANGE", "GET_DISTR_LIST_GENERAL", itemId); + + try + { + // load organization + Organization org = GetOrganization(itemId); + if (org == null) + return null; + + // load account + ExchangeAccount account = GetAccount(itemId, accountId); + + // get mailbox settings + int exchangeServiceId = GetExchangeServiceID(org.PackageId); + ExchangeServer exchange = GetExchangeServer(exchangeServiceId, org.ServiceId); + + return exchange.GetDistributionListGeneralSettings(account.AccountName); + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + } + + public static int SetDistributionListGeneralSettings(int itemId, int accountId, string displayName, + bool hideAddressBook, string managerAccount, string[] memberAccounts, + string notes) + { + // check account + int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); + if (accountCheck < 0) return accountCheck; + + // place log record + TaskManager.StartTask("EXCHANGE", "UPDATE_DISTR_LIST_GENERAL", itemId); + + try + { + displayName = displayName.Trim(); + + // load organization + Organization org = GetOrganization(itemId); + if (org == null) + return -1; + + // check package + int packageCheck = SecurityContext.CheckPackage(org.PackageId, DemandPackage.IsActive); + if (packageCheck < 0) return packageCheck; + + // load account + ExchangeAccount account = GetAccount(itemId, accountId); + + // get mailbox settings + int exchangeServiceId = GetExchangeServiceID(org.PackageId); + ExchangeServer exchange = GetExchangeServer(exchangeServiceId, org.ServiceId); + + List addressLists = new List(); + addressLists.Add(org.GlobalAddressList); + addressLists.Add(org.AddressList); + + exchange.SetDistributionListGeneralSettings( + account.AccountName, + displayName, + hideAddressBook, + managerAccount, + memberAccounts, + notes, + addressLists.ToArray()); + + // update account + account.DisplayName = displayName; + account.AccountPassword = null; + UpdateAccount(account); + + return 0; + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + } + + public static ExchangeDistributionList GetDistributionListMailFlowSettings(int itemId, int accountId) + { + #region Demo Mode + if (IsDemoMode) + { + return GetDemoDistributionListSettings(); + } + #endregion + + // place log record + TaskManager.StartTask("EXCHANGE", "GET_DISTR_LIST_MAILFLOW", itemId); + + try + { + // load organization + Organization org = GetOrganization(itemId); + if (org == null) + return null; + + // load account + ExchangeAccount account = GetAccount(itemId, accountId); + + // get mailbox settings + int exchangeServiceId = GetExchangeServiceID(org.PackageId); + ExchangeServer exchange = GetExchangeServer(exchangeServiceId, org.ServiceId); + + ExchangeDistributionList list = exchange.GetDistributionListMailFlowSettings(account.AccountName); + list.DisplayName = account.DisplayName; + return list; + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + } + + public static int SetDistributionListMailFlowSettings(int itemId, int accountId, + string[] acceptAccounts, string[] rejectAccounts, bool requireSenderAuthentication) + { + // check account + int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); + if (accountCheck < 0) return accountCheck; + + // place log record + TaskManager.StartTask("EXCHANGE", "UPDATE_DISTR_LIST_MAILFLOW", itemId); + + try + { + // load organization + Organization org = GetOrganization(itemId); + if (org == null) + return -1; + + // check package + int packageCheck = SecurityContext.CheckPackage(org.PackageId, DemandPackage.IsActive); + if (packageCheck < 0) return packageCheck; + + // load account + ExchangeAccount account = GetAccount(itemId, accountId); + + // get mailbox settings + int exchangeServiceId = GetExchangeServiceID(org.PackageId); + ExchangeServer exchange = GetExchangeServer(exchangeServiceId, org.ServiceId); + + List addressLists = new List(); + addressLists.Add(org.GlobalAddressList); + addressLists.Add(org.AddressList); + + + exchange.SetDistributionListMailFlowSettings(account.AccountName, + acceptAccounts, + rejectAccounts, + requireSenderAuthentication, + addressLists.ToArray()); + + return 0; + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + } + + public static ExchangeEmailAddress[] GetDistributionListEmailAddresses(int itemId, int accountId) + { + // place log record + TaskManager.StartTask("EXCHANGE", "GET_DISTR_LIST_ADDRESSES", itemId); + + try + { + return GetAccountEmailAddresses(itemId, accountId); + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + } + + public static int AddDistributionListEmailAddress(int itemId, int accountId, string emailAddress) + { + // check account + int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); + if (accountCheck < 0) return accountCheck; + + // place log record + TaskManager.StartTask("EXCHANGE", "ADD_DISTR_LIST_ADDRESS", itemId); + + try + { + // check + if (EmailAddressExists(emailAddress)) + return BusinessErrorCodes.ERROR_EXCHANGE_EMAIL_EXISTS; + + // load organization + Organization org = GetOrganization(itemId); + if (org == null) + return -1; + + // check package + int packageCheck = SecurityContext.CheckPackage(org.PackageId, DemandPackage.IsActive); + if (packageCheck < 0) return packageCheck; + + // load account + ExchangeAccount account = GetAccount(itemId, accountId); + + // add e-mail + AddAccountEmailAddress(accountId, emailAddress); + + // update e-mail addresses + int exchangeServiceId = GetExchangeServiceID(org.PackageId); + ExchangeServer exchange = GetExchangeServer(exchangeServiceId, org.ServiceId); + + List addressLists = new List(); + addressLists.Add(org.GlobalAddressList); + addressLists.Add(org.AddressList); + + exchange.SetDistributionListEmailAddresses( + account.AccountName, + GetAccountSimpleEmailAddresses(itemId, accountId), addressLists.ToArray()); + + return 0; + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + } + + public static int SetDistributionListPrimaryEmailAddress(int itemId, int accountId, string emailAddress) + { + // check account + int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); + if (accountCheck < 0) return accountCheck; + + // place log record + TaskManager.StartTask("EXCHANGE", "SET_PRIMARY_DISTR_LIST_ADDRESS", itemId); + + try + { + // get account + ExchangeAccount account = GetAccount(itemId, accountId); + account.PrimaryEmailAddress = emailAddress; + + // update exchange + Organization org = GetOrganization(itemId); + if (org == null) + return -1; + + // check package + int packageCheck = SecurityContext.CheckPackage(org.PackageId, DemandPackage.IsActive); + if (packageCheck < 0) return packageCheck; + + int exchangeServiceId = GetExchangeServiceID(org.PackageId); + ExchangeServer exchange = GetExchangeServer(exchangeServiceId, org.ServiceId); + + List addressLists = new List(); + addressLists.Add(org.GlobalAddressList); + addressLists.Add(org.AddressList); + + exchange.SetDistributionListPrimaryEmailAddress( + account.AccountName, + emailAddress, + addressLists.ToArray()); + + // save account + account.AccountPassword = null; + UpdateAccount(account); + + return 0; + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + } + + public static int DeleteDistributionListEmailAddresses(int itemId, int accountId, string[] emailAddresses) + { + // check account + int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); + if (accountCheck < 0) return accountCheck; + + // place log record + TaskManager.StartTask("EXCHANGE", "DELETE_DISTR_LIST_ADDRESSES", itemId); + + try + { + // get account + ExchangeAccount account = GetAccount(itemId, accountId); + + // delete e-mail addresses + List toDelete = new List(); + foreach (string emailAddress in emailAddresses) + { + if (String.Compare(account.PrimaryEmailAddress, emailAddress, true) != 0) + toDelete.Add(emailAddress); + } + + // delete from meta-base + DeleteAccountEmailAddresses(accountId, toDelete.ToArray()); + + // delete from Exchange + Organization org = GetOrganization(itemId); + if (org == null) + return -1; + + // update e-mail addresses + int exchangeServiceId = GetExchangeServiceID(org.PackageId); + ExchangeServer exchange = GetExchangeServer(exchangeServiceId, org.ServiceId); + + List addressLists = new List(); + addressLists.Add(org.GlobalAddressList); + addressLists.Add(org.AddressList); + + exchange.SetDistributionListEmailAddresses( + account.AccountName, + GetAccountSimpleEmailAddresses(itemId, accountId), addressLists.ToArray()); + + return 0; + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + } + + + public static ResultObject SetDistributionListPermissions(int itemId, int accountId, string[] sendAsAccounts, string[] sendOnBehalfAccounts) + { + ResultObject res = TaskManager.StartResultTask("EXCHANGE", "SET_DISTRIBUTION_LIST_PERMISSINS"); + Organization org; + try + { + org = GetOrganization(itemId); + if (org == null) + throw new ApplicationException("Organization is null"); + } + catch(Exception ex) + { + TaskManager.CompleteResultTask(res, ErrorCodes.CANNOT_GET_ORGANIZATION_BY_ITEM_ID, ex); + return res; + } + + ExchangeServer exchange; + try + { + + int exchangeServiceId = GetExchangeServiceID(org.PackageId); + exchange = GetExchangeServer(exchangeServiceId, org.ServiceId); + } + catch(Exception ex) + { + TaskManager.CompleteResultTask(res, ErrorCodes.CANNOT_GET_ORGANIZATION_PROXY, ex); + return res; + } + + ExchangeAccount account; + + try + { + account = GetAccount(itemId, accountId); + } + catch(Exception ex) + { + TaskManager.CompleteResultTask(res, ErrorCodes.CANNOT_GET_ACCOUNT, ex); + return res; + } + + try + { + List addressLists = new List(); + addressLists.Add(org.GlobalAddressList); + addressLists.Add(org.AddressList); + + exchange.SetDistributionListPermissions(org.OrganizationId, account.AccountName, sendAsAccounts, + sendOnBehalfAccounts, addressLists.ToArray()); + } + catch(Exception ex) + { + TaskManager.CompleteResultTask(res, ErrorCodes.CANNOT_SET_DISTRIBUTION_LIST_PERMISSIONS, ex); + return res; + } + + TaskManager.CompleteTask(); + return res; + } + + public static ExchangeDistributionListResult GetDistributionListPermissions(int itemId, int accountId) + { + Organization org; + ExchangeDistributionListResult res = TaskManager.StartResultTask("EXCHANGE", "GET_DISTRIBUTION_LIST_RESULT"); + + try + { + org = GetOrganization(itemId); + if (org == null) + throw new ApplicationException("Organization is null"); + } + catch(Exception ex) + { + TaskManager.CompleteResultTask(res, ErrorCodes.CANNOT_GET_ORGANIZATION_BY_ITEM_ID, ex); + return res; + } + + ExchangeServer exchange; + try + { + int exchangeServiceId = GetExchangeServiceID(org.PackageId); + exchange = GetExchangeServer(exchangeServiceId, org.ServiceId); + } + catch(Exception ex) + { + TaskManager.CompleteResultTask(res, ErrorCodes.CANNOT_GET_ORGANIZATION_PROXY, ex); + return res; + } + + ExchangeAccount account; + try + { + account = GetAccount(itemId, accountId); + } + catch(Exception ex) + { + TaskManager.CompleteResultTask(res, ErrorCodes.CANNOT_GET_ACCOUNT, ex); + return res; + } + + try + { + res.Value = exchange.GetDistributionListPermissions(org.OrganizationId, account.AccountName); + res.Value.DisplayName = account.DisplayName; + } + catch(Exception ex) + { + TaskManager.CompleteResultTask(res, ErrorCodes.CANNOT_GET_DISTRIBUTION_LIST_PERMISSIONS, ex); + return res; + } + + TaskManager.CompleteTask(); + return res; + } + + #endregion + + #region Public Folders + public static int CreatePublicFolder(int itemId, string parentFolder, string folderName, + bool mailEnabled, string name, string domain) + { + // check account + int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); + if (accountCheck < 0) return accountCheck; + + // check mailbox quota + OrganizationStatistics orgStats = GetOrganizationStatistics(itemId); + if (orgStats.AllocatedPublicFolders > -1 + && orgStats.CreatedPublicFolders >= orgStats.AllocatedPublicFolders) + return BusinessErrorCodes.ERROR_EXCHANGE_PFOLDERS_QUOTA_LIMIT; + + // place log record + TaskManager.StartTask("EXCHANGE", "CREATE_PUBLIC_FOLDER", itemId); + + try + { + // e-mail + string email = ""; + if (mailEnabled && !String.IsNullOrEmpty(name)) + { + email = name + "@" + domain; + + // check e-mail + if (EmailAddressExists(email)) + return BusinessErrorCodes.ERROR_EXCHANGE_EMAIL_EXISTS; + } + + // full folder name + string normParent = parentFolder; + if (!normParent.StartsWith("\\")) + normParent = "\\" + normParent; + if (!normParent.EndsWith("\\")) + normParent = normParent + "\\"; + + string folderPath = normParent + folderName; + + // load organization + Organization org = GetOrganization(itemId); + if (org == null) + return -1; + + // check package + int packageCheck = SecurityContext.CheckPackage(org.PackageId, DemandPackage.IsActive); + if (packageCheck < 0) return packageCheck; + + if (String.IsNullOrEmpty(name)) + name = Utils.CleanIdentifier(folderName); + + string accountName = BuildAccountName(org.OrganizationId, name); + + // add mailbox + int exchangeServiceId = GetExchangeServiceID(org.PackageId); + ExchangeServer exchange = GetExchangeServer(exchangeServiceId, org.ServiceId); + + //Create Exchange Organization + if (string.IsNullOrEmpty(org.GlobalAddressList)) + { + ExtendToExchangeOrganization(ref org); + + PackageController.UpdatePackageItem(org); + } + + exchange.CreatePublicFolder(org.DistinguishedName, + org.OrganizationId, + org.SecurityGroup, + parentFolder, + folderName, + mailEnabled, + accountName, + name, + domain); + + + ExchangePublicFolder folder = exchange.GetPublicFolderGeneralSettings(org.OrganizationId, parentFolder + "\\" + folderName); + + // add meta-item + int accountId = AddAccount(itemId, ExchangeAccountType.PublicFolder, accountName, + folderPath, email, mailEnabled, + 0, folder.NETBIOS+"\\"+accountName, null, 0, null); + + // register email address + if(mailEnabled) + AddAccountEmailAddress(accountId, email); + + return accountId; + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + } + + public static int DeletePublicFolders(int itemId, int[] accountIds) + { + // check account + int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); + if (accountCheck < 0) return accountCheck; + + if (accountIds != null) + foreach (int accountId in accountIds) + { + int result = DeletePublicFolder(itemId, accountId); + if (result < 0) + return result; + } + return 0; + } + + public static int DeletePublicFolder(int itemId, int accountId) + { + // check account + int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); + if (accountCheck < 0) return accountCheck; + + // place log record + TaskManager.StartTask("EXCHANGE", "DELETE_PUBLIC_FOLDER", itemId); + + try + { + // load organization + Organization org = GetOrganization(itemId); + if (org == null) + return -1; + + // load account + ExchangeAccount account = GetAccount(itemId, accountId); + + // delete folder + int exchangeServiceId = GetExchangeServiceID(org.PackageId); + ExchangeServer exchange = GetExchangeServer(exchangeServiceId, org.ServiceId); + + exchange.DeletePublicFolder(org.OrganizationId, account.DisplayName); + + // unregister account + DeleteAccount(itemId, accountId); + + // delete all nested folder meta-items + List folders = GetAccounts(itemId, ExchangeAccountType.PublicFolder); + foreach (ExchangeAccount folder in folders) + { + if (folder.DisplayName.ToLower().StartsWith(account.DisplayName.ToLower() + "\\")) + DeleteAccount(itemId, folder.AccountId); + } + + return 0; + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + } + + public static int EnableMailPublicFolder(int itemId, int accountId, + string name, string domain) + { + // check account + int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); + if (accountCheck < 0) return accountCheck; + + // place log record + TaskManager.StartTask("EXCHANGE", "ENABLE_MAIL_PUBLIC_FOLDER", itemId); + + try + { + // load organization + Organization org = GetOrganization(itemId); + if (org == null) + return -1; + + // check package + int packageCheck = SecurityContext.CheckPackage(org.PackageId, DemandPackage.IsActive); + if (packageCheck < 0) return packageCheck; + + // load account + ExchangeAccount account = GetAccount(itemId, accountId); + if (account.MailEnabledPublicFolder) + return 0; + + // check email + string email = name + "@" + domain; + + // check e-mail + if (EmailAddressExists(email)) + return BusinessErrorCodes.ERROR_EXCHANGE_EMAIL_EXISTS; + + string accountName = BuildAccountName(org.OrganizationId, name); + + int exchangeServiceId = GetExchangeServiceID(org.PackageId); + ExchangeServer exchange = GetExchangeServer(exchangeServiceId, org.ServiceId); + + exchange.EnableMailPublicFolder( + org.OrganizationId, + account.DisplayName, + account.AccountName, + name, + domain); + + // update and save account + account.AccountName = accountName; + account.MailEnabledPublicFolder = true; + account.PrimaryEmailAddress = email; + account.AccountPassword = null; + UpdateAccount(account); + + // register e-mail + AddAccountEmailAddress(accountId, email); + + return 0; + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + } + + public static int DisableMailPublicFolder(int itemId, int accountId) + { + // check account + int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); + if (accountCheck < 0) return accountCheck; + + // place log record + TaskManager.StartTask("EXCHANGE", "DISABLE_MAIL_PUBLIC_FOLDER", itemId); + + try + { + // load organization + Organization org = GetOrganization(itemId); + if (org == null) + return -1; + + // check package + int packageCheck = SecurityContext.CheckPackage(org.PackageId, DemandPackage.IsActive); + if (packageCheck < 0) return packageCheck; + + // load account + ExchangeAccount account = GetAccount(itemId, accountId); + if (!account.MailEnabledPublicFolder) + return 0; + + int exchangeServiceId = GetExchangeServiceID(org.PackageId); + ExchangeServer exchange = GetExchangeServer(exchangeServiceId, org.ServiceId); + + exchange.DisableMailPublicFolder(org.OrganizationId, account.DisplayName); + + + // update and save account + account.MailEnabledPublicFolder = false; + account.PrimaryEmailAddress = ""; + account.AccountPassword = null; + UpdateAccount(account); + + + // delete all mail accounts + List addrs = new List(); + ExchangeEmailAddress[] emails = GetAccountEmailAddresses(itemId, accountId); + foreach (ExchangeEmailAddress email in emails) + addrs.Add(email.EmailAddress); + + DeleteAccountEmailAddresses(accountId, addrs.ToArray()); + + return 0; + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + } + + private static ExchangePublicFolder GetDemoPublicFolderSettings() + { + ExchangePublicFolder c = new ExchangePublicFolder(); + c.DisplayName = "\\fabrikam\\Documents"; + c.MailEnabled = true; + c.Name = "Documents"; + c.Accounts = GetAccounts(0, ExchangeAccountType.Mailbox).ToArray(); + c.AcceptAccounts = GetAccounts(0, ExchangeAccountType.Mailbox).ToArray(); + return c; + } + + public static ExchangePublicFolder GetPublicFolderGeneralSettings(int itemId, int accountId) + { + #region Demo Mode + if (IsDemoMode) + { + return GetDemoPublicFolderSettings(); + } + #endregion + + // place log record + TaskManager.StartTask("EXCHANGE", "GET_PUBLIC_FOLDER_GENERAL", itemId); + + try + { + // load organization + Organization org = GetOrganization(itemId); + if (org == null) + return null; + + // load account + ExchangeAccount account = GetAccount(itemId, accountId); + + int exchangeServiceId = GetExchangeServiceID(org.PackageId); + ExchangeServer exchange = GetExchangeServer(exchangeServiceId, org.ServiceId); + + ExchangePublicFolder folder = exchange.GetPublicFolderGeneralSettings(org.OrganizationId, account.DisplayName); + folder.MailEnabled = account.MailEnabledPublicFolder; + folder.DisplayName = account.DisplayName; + return folder; + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + } + + public static int SetPublicFolderGeneralSettings(int itemId, int accountId, string newName, + bool hideAddressBook, ExchangeAccount[] accounts) + { + // check account + int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); + if (accountCheck < 0) return accountCheck; + + // place log record + TaskManager.StartTask("EXCHANGE", "UPDATE_PUBLIC_FOLDER_GENERAL", itemId); + + try + { + // load organization + Organization org = GetOrganization(itemId); + if (org == null) + return -1; + + // check package + int packageCheck = SecurityContext.CheckPackage(org.PackageId, DemandPackage.IsActive); + if (packageCheck < 0) return packageCheck; + + // load account + ExchangeAccount account = GetAccount(itemId, accountId); + + // get mailbox settings + int exchangeServiceId = GetExchangeServiceID(org.PackageId); + ExchangeServer exchange = GetExchangeServer(exchangeServiceId, org.ServiceId); + + exchange.SetPublicFolderGeneralSettings( + org.OrganizationId, + account.DisplayName, + newName, + hideAddressBook, + accounts + ); + + // update folder name + string origName = account.DisplayName; + string newFullName = origName.Substring(0, origName.LastIndexOf("\\") + 1) + newName; + + if (String.Compare(origName, newFullName, true) != 0) + { + // rename original folder + account.DisplayName = newFullName; + account.AccountPassword = null; + UpdateAccount(account); + + // rename nested folders + List folders = GetAccounts(itemId, ExchangeAccountType.PublicFolder); + foreach (ExchangeAccount folder in folders) + { + if (folder.DisplayName.ToLower().StartsWith(origName.ToLower() + "\\")) + { + folder.DisplayName = newFullName + folder.DisplayName.Substring(origName.Length); + UpdateAccount(folder); + } + } + } + + return 0; + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + } + + public static ExchangePublicFolder GetPublicFolderMailFlowSettings(int itemId, int accountId) + { + #region Demo Mode + if (IsDemoMode) + { + return GetDemoPublicFolderSettings(); + } + #endregion + + // place log record + TaskManager.StartTask("EXCHANGE", "GET_PUBLIC_FOLDER_MAILFLOW", itemId); + + try + { + // load organization + Organization org = GetOrganization(itemId); + if (org == null) + return null; + + // load account + ExchangeAccount account = GetAccount(itemId, accountId); + + // get mailbox settings + int exchangeServiceId = GetExchangeServiceID(org.PackageId); + ExchangeServer exchange = GetExchangeServer(exchangeServiceId, org.ServiceId); + + ExchangePublicFolder folder = exchange.GetPublicFolderMailFlowSettings(org.OrganizationId, account.DisplayName); + folder.DisplayName = account.DisplayName; + return folder; + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + } + + public static int SetPublicFolderMailFlowSettings(int itemId, int accountId, + string[] acceptAccounts, string[] rejectAccounts, bool requireSenderAuthentication) + { + // check account + int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); + if (accountCheck < 0) return accountCheck; + + // place log record + TaskManager.StartTask("EXCHANGE", "UPDATE_PUBLIC_FOLDER_MAILFLOW", itemId); + + try + { + // load organization + Organization org = GetOrganization(itemId); + if (org == null) + return -1; + + // check package + int packageCheck = SecurityContext.CheckPackage(org.PackageId, DemandPackage.IsActive); + if (packageCheck < 0) return packageCheck; + + // load account + ExchangeAccount account = GetAccount(itemId, accountId); + + // get mailbox settings + int exchangeServiceId = GetExchangeServiceID(org.PackageId); + ExchangeServer exchange = GetExchangeServer(exchangeServiceId, org.ServiceId); + + exchange.SetPublicFolderMailFlowSettings(org.OrganizationId, account.DisplayName, + acceptAccounts, + rejectAccounts, + requireSenderAuthentication); + + return 0; + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + } + + public static ExchangeEmailAddress[] GetPublicFolderEmailAddresses(int itemId, int accountId) + { + // place log record + TaskManager.StartTask("EXCHANGE", "GET_PUBLIC_FOLDER_ADDRESSES", itemId); + + try + { + return GetAccountEmailAddresses(itemId, accountId); + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + } + + public static int AddPublicFolderEmailAddress(int itemId, int accountId, string emailAddress) + { + // check account + int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); + if (accountCheck < 0) return accountCheck; + + // place log record + TaskManager.StartTask("EXCHANGE", "ADD_PUBLIC_FOLDER_ADDRESS", itemId); + + try + { + // check + if (EmailAddressExists(emailAddress)) + return BusinessErrorCodes.ERROR_EXCHANGE_EMAIL_EXISTS; + + // load organization + Organization org = GetOrganization(itemId); + if (org == null) + return -1; + + // check package + int packageCheck = SecurityContext.CheckPackage(org.PackageId, DemandPackage.IsActive); + if (packageCheck < 0) return packageCheck; + + // load account + ExchangeAccount account = GetAccount(itemId, accountId); + + // add e-mail + AddAccountEmailAddress(accountId, emailAddress); + + // update e-mail addresses + int exchangeServiceId = GetExchangeServiceID(org.PackageId); + ExchangeServer exchange = GetExchangeServer(exchangeServiceId, org.ServiceId); + + exchange.SetPublicFolderEmailAddresses( + org.OrganizationId, + account.DisplayName, + GetAccountSimpleEmailAddresses(itemId, accountId)); + + return 0; + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + } + + public static int SetPublicFolderPrimaryEmailAddress(int itemId, int accountId, string emailAddress) + { + // check account + int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); + if (accountCheck < 0) return accountCheck; + + // place log record + TaskManager.StartTask("EXCHANGE", "SET_PRIMARY_PUBLIC_FOLDER_ADDRESS", itemId); + + try + { + // get account + ExchangeAccount account = GetAccount(itemId, accountId); + account.PrimaryEmailAddress = emailAddress; + + // update exchange + Organization org = GetOrganization(itemId); + if (org == null) + return -1; + + // check package + int packageCheck = SecurityContext.CheckPackage(org.PackageId, DemandPackage.IsActive); + if (packageCheck < 0) return packageCheck; + + int exchangeServiceId = GetExchangeServiceID(org.PackageId); + ExchangeServer exchange = GetExchangeServer(exchangeServiceId, org.ServiceId); + + exchange.SetPublicFolderPrimaryEmailAddress( + org.OrganizationId, + account.DisplayName, + emailAddress); + + // save account + account.AccountPassword = null; + UpdateAccount(account); + + return 0; + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + } + + public static int DeletePublicFolderEmailAddresses(int itemId, int accountId, string[] emailAddresses) + { + // check account + int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); + if (accountCheck < 0) return accountCheck; + + // place log record + TaskManager.StartTask("EXCHANGE", "DELETE_PUBLIC_FOLDER_ADDRESSES", itemId); + + try + { + // get account + ExchangeAccount account = GetAccount(itemId, accountId); + + // delete e-mail addresses + List toDelete = new List(); + foreach (string emailAddress in emailAddresses) + { + if (String.Compare(account.PrimaryEmailAddress, emailAddress, true) != 0) + toDelete.Add(emailAddress); + } + + // delete from meta-base + DeleteAccountEmailAddresses(accountId, toDelete.ToArray()); + + // delete from Exchange + Organization org = GetOrganization(itemId); + if (org == null) + return -1; + + // update e-mail addresses + int exchangeServiceId = GetExchangeServiceID(org.PackageId); + ExchangeServer exchange = GetExchangeServer(exchangeServiceId, org.ServiceId); + + exchange.SetPublicFolderEmailAddresses( + org.OrganizationId, + account.DisplayName, + GetAccountSimpleEmailAddresses(itemId, accountId)); + + return 0; + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + } + #endregion + + #region Private Helpers + + + private static string GetPrimaryDomainController(int organizationServiceId) + { + + Organizations orgProxy = new Organizations(); + + ServiceProviderProxy.Init(orgProxy, organizationServiceId); + + string[] organizationSettings = orgProxy.ServiceProviderSettingsSoapHeaderValue.Settings; + + + + string orgPrimaryDomainController = string.Empty; + foreach (string str in organizationSettings) + { + string[] props = str.Split('='); + if (props[0].ToLower() == "primarydomaincontroller") + { + orgPrimaryDomainController = str; + break; + } + } + + return orgPrimaryDomainController; + } + + private static void ExtendExchangeSettings(List exchangeSettings, string primaryDomainController) + { + bool isAdded = false; + for (int i = 0; i < exchangeSettings.Count; i++) + { + string[] props = exchangeSettings[i].Split('='); + if (props[0].ToLower() == "primarydomaincontroller") + { + exchangeSettings[i] = primaryDomainController; + isAdded = true; + break; + } + } + + if (!isAdded) + { + exchangeSettings.Add(primaryDomainController); + } + } + + internal static ServiceProvider GetServiceProvider(int exchangeServiceId, int organizationServiceId) + { + ServiceProvider ws = new ServiceProvider(); + + ServiceProviderProxy.Init(ws, exchangeServiceId); + + string[] exchangeSettings = ws.ServiceProviderSettingsSoapHeaderValue.Settings; + + List resSettings = new List(exchangeSettings); + + string orgPrimaryDomainController = GetPrimaryDomainController(organizationServiceId); + + ExtendExchangeSettings(resSettings, orgPrimaryDomainController); + ws.ServiceProviderSettingsSoapHeaderValue.Settings = resSettings.ToArray(); + return ws; + } + + internal static ExchangeServer GetExchangeServer(int exchangeServiceId, int organizationServiceId) + { + ExchangeServer ws = new ExchangeServer(); + + ServiceProviderProxy.Init(ws, exchangeServiceId); + + string []exchangeSettings = ws.ServiceProviderSettingsSoapHeaderValue.Settings; + + List resSettings = new List(exchangeSettings); + + string orgPrimaryDomainController = GetPrimaryDomainController(organizationServiceId); + + ExtendExchangeSettings(resSettings, orgPrimaryDomainController); + ws.ServiceProviderSettingsSoapHeaderValue.Settings = resSettings.ToArray(); + return ws; + } + + internal static ServiceProvider GetExchangeServiceProvider(int exchangeServiceId, int organizationServiceId) + { + ServiceProvider ws = new ServiceProvider(); + + ServiceProviderProxy.Init(ws, exchangeServiceId); + + string[] exchangeSettings = ws.ServiceProviderSettingsSoapHeaderValue.Settings; + + List resSettings = new List(exchangeSettings); + + string orgPrimaryDomainController = GetPrimaryDomainController(organizationServiceId); + + ExtendExchangeSettings(resSettings, orgPrimaryDomainController); + ws.ServiceProviderSettingsSoapHeaderValue.Settings = resSettings.ToArray(); + return ws; + } + + + private static int GetExchangeServiceID(int packageId) + { + return PackageController.GetPackageServiceId(packageId, ResourceGroups.Exchange); + } + + private static string[] GetAccountSimpleEmailAddresses(int itemId, int accountId) + { + ExchangeEmailAddress[] emails = GetAccountEmailAddresses(itemId, accountId); + List result = new List(); + foreach (ExchangeEmailAddress email in emails) + { + string prefix = email.IsPrimary ? "SMTP:" : "smtp:"; + result.Add(prefix + email.EmailAddress); + } + + return result.ToArray(); + } + + private static bool QuotaEnabled(PackageContext cntx, string quotaName) + { + return cntx.Quotas.ContainsKey(quotaName) && !cntx.Quotas[quotaName].QuotaExhausted; + } + + private static bool IsDemoMode + { + get + { + return (SecurityContext.CheckAccount(DemandAccount.NotDemo) < 0); + } + } + #endregion + + public static ExchangeMobileDevice[] GetMobileDevices(int itemId, int accountId) + { + // place log record + TaskManager.StartTask("EXCHANGE", "GET_MOBILE_DEVICES", itemId); + + try + { + // load organization + Organization org = GetOrganization(itemId); + if (org == null) + return null; + + // load account + ExchangeAccount account = GetAccount(itemId, accountId); + + int exchangeServiceId = GetExchangeServiceID(org.PackageId); + ExchangeServer exchange = GetExchangeServer(exchangeServiceId, org.ServiceId); + + return exchange.GetMobileDevices(account.UserPrincipalName); + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + } + + public static ExchangeMobileDevice GetMobileDevice(int itemId, string deviceId) + { + // place log record + TaskManager.StartTask("EXCHANGE", "GET_MOBILE_DEVICE", itemId); + + try + { + // load organization + Organization org = GetOrganization(itemId); + if (org == null) + return null; + + int exchangeServiceId = GetExchangeServiceID(org.PackageId); + ExchangeServer exchange = GetExchangeServer(exchangeServiceId, org.ServiceId); + + return exchange.GetMobileDevice(deviceId); + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + } + + public static void WipeDataFromDevice(int itemId, string deviceId) + { + // place log record + TaskManager.StartTask("EXCHANGE", "WIPE_DATA_FROM_DEVICE", itemId); + + try + { + // load organization + Organization org = GetOrganization(itemId); + if (org == null) + return; + + int exchangeServiceId = GetExchangeServiceID(org.PackageId); + ExchangeServer exchange = GetExchangeServer(exchangeServiceId, org.ServiceId); + + exchange.WipeDataFromDevice(deviceId); + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + } + + public static void CancelRemoteWipeRequest(int itemId, string deviceId) + { + // place log record + TaskManager.StartTask("EXCHANGE", "CANCEL_REMOTE_WIPE_REQUEST", itemId); + + try + { + // load organization + Organization org = GetOrganization(itemId); + if (org == null) + return; + + int exchangeServiceId = GetExchangeServiceID(org.PackageId); + ExchangeServer exchange = GetExchangeServer(exchangeServiceId, org.ServiceId); + + exchange.CancelRemoteWipeRequest(deviceId); + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + } + + public static void RemoveDevice(int itemId, string deviceId) + { + // place log record + TaskManager.StartTask("EXCHANGE", "REMOVE_DEVICE", itemId); + + try + { + // load organization + Organization org = GetOrganization(itemId); + if (org == null) + return; + + int exchangeServiceId = GetExchangeServiceID(org.PackageId); + ExchangeServer exchange = GetExchangeServer(exchangeServiceId, org.ServiceId); + + exchange.RemoveDevice(deviceId); + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + } + + #region Disclaimers + + public static int AddExchangeDisclaimer(int itemID, ExchangeDisclaimer disclaimer) + { + int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); + if (accountCheck < 0) return accountCheck; + + // place log record + TaskManager.StartTask("EXCHANGE", "ADD_EXCHANGE_EXCHANGEDISCLAIMER", itemID); + + try + { + return DataProvider.AddExchangeDisclaimer(itemID, disclaimer); + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + + + } + + public static int UpdateExchangeDisclaimer(int itemID, ExchangeDisclaimer disclaimer) + { + int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); + if (accountCheck < 0) return accountCheck; + + // place log record + TaskManager.StartTask("EXCHANGE", "UPDATE_EXCHANGE_EXCHANGEDISCLAIMER", itemID); + + try + { + DataProvider.UpdateExchangeDisclaimer(itemID, disclaimer); + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + + return 0; + } + + public static int DeleteExchangeDisclaimer(int itemId, int exchangeDisclaimerId) + { + int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); + if (accountCheck < 0) return accountCheck; + + TaskManager.StartTask("EXCHANGE", "DELETE_EXCHANGE_EXCHANGEDISCLAIMER", itemId); + + try + { + DataProvider.DeleteExchangeDisclaimer(exchangeDisclaimerId); + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + + return 0; + } + + public static ExchangeDisclaimer GetExchangeDisclaimer(int itemId, int exchangeDisclaimerId) + { + + TaskManager.StartTask("EXCHANGE", "GET_EXCHANGE_EXCHANGEDISCLAIMER", itemId); + + try + { + return ObjectUtils.FillObjectFromDataReader( + DataProvider.GetExchangeDisclaimer(exchangeDisclaimerId)); + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + + } + + public static List GetExchangeDisclaimers(int itemId) + { + TaskManager.StartTask("EXCHANGE", "GET_EXCHANGE_EXCHANGEDISCLAIMER", itemId); + + try + { + List disclaimers = ObjectUtils.CreateListFromDataReader(DataProvider.GetExchangeDisclaimers(itemId)); + return disclaimers; + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + + } + + public static int SetExchangeAccountDisclaimerId(int itemId, int AccountID, int ExchangeDisclaimerId) + { + int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); + if (accountCheck < 0) return accountCheck; + + // place log record + TaskManager.StartTask("EXCHANGE", "SET_EXCHANGE_ACCOUNTDISCLAIMERID", AccountID); + + try + { + ExchangeDisclaimer disclaimer = null; + + if (ExchangeDisclaimerId != -1) + disclaimer = GetExchangeDisclaimer(itemId, ExchangeDisclaimerId); + + // load account + ExchangeAccount account = GetAccount(itemId, AccountID); + + Organization org = (Organization)PackageController.GetPackageItem(itemId); + if (org == null) + return -1; + + int exchangeServiceId = GetExchangeServiceID(org.PackageId); + ExchangeServer exchange = GetExchangeServer(exchangeServiceId, org.ServiceId); + + string transportRuleName = org.Name + "_" + account.PrimaryEmailAddress; + + exchange.RemoveTransportRule(transportRuleName); + + if (disclaimer != null) + { + if (!string.IsNullOrEmpty(disclaimer.DisclaimerText)) + exchange.NewDisclaimerTransportRule(transportRuleName, account.PrimaryEmailAddress, disclaimer.DisclaimerText); + } + + DataProvider.SetExchangeAccountDisclaimerId(AccountID, ExchangeDisclaimerId); + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + + return 0; + + } + + public static int GetExchangeAccountDisclaimerId(int itemId, int AccountID) + { + TaskManager.StartTask("EXCHANGE", "GET_EXCHANGE_ACCOUNTDISCLAIMERID", AccountID); + + try + { + return DataProvider.GetExchangeAccountDisclaimerId(AccountID); + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + + } + #endregion + + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Files/FilesController.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Files/FilesController.cs similarity index 94% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Files/FilesController.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Files/FilesController.cs index e9dc8e48..74dd8d78 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Files/FilesController.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Files/FilesController.cs @@ -169,8 +169,7 @@ namespace WebsitePanel.EnterpriseServer if (packageCheck < 0) return packageCheck; // place log record - TaskManager.StartTask("FILES", "UPDATE_BINARY_CONTENT", path); - TaskManager.ItemId = packageId; + TaskManager.StartTask("FILES", "UPDATE_BINARY_CONTENT", path, packageId); try { @@ -204,8 +203,7 @@ namespace WebsitePanel.EnterpriseServer if (packageCheck < 0) return packageCheck; // place log record - TaskManager.StartTask("FILES", "UPDATE_BINARY_CONTENT", path); - TaskManager.ItemId = packageId; + TaskManager.StartTask("FILES", "UPDATE_BINARY_CONTENT", path, packageId); try { @@ -260,8 +258,8 @@ namespace WebsitePanel.EnterpriseServer if (accountCheck < 0) return accountCheck; // place log record - TaskManager.StartTask("FILES", "DELETE_FILES"); - TaskManager.ItemId = packageId; + TaskManager.StartTask("FILES", "DELETE_FILES", packageId); + if (files != null) { foreach (string file in files) @@ -302,8 +300,7 @@ namespace WebsitePanel.EnterpriseServer if (packageCheck < 0) return packageCheck; // place log record - TaskManager.StartTask("FILES", "CREATE_FILE", path); - TaskManager.ItemId = packageId; + TaskManager.StartTask("FILES", "CREATE_FILE", path, packageId); try { @@ -356,8 +353,7 @@ namespace WebsitePanel.EnterpriseServer if (packageCheck < 0) return packageCheck; // place log record - TaskManager.StartTask("FILES", "CREATE_FOLDER", path); - TaskManager.ItemId = packageId; + TaskManager.StartTask("FILES", "CREATE_FOLDER", path, packageId); try { @@ -396,8 +392,7 @@ namespace WebsitePanel.EnterpriseServer if (!DirectoryExists(packageId, destFolder)) return BusinessErrorCodes.ERROR_FILE_DEST_FOLDER_NONEXISTENT; // place log record - TaskManager.StartTask("FILES", "COPY_FILES"); - TaskManager.ItemId = packageId; + TaskManager.StartTask("FILES", "COPY_FILES", packageId); TaskManager.WriteParameter("Destination folder", destFolder); if (files != null) { @@ -455,8 +450,8 @@ namespace WebsitePanel.EnterpriseServer if (!DirectoryExists(packageId, destFolder)) return BusinessErrorCodes.ERROR_FILE_DEST_FOLDER_NONEXISTENT; // place log record - TaskManager.StartTask("FILES", "MOVE_FILES"); - TaskManager.ItemId = packageId; + TaskManager.StartTask("FILES", "MOVE_FILES", packageId); + TaskManager.WriteParameter("Destination folder", destFolder); if (files != null) { @@ -514,8 +509,8 @@ namespace WebsitePanel.EnterpriseServer if (accountCheck < 0) return accountCheck; // place log record - TaskManager.StartTask("FILES", "RENAME_FILE", oldPath); - TaskManager.ItemId = packageId; + TaskManager.StartTask("FILES", "RENAME_FILE", oldPath, packageId); + TaskManager.WriteParameter("New name", newPath); try @@ -551,8 +546,8 @@ namespace WebsitePanel.EnterpriseServer if (packageCheck < 0) return null; // place log record - TaskManager.StartTask("FILES", "UNZIP_FILES"); - TaskManager.ItemId = packageId; + TaskManager.StartTask("FILES", "UNZIP_FILES", packageId); + if (files != null) { foreach (string file in files) @@ -596,8 +591,8 @@ namespace WebsitePanel.EnterpriseServer if (packageCheck < 0) return packageCheck; // place log record - TaskManager.StartTask("FILES", "ZIP_FILES", archivePath); - TaskManager.ItemId = packageId; + TaskManager.StartTask("FILES", "ZIP_FILES", archivePath, packageId); + if (files != null) { foreach (string file in files) @@ -647,8 +642,8 @@ namespace WebsitePanel.EnterpriseServer if (packageCheck < 0) return packageCheck; // place log record - TaskManager.StartTask("FILES", "ZIP_FILES", archivePath); - TaskManager.ItemId = packageId; + TaskManager.StartTask("FILES", "ZIP_FILES", archivePath, packageId); + if (files != null) { foreach (string file in files) @@ -706,8 +701,7 @@ namespace WebsitePanel.EnterpriseServer if (packageCheck < 0) return packageCheck; // place log record - TaskManager.StartTask("FILES", "CREATE_ACCESS_DATABASE", dbPath); - TaskManager.ItemId = packageId; + TaskManager.StartTask("FILES", "CREATE_ACCESS_DATABASE", dbPath, packageId); try { @@ -737,8 +731,7 @@ namespace WebsitePanel.EnterpriseServer if (accountCheck < 0) return accountCheck; // place log record - TaskManager.StartTask("SPACE", "CALCULATE_DISKSPACE"); - TaskManager.ItemId = packageId; + TaskManager.StartTask("SPACE", "CALCULATE_DISKSPACE", packageId); try { @@ -813,8 +806,7 @@ namespace WebsitePanel.EnterpriseServer if (accountCheck < 0) return accountCheck; // place log record - TaskManager.StartTask("FILES", "SET_PERMISSIONS", path); - TaskManager.ItemId = packageId; + TaskManager.StartTask("FILES", "SET_PERMISSIONS", path, packageId); try { @@ -925,8 +917,7 @@ namespace WebsitePanel.EnterpriseServer if (packageCheck < 0) return packageCheck; // place log record - TaskManager.StartTask("FILES", "SET_QUOTA_ON_FOLDER", path); - TaskManager.ItemId = packageId; + TaskManager.StartTask("FILES", "SET_QUOTA_ON_FOLDER", path, packageId); try { @@ -1046,8 +1037,7 @@ namespace WebsitePanel.EnterpriseServer if (packageCheck < 0) return packageCheck; // place log record - TaskManager.StartTask("FILES", "DELETE_DIRECTORY_RECURSIVE", rootPath); - TaskManager.ItemId = packageId; + TaskManager.StartTask("FILES", "DELETE_DIRECTORY_RECURSIVE", rootPath, packageId); try { diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/FtpServers/FtpServerController.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/FtpServers/FtpServerController.cs similarity index 96% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/FtpServers/FtpServerController.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/FtpServers/FtpServerController.cs index 4c174bf0..25541268 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/FtpServers/FtpServerController.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/FtpServers/FtpServerController.cs @@ -215,8 +215,8 @@ namespace WebsitePanel.EnterpriseServer if (packageCheck < 0) return packageCheck; // place log record - TaskManager.StartTask("FTP_ACCOUNT", "UPDATE", origItem.Name); - TaskManager.ItemId = item.Id; + TaskManager.StartTask("FTP_ACCOUNT", "UPDATE", origItem.Name, item.Id); + TaskManager.WriteParameter("Folder", item.Folder); TaskManager.WriteParameter("CanRead", item.CanRead); TaskManager.WriteParameter("CanWrite", item.CanWrite); @@ -279,8 +279,7 @@ namespace WebsitePanel.EnterpriseServer return BusinessErrorCodes.ERROR_FTP_PACKAGE_ITEM_NOT_FOUND; // place log record - TaskManager.StartTask("FTP_ACCOUNT", "DELETE", origItem.Name); - TaskManager.ItemId = itemId; + TaskManager.StartTask("FTP_ACCOUNT", "DELETE", origItem.Name, itemId); try { diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/HeliconZoo/HeliconZooController.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/HeliconZoo/HeliconZooController.cs similarity index 100% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/HeliconZoo/HeliconZooController.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/HeliconZoo/HeliconZooController.cs diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/HostedSolution/BlackBerryController.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/HostedSolution/BlackBerryController.cs similarity index 100% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/HostedSolution/BlackBerryController.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/HostedSolution/BlackBerryController.cs diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/HostedSolution/CRMController.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/HostedSolution/CRMController.cs similarity index 100% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/HostedSolution/CRMController.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/HostedSolution/CRMController.cs diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/HostedSolution/LyncController.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/HostedSolution/LyncController.cs similarity index 95% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/HostedSolution/LyncController.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/HostedSolution/LyncController.cs index a72d5b59..e78b8a10 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/HostedSolution/LyncController.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/HostedSolution/LyncController.cs @@ -419,8 +419,7 @@ namespace WebsitePanel.EnterpriseServer.Code.HostedSolution if (accountCheck < 0) return accountCheck; // place log record - TaskManager.StartTask("LYNC", "DELETE_ORG"); - TaskManager.ItemId = itemId; + TaskManager.StartTask("LYNC", "DELETE_ORG", itemId); try { @@ -622,8 +621,7 @@ namespace WebsitePanel.EnterpriseServer.Code.HostedSolution public static List GetLyncUserPlans(int itemId) { // place log record - TaskManager.StartTask("LYNC", "GET_LYNC_LYNCUSERPLANS"); - TaskManager.ItemId = itemId; + TaskManager.StartTask("LYNC", "GET_LYNC_LYNCUSERPLANS", itemId); try { @@ -705,8 +703,7 @@ namespace WebsitePanel.EnterpriseServer.Code.HostedSolution { // place log record - TaskManager.StartTask("LYNC", "GET_LYNC_LYNCUSERPLAN"); - TaskManager.ItemId = lyncUserPlanId; + TaskManager.StartTask("LYNC", "GET_LYNC_LYNCUSERPLAN", lyncUserPlanId); try { @@ -729,8 +726,7 @@ namespace WebsitePanel.EnterpriseServer.Code.HostedSolution if (accountCheck < 0) return accountCheck; // place log record - TaskManager.StartTask("LYNC", "ADD_LYNC_LYNCUSERPLAN"); - TaskManager.ItemId = itemID; + TaskManager.StartTask("LYNC", "ADD_LYNC_LYNCUSERPLAN", itemID); try { @@ -770,8 +766,7 @@ namespace WebsitePanel.EnterpriseServer.Code.HostedSolution if (accountCheck < 0) return accountCheck; // place log record - TaskManager.StartTask("LYNC", "ADD_LYNC_LYNCUSERPLAN"); - TaskManager.ItemId = itemID; + TaskManager.StartTask("LYNC", "ADD_LYNC_LYNCUSERPLAN", itemID); try { @@ -809,8 +804,7 @@ namespace WebsitePanel.EnterpriseServer.Code.HostedSolution int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); if (accountCheck < 0) return accountCheck; - TaskManager.StartTask("LYNC", "DELETE_LYNC_LYNCPLAN"); - TaskManager.ItemId = itemID; + TaskManager.StartTask("LYNC", "DELETE_LYNC_LYNCPLAN", itemID); try { @@ -834,8 +828,7 @@ namespace WebsitePanel.EnterpriseServer.Code.HostedSolution int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); if (accountCheck < 0) return accountCheck; - TaskManager.StartTask("LYNC", "SET_LYNC_LYNCUSERPLAN"); - TaskManager.ItemId = itemId; + TaskManager.StartTask("LYNC", "SET_LYNC_LYNCUSERPLAN", itemId); try { @@ -861,8 +854,7 @@ namespace WebsitePanel.EnterpriseServer.Code.HostedSolution public static LyncFederationDomain[] GetFederationDomains(int itemId) { // place log record - TaskManager.StartTask("LYNC", "GET_LYNC_FEDERATIONDOMAINS"); - TaskManager.ItemId = itemId; + TaskManager.StartTask("LYNC", "GET_LYNC_FEDERATIONDOMAINS", itemId); LyncFederationDomain[] lyncFederationDomains = null; @@ -889,10 +881,11 @@ namespace WebsitePanel.EnterpriseServer.Code.HostedSolution public static LyncUserResult AddFederationDomain(int itemId, string domainName, string proxyFqdn) { - LyncUserResult res = TaskManager.StartResultTask("LYNC", "ADD_LYNC_FEDERATIONDOMAIN"); - TaskManager.ItemId = itemId; - TaskManager.TaskParameters["domainName"] = domainName; - TaskManager.TaskParameters["proxyFqdn"] = proxyFqdn; + List parameters = new List(); + parameters.Add(new BackgroundTaskParameter("domainName", domainName)); + parameters.Add(new BackgroundTaskParameter("proxyFqdn", proxyFqdn)); + + LyncUserResult res = TaskManager.StartResultTask("LYNC", "ADD_LYNC_FEDERATIONDOMAIN", itemId, parameters); int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); @@ -966,9 +959,7 @@ namespace WebsitePanel.EnterpriseServer.Code.HostedSolution public static LyncUserResult RemoveFederationDomain(int itemId, string domainName) { - LyncUserResult res = TaskManager.StartResultTask("LYNC", "REMOVE_LYNC_FEDERATIONDOMAIN"); - TaskManager.ItemId = itemId; - TaskManager.TaskParameters["domainName"] = domainName; + LyncUserResult res = TaskManager.StartResultTask("LYNC", "REMOVE_LYNC_FEDERATIONDOMAIN", itemId, new BackgroundTaskParameter("domainName", domainName)); int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/HostedSolution/LyncControllerAsync.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/HostedSolution/LyncControllerAsync.cs similarity index 100% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/HostedSolution/LyncControllerAsync.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/HostedSolution/LyncControllerAsync.cs diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/HostedSolution/OCSController.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/HostedSolution/OCSController.cs similarity index 100% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/HostedSolution/OCSController.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/HostedSolution/OCSController.cs diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/HostedSolution/OrganizationController.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/HostedSolution/OrganizationController.cs similarity index 95% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/HostedSolution/OrganizationController.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/HostedSolution/OrganizationController.cs index e8eb4767..95d5da6f 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/HostedSolution/OrganizationController.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/HostedSolution/OrganizationController.cs @@ -291,9 +291,11 @@ namespace WebsitePanel.EnterpriseServer return errorCode; // place log record - TaskManager.StartTask("ORGANIZATION", "CREATE_ORG", organizationName); - TaskManager.TaskParameters["Organization ID"] = organizationId; - TaskManager.TaskParameters["DomainName"] = domainName; + List parameters = new List(); + parameters.Add(new BackgroundTaskParameter("Organization ID", organizationId)); + parameters.Add(new BackgroundTaskParameter("DomainName", domainName)); + + TaskManager.StartTask("ORGANIZATION", "CREATE_ORG", organizationName, parameters); try { @@ -411,9 +413,7 @@ namespace WebsitePanel.EnterpriseServer if (accountCheck < 0) return accountCheck; // place log record - TaskManager.StartTask("ORGANIZATION", "DELETE_DOMAIN"); - TaskManager.TaskParameters["Domain ID"] = domainId; - TaskManager.ItemId = itemId; + TaskManager.StartTask("ORGANIZATION", "DELETE_DOMAIN", itemId, new BackgroundTaskParameter("Domain ID", domainId)); try { @@ -586,8 +586,7 @@ namespace WebsitePanel.EnterpriseServer if (accountCheck < 0) return accountCheck; // place log record - TaskManager.StartTask("ORGANIZATION", "DELETE_ORG"); - TaskManager.ItemId = itemId; + TaskManager.StartTask("ORGANIZATION", "DELETE_ORG", itemId); try { @@ -869,8 +868,7 @@ namespace WebsitePanel.EnterpriseServer #endregion // place log record - TaskManager.StartTask("ORGANIZATION", "GET_ORG_STATS"); - TaskManager.ItemId = itemId; + TaskManager.StartTask("ORGANIZATION", "GET_ORG_STATS", itemId); try { @@ -1022,8 +1020,7 @@ namespace WebsitePanel.EnterpriseServer if (accountCheck < 0) return accountCheck; // place log record - TaskManager.StartTask("ORGANIZATION", "CHANGE_DOMAIN_TYPE", domainId); - TaskManager.ItemId = itemId; + TaskManager.StartTask("ORGANIZATION", "CHANGE_DOMAIN_TYPE", domainId, itemId); try { @@ -1060,8 +1057,7 @@ namespace WebsitePanel.EnterpriseServer return BusinessErrorCodes.ERROR_EXCHANGE_DOMAINS_QUOTA_LIMIT; // place log record - TaskManager.StartTask("ORGANIZATION", "ADD_DOMAIN", domainName); - TaskManager.ItemId = itemId; + TaskManager.StartTask("ORGANIZATION", "ADD_DOMAIN", domainName, itemId); try { @@ -1291,8 +1287,8 @@ namespace WebsitePanel.EnterpriseServer // place log record - TaskManager.StartTask("ORGANIZATION", "CREATE_USER"); - TaskManager.ItemId = itemId; + TaskManager.StartTask("ORGANIZATION", "CREATE_USER", itemId); + TaskManager.Write("Organization ID :" + itemId); TaskManager.Write("name :" + name); TaskManager.Write("domain :" + domain); @@ -1414,8 +1410,8 @@ namespace WebsitePanel.EnterpriseServer // place log record - TaskManager.StartTask("ORGANIZATION", "IMPORT_USER"); - TaskManager.ItemId = itemId; + TaskManager.StartTask("ORGANIZATION", "IMPORT_USER", itemId); + TaskManager.Write("Organization ID :" + itemId); TaskManager.Write("account :" + accountName); TaskManager.Write("name :" + name); @@ -1572,8 +1568,7 @@ namespace WebsitePanel.EnterpriseServer if (accountCheck < 0) return accountCheck; // place log record - TaskManager.StartTask("ORGANIZATION", "DELETE_USER"); - TaskManager.ItemId = itemId; + TaskManager.StartTask("ORGANIZATION", "DELETE_USER", itemId); try { @@ -1676,8 +1671,7 @@ namespace WebsitePanel.EnterpriseServer #endregion // place log record - TaskManager.StartTask("ORGANIZATION", "GET_USER_GENERAL"); - TaskManager.ItemId = itemId; + TaskManager.StartTask("ORGANIZATION", "GET_USER_GENERAL", itemId); OrganizationUser account = null; Organization org = null; @@ -1700,8 +1694,8 @@ namespace WebsitePanel.EnterpriseServer // get mailbox settings Organizations orgProxy = GetOrganizationProxy(org.ServiceId); string accountName = GetAccountName(account.AccountName); - - + + OrganizationUser retUser = orgProxy.GetUserGeneralSettings(accountName, org.OrganizationId); retUser.AccountId = accountId; retUser.AccountName = account.AccountName; @@ -1712,13 +1706,10 @@ namespace WebsitePanel.EnterpriseServer retUser.IsLyncUser = DataProvider.CheckLyncUserExists(accountId); retUser.IsBlackBerryUser = BlackBerryController.CheckBlackBerryUserExists(accountId); retUser.SubscriberNumber = account.SubscriberNumber; - + return retUser; } - catch (Exception ex) - { - //throw TaskManager.WriteError(ex); - } + catch { } finally { TaskManager.CompleteTask(); @@ -1740,8 +1731,7 @@ namespace WebsitePanel.EnterpriseServer if (accountCheck < 0) return accountCheck; // place log record - TaskManager.StartTask("ORGANIZATION", "UPDATE_USER_GENERAL"); - TaskManager.ItemId = itemId; + TaskManager.StartTask("ORGANIZATION", "UPDATE_USER_GENERAL", itemId); try { @@ -1832,8 +1822,7 @@ namespace WebsitePanel.EnterpriseServer // place log record - TaskManager.StartTask("ORGANIZATION", "SET_USER_USERPRINCIPALNAME"); - TaskManager.ItemId = itemId; + TaskManager.StartTask("ORGANIZATION", "SET_USER_USERPRINCIPALNAME", itemId); try { @@ -1931,8 +1920,7 @@ namespace WebsitePanel.EnterpriseServer if (accountCheck < 0) return accountCheck; // place log record - TaskManager.StartTask("ORGANIZATION", "SET_USER_PASSWORD"); - TaskManager.ItemId = itemId; + TaskManager.StartTask("ORGANIZATION", "SET_USER_PASSWORD", itemId); try { @@ -2048,8 +2036,7 @@ namespace WebsitePanel.EnterpriseServer public static int GetAccountIdByUserPrincipalName(int itemId, string userPrincipalName) { // place log record - TaskManager.StartTask("ORGANIZATION", "GET_ACCOUNT_BYUPN"); - TaskManager.ItemId = itemId; + TaskManager.StartTask("ORGANIZATION", "GET_ACCOUNT_BYUPN", itemId); int accounId = -1; diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/HostedSolution/ReportController.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/HostedSolution/ReportController.cs similarity index 100% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/HostedSolution/ReportController.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/HostedSolution/ReportController.cs diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Log/AuditLog.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Log/AuditLog.cs similarity index 96% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Log/AuditLog.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Log/AuditLog.cs index ec012ecf..0b1a62e1 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Log/AuditLog.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Log/AuditLog.cs @@ -92,10 +92,7 @@ namespace WebsitePanel.EnterpriseServer DataProvider.AddAuditLogRecord(recordId, severityId, userId, username, packageId, itemId, itemName, startDate, finishDate, sourceName, taskName, executionLog); } - catch - { - // skip error - } + catch { } } private static DateTime GetStartDate(DateTime d) diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/MailServers/MailServerController.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/MailServers/MailServerController.cs similarity index 94% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/MailServers/MailServerController.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/MailServers/MailServerController.cs index a911b077..d7923702 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/MailServers/MailServerController.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/MailServers/MailServerController.cs @@ -191,8 +191,7 @@ namespace WebsitePanel.EnterpriseServer return BusinessErrorCodes.ERROR_MAIL_ACCOUNT_MAX_MAILBOX_SIZE_LIMIT; // place log record - TaskManager.StartTask("MAIL_ACCOUNT", "UPDATE", origItem.Name); - TaskManager.ItemId = item.Id; + TaskManager.StartTask("MAIL_ACCOUNT", "UPDATE", origItem.Name, item.Id); try { @@ -245,8 +244,7 @@ namespace WebsitePanel.EnterpriseServer return BusinessErrorCodes.ERROR_MAIL_ACCOUNTS_PACKAGE_ITEM_NOT_FOUND; // place log record - TaskManager.StartTask("MAIL_ACCOUNT", "DELETE", origItem.Name); - TaskManager.ItemId = itemId; + TaskManager.StartTask("MAIL_ACCOUNT", "DELETE", origItem.Name, itemId); try { @@ -402,7 +400,7 @@ namespace WebsitePanel.EnterpriseServer item.ServiceId = serviceId; int itemId = PackageController.AddPackageItem(item); - TaskManager.ItemId = itemId; + TaskManager.ItemId = itemId; return itemId; } @@ -432,8 +430,7 @@ namespace WebsitePanel.EnterpriseServer if (packageCheck < 0) return packageCheck; // place log record - TaskManager.StartTask("MAIL_FORWARDING", "UPDATE", origItem.Name); - TaskManager.ItemId = item.Id; + TaskManager.StartTask("MAIL_FORWARDING", "UPDATE", origItem.Name, item.Id); try { @@ -477,8 +474,7 @@ namespace WebsitePanel.EnterpriseServer return BusinessErrorCodes.ERROR_MAIL_FORWARDINGS_PACKAGE_ITEM_NOT_FOUND; // place log record - TaskManager.StartTask("MAIL_FORWARDING", "DELETE", origItem.Name); - TaskManager.ItemId = itemId; + TaskManager.StartTask("MAIL_FORWARDING", "DELETE", origItem.Name, itemId); try { @@ -638,8 +634,7 @@ namespace WebsitePanel.EnterpriseServer return BusinessErrorCodes.ERROR_MAIL_GROUPS_RECIPIENTS_LIMIT; // place log record - TaskManager.StartTask("MAIL_GROUP", "UPDATE", origItem.Name); - TaskManager.ItemId = item.Id; + TaskManager.StartTask("MAIL_GROUP", "UPDATE", origItem.Name, item.Id); try { @@ -679,8 +674,7 @@ namespace WebsitePanel.EnterpriseServer return BusinessErrorCodes.ERROR_MAIL_GROUPS_PACKAGE_ITEM_NOT_FOUND; // place log record - TaskManager.StartTask("MAIL_GROUP", "DELETE", origItem.Name); - TaskManager.ItemId = itemId; + TaskManager.StartTask("MAIL_GROUP", "DELETE", origItem.Name, itemId); try { @@ -889,8 +883,7 @@ namespace WebsitePanel.EnterpriseServer return BusinessErrorCodes.ERROR_MAIL_LISTS_RECIPIENTS_LIMIT; // place log record - TaskManager.StartTask("MAIL_LIST", "UPDATE", origItem.Name); - TaskManager.ItemId = item.Id; + TaskManager.StartTask("MAIL_LIST", "UPDATE", origItem.Name, item.Id); try { @@ -938,8 +931,7 @@ namespace WebsitePanel.EnterpriseServer return BusinessErrorCodes.ERROR_MAIL_LISTS_PACKAGE_ITEM_NOT_FOUND; // place log record - TaskManager.StartTask("MAIL_LIST", "DELETE", origItem.Name); - TaskManager.ItemId = itemId; + TaskManager.StartTask("MAIL_LIST", "DELETE", origItem.Name, itemId); try { @@ -1073,7 +1065,8 @@ namespace WebsitePanel.EnterpriseServer } TaskManager.ItemId = itemId; - return itemId; + + return itemId; } catch (Exception ex) { @@ -1101,8 +1094,7 @@ namespace WebsitePanel.EnterpriseServer if (packageCheck < 0) return packageCheck; // place log record - TaskManager.StartTask("MAIL_DOMAIN", "UPDATE", origItem.Name); - TaskManager.ItemId = item.Id; + TaskManager.StartTask("MAIL_DOMAIN", "UPDATE", origItem.Name, item.Id); // get service MailServer mail = new MailServer(); @@ -1148,8 +1140,7 @@ namespace WebsitePanel.EnterpriseServer return BusinessErrorCodes.ERROR_MAIL_DOMAIN_IS_NOT_EMPTY; // mail domain is not empty // place log record - TaskManager.StartTask("MAIL_DOMAIN", "DELETE", origItem.Name); - TaskManager.ItemId = itemId; + TaskManager.StartTask("MAIL_DOMAIN", "DELETE", origItem.Name, itemId); try { @@ -1222,10 +1213,9 @@ namespace WebsitePanel.EnterpriseServer return BusinessErrorCodes.ERROR_DOMAIN_PACKAGE_ITEM_NOT_FOUND; // place log record - TaskManager.StartTask("MAIL_DOMAIN", "ADD_POINTER", mailDomain.Name); - TaskManager.ItemId = itemId; - TaskManager.TaskParameters["Domain ID"] = domain.DomainId; - TaskManager.WriteParameter("Domain pointer", domain.DomainName); + TaskManager.StartTask("MAIL_DOMAIN", "ADD_POINTER", mailDomain.Name, itemId, new BackgroundTaskParameter("Domain ID", domain.DomainId)); + + TaskManager.WriteParameter("Domain pointer", domain.DomainName); try { @@ -1277,10 +1267,12 @@ namespace WebsitePanel.EnterpriseServer return BusinessErrorCodes.ERROR_DOMAIN_PACKAGE_ITEM_NOT_FOUND; // place log record - TaskManager.StartTask("MAIL_DOMAIN", "DELETE_POINTER", mailDomain.Name); - TaskManager.ItemId = itemId; - TaskManager.TaskParameters["Domain ID"] = domain.DomainId; - TaskManager.WriteParameter("Domain pointer", domain.DomainName); + + List parameters = new List(); + parameters.Add(new BackgroundTaskParameter("Domain ID", domain.DomainId)); + parameters.Add(new BackgroundTaskParameter("Domain pointer", domain.DomainName)); + + TaskManager.StartTask("MAIL_DOMAIN", "DELETE_POINTER", mailDomain.Name, itemId, parameters); try { diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/MailServers/QuotaLimit.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/MailServers/QuotaLimit.cs similarity index 100% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/MailServers/QuotaLimit.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/MailServers/QuotaLimit.cs diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/OperatingSystems/OperatingSystemController.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/OperatingSystems/OperatingSystemController.cs similarity index 95% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/OperatingSystems/OperatingSystemController.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/OperatingSystems/OperatingSystemController.cs index 238ec360..10a79b04 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/OperatingSystems/OperatingSystemController.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/OperatingSystems/OperatingSystemController.cs @@ -191,8 +191,7 @@ namespace WebsitePanel.EnterpriseServer if (packageCheck < 0) return packageCheck; // place log record - TaskManager.StartTask("ODBC_DSN", "UPDATE", origItem.Name); - TaskManager.ItemId = item.Id; + TaskManager.StartTask("ODBC_DSN", "UPDATE", origItem.Name, item.Id); try { @@ -265,8 +264,7 @@ namespace WebsitePanel.EnterpriseServer return BusinessErrorCodes.ERROR_OS_DSN_PACKAGE_ITEM_NOT_FOUND; // place log record - TaskManager.StartTask("ODBC_DSN", "DELETE", origItem.Name); - TaskManager.ItemId = itemId; + TaskManager.StartTask("ODBC_DSN", "DELETE", origItem.Name, itemId); try { @@ -316,8 +314,7 @@ namespace WebsitePanel.EnterpriseServer ServerInfo server = ServerController.GetServerById(serverId); // place log record - TaskManager.StartTask("SERVER", "RESET_TERMINAL_SESSION", sessionId); - TaskManager.ItemId = serverId; + TaskManager.StartTask("SERVER", "RESET_TERMINAL_SESSION", sessionId, serverId); try { @@ -352,8 +349,7 @@ namespace WebsitePanel.EnterpriseServer ServerInfo server = ServerController.GetServerById(serverId); // place log record - TaskManager.StartTask("SERVER", "TERMINATE_SYSTEM_PROCESS", pid); - TaskManager.ItemId = serverId; + TaskManager.StartTask("SERVER", "TERMINATE_SYSTEM_PROCESS", pid, serverId); try { @@ -388,8 +384,7 @@ namespace WebsitePanel.EnterpriseServer ServerInfo server = ServerController.GetServerById(serverId); // place log record - TaskManager.StartTask("SERVER", "CHANGE_WINDOWS_SERVICE_STATUS", id); - TaskManager.ItemId = serverId; + TaskManager.StartTask("SERVER", "CHANGE_WINDOWS_SERVICE_STATUS", id, serverId); TaskManager.WriteParameter("New Status", status); try @@ -555,8 +550,7 @@ namespace WebsitePanel.EnterpriseServer | DemandAccount.IsActive); if (accountCheck < 0) return accountCheck; - TaskManager.StartTask("SERVER", "CLEAR_EVENT_LOG", logName); - TaskManager.ItemId = serverId; + TaskManager.StartTask("SERVER", "CLEAR_EVENT_LOG", logName, serverId); try { @@ -587,8 +581,7 @@ namespace WebsitePanel.EnterpriseServer ServerInfo server = ServerController.GetServerById(serverId); // place log record - TaskManager.StartTask("SERVER", "REBOOT"); - TaskManager.ItemId = serverId; + TaskManager.StartTask("SERVER", "REBOOT", serverId); try { diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Packages/PackageAsyncWorker.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Packages/PackageAsyncWorker.cs similarity index 100% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Packages/PackageAsyncWorker.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Packages/PackageAsyncWorker.cs diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Packages/PackageController.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Packages/PackageController.cs similarity index 97% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Packages/PackageController.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Packages/PackageController.cs index 3363a13f..b8532151 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Packages/PackageController.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Packages/PackageController.cs @@ -617,8 +617,12 @@ namespace WebsitePanel.EnterpriseServer } } - TaskManager.ItemId = result.Result; - TaskManager.TaskParameters["SendLetter"] = sendLetter; + BackgroundTask topTask = TaskManager.TopTask; + + topTask.ItemId = userId; + topTask.UpdateParamValue("SendLetter", sendLetter); + + TaskController.UpdateTaskWithParams(topTask); return result; } @@ -718,10 +722,14 @@ namespace WebsitePanel.EnterpriseServer if (homeId < 0) result.Result = homeId; - TaskManager.ItemId = result.Result; - TaskManager.TaskParameters["Signup"] = signup; - TaskManager.TaskParameters["UserId"] = userId; - TaskManager.TaskParameters["SendLetter"] = sendLetter; + BackgroundTask topTask = TaskManager.TopTask; + + topTask.ItemId = userId; + topTask.UpdateParamValue("Signup", signup); + topTask.UpdateParamValue("UserId", userId); + topTask.UpdateParamValue("SendLetter", sendLetter); + + TaskController.UpdateTaskWithParams(topTask); } finally { diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Packages/ServiceItemsPaged.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Packages/ServiceItemsPaged.cs similarity index 100% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Packages/ServiceItemsPaged.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Packages/ServiceItemsPaged.cs diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Properties/AssemblyInfo.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..3fd65c77 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("WebsitePanel.EnterpriseServer.Code")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("OM-3")] +[assembly: AssemblyProduct("WebsitePanel.EnterpriseServer.Code")] +[assembly: AssemblyCopyright("Copyright © OM-3 2013")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("e5f16c8f-9560-459d-88d4-9c6ee9b71283")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Provisioning/BackupAsyncWorker.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Provisioning/BackupAsyncWorker.cs similarity index 100% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Provisioning/BackupAsyncWorker.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Provisioning/BackupAsyncWorker.cs diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Provisioning/BackupController.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Provisioning/BackupController.cs similarity index 95% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Provisioning/BackupController.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Provisioning/BackupController.cs index a580954a..23d8864c 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Provisioning/BackupController.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Provisioning/BackupController.cs @@ -31,6 +31,7 @@ using System.IO; using System.Data; using System.Text; using System.Collections.Generic; +using System.Threading; using System.Xml; using System.Security.Cryptography; using System.Security.Cryptography.Xml; @@ -116,10 +117,9 @@ namespace WebsitePanel.EnterpriseServer { try { - TaskManager.StartTask(taskId, "BACKUP", "BACKUP", backupFileName); - TaskManager.ItemId = SecurityContext.User.UserId; + TaskManager.StartTask(taskId, "BACKUP", "BACKUP", backupFileName, SecurityContext.User.UserId); - // get the list of items to backup + // get the list of items to backup TaskManager.Write("Calculate items to backup"); List items = GetBackupItems(userId, packageId, serviceId, serverId); @@ -210,7 +210,7 @@ namespace WebsitePanel.EnterpriseServer // increment progress TaskManager.IndicatorCurrent += 1; - } + } } } catch (Exception ex) @@ -343,7 +343,11 @@ namespace WebsitePanel.EnterpriseServer } } - TaskManager.IndicatorCurrent = TaskManager.IndicatorMaximum; + BackgroundTask topTask = TaskManager.TopTask; + + topTask.IndicatorCurrent = topTask.IndicatorMaximum; + + TaskController.UpdateTask(topTask); } catch (Exception ex) { @@ -490,8 +494,7 @@ namespace WebsitePanel.EnterpriseServer string backupFileName = (storePackageId > 0) ? Path.GetFileName(storePackageBackupPath) : Path.GetFileName(storeServerBackupPath); - TaskManager.StartTask(taskId, "BACKUP", "RESTORE", backupFileName); - TaskManager.ItemId = SecurityContext.User.UserId; + TaskManager.StartTask(taskId, "BACKUP", "RESTORE", backupFileName, SecurityContext.User.UserId); // create temp folder string tempFolder = GetTempBackupFolder(); @@ -804,8 +807,7 @@ namespace WebsitePanel.EnterpriseServer return true; } catch - { - // + { // return false; } } diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Provisioning/IBackupController.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Provisioning/IBackupController.cs similarity index 100% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Provisioning/IBackupController.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Provisioning/IBackupController.cs diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Provisioning/IImportController.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Provisioning/IImportController.cs similarity index 100% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Provisioning/IImportController.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Provisioning/IImportController.cs diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Provisioning/ImportAsyncWorker.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Provisioning/ImportAsyncWorker.cs similarity index 100% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Provisioning/ImportAsyncWorker.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Provisioning/ImportAsyncWorker.cs diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Provisioning/ImportController.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Provisioning/ImportController.cs similarity index 97% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Provisioning/ImportController.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Provisioning/ImportController.cs index fef786d4..aaa74100 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Provisioning/ImportController.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Provisioning/ImportController.cs @@ -171,8 +171,7 @@ namespace WebsitePanel.EnterpriseServer { PackageInfo package = PackageController.GetPackage(packageId); - TaskManager.StartTask(taskId, "IMPORT", "IMPORT", package.PackageName); - TaskManager.ItemId = packageId; + TaskManager.StartTask(taskId, "IMPORT", "IMPORT", package.PackageName, packageId); TaskManager.IndicatorMaximum = items.Length; TaskManager.IndicatorCurrent = 0; diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/SchedulerTasks/ActivatePaidInvoicesTask.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/SchedulerTasks/ActivatePaidInvoicesTask.cs similarity index 100% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/SchedulerTasks/ActivatePaidInvoicesTask.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/SchedulerTasks/ActivatePaidInvoicesTask.cs diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/SchedulerTasks/BackupDatabaseTask.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/SchedulerTasks/BackupDatabaseTask.cs similarity index 86% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/SchedulerTasks/BackupDatabaseTask.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/SchedulerTasks/BackupDatabaseTask.cs index fd545c4e..9a871c66 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/SchedulerTasks/BackupDatabaseTask.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/SchedulerTasks/BackupDatabaseTask.cs @@ -46,11 +46,13 @@ namespace WebsitePanel.EnterpriseServer // - BACKUP_NAME // - ZIP_BACKUP - string databaseGroup = (string)TaskManager.TaskParameters["DATABASE_GROUP"]; - string databaseName = (string)TaskManager.TaskParameters["DATABASE_NAME"]; - string backupFolder = (string)TaskManager.TaskParameters["BACKUP_FOLDER"]; - string backupName = (string)TaskManager.TaskParameters["BACKUP_NAME"]; - string strZipBackup = (string)TaskManager.TaskParameters["ZIP_BACKUP"]; + BackgroundTask topTask = TaskManager.TopTask; + + string databaseGroup = (string)topTask.GetParamValue("DATABASE_GROUP"); + string databaseName = (string)topTask.GetParamValue("DATABASE_NAME"); + string backupFolder = (string)topTask.GetParamValue("BACKUP_FOLDER"); + string backupName = (string)topTask.GetParamValue("BACKUP_NAME"); + string strZipBackup = (string)topTask.GetParamValue("ZIP_BACKUP"); // check input parameters if (String.IsNullOrEmpty(databaseName)) @@ -77,7 +79,7 @@ namespace WebsitePanel.EnterpriseServer } // try to find database - SqlDatabase item = (SqlDatabase)PackageController.GetPackageItemByName(TaskManager.PackageId, databaseGroup, + SqlDatabase item = (SqlDatabase)PackageController.GetPackageItemByName(topTask.PackageId, databaseGroup, databaseName, typeof(SqlDatabase)); if (item == null) diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/SchedulerTasks/BackupTask.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/SchedulerTasks/BackupTask.cs similarity index 81% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/SchedulerTasks/BackupTask.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/SchedulerTasks/BackupTask.cs index 8d04180d..92a30c81 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/SchedulerTasks/BackupTask.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/SchedulerTasks/BackupTask.cs @@ -29,6 +29,7 @@ using System; using System.Data; using System.Configuration; +using System.Threading; using System.Web; using System.Web.Security; using System.Web.UI; @@ -48,18 +49,22 @@ namespace WebsitePanel.EnterpriseServer /// public override void DoWork() { + string backupFileName; int storePackageId; string storePackageFolder; string storeServerFolder; bool deleteTempBackup; + + BackgroundTask topTask = TaskManager.TopTask; + try { - backupFileName = (string)TaskManager.TaskParameters["BACKUP_FILE_NAME"]; - storePackageId = Convert.ToInt32(TaskManager.TaskParameters["STORE_PACKAGE_ID"]); - storePackageFolder = (string)TaskManager.TaskParameters["STORE_PACKAGE_FOLDER"]; - storeServerFolder = (string)TaskManager.TaskParameters["STORE_SERVER_FOLDER"]; - deleteTempBackup = Convert.ToBoolean(TaskManager.TaskParameters["DELETE_TEMP_BACKUP"]); + backupFileName = (string)topTask.GetParamValue("BACKUP_FILE_NAME"); + storePackageId = Convert.ToInt32(topTask.GetParamValue("STORE_PACKAGE_ID")); + storePackageFolder = (string)topTask.GetParamValue("STORE_PACKAGE_FOLDER"); + storeServerFolder = (string)topTask.GetParamValue("STORE_SERVER_FOLDER"); + deleteTempBackup = Convert.ToBoolean(topTask.GetParamValue("DELETE_TEMP_BACKUP")); } catch(Exception ex) { @@ -69,7 +74,7 @@ namespace WebsitePanel.EnterpriseServer try { - PackageInfo package = PackageController.GetPackage(TaskManager.PackageId); + PackageInfo package = PackageController.GetPackage(topTask.PackageId); // We do not take into account service id as long as scheduled tasks run against packages. BackupController.Backup(false, "BackupTask", package.UserId, package.PackageId, 0, 0, backupFileName, storePackageId, storePackageFolder, storeServerFolder, deleteTempBackup); diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/SchedulerTasks/CalculateExchangeDiskspaceTask.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/SchedulerTasks/CalculateExchangeDiskspaceTask.cs similarity index 95% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/SchedulerTasks/CalculateExchangeDiskspaceTask.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/SchedulerTasks/CalculateExchangeDiskspaceTask.cs index 1a8909a9..b6e477cc 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/SchedulerTasks/CalculateExchangeDiskspaceTask.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/SchedulerTasks/CalculateExchangeDiskspaceTask.cs @@ -46,7 +46,7 @@ namespace WebsitePanel.EnterpriseServer public void CalculateDiskspace() { // get all space organizations recursively - List items = ExchangeServerController.GetExchangeOrganizations(TaskManager.PackageId, true); + List items = ExchangeServerController.GetExchangeOrganizations(TaskManager.TopTask.PackageId, true); foreach (Organization item in items) { diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/SchedulerTasks/CalculatePackagesBandwidthTask.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/SchedulerTasks/CalculatePackagesBandwidthTask.cs similarity index 97% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/SchedulerTasks/CalculatePackagesBandwidthTask.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/SchedulerTasks/CalculatePackagesBandwidthTask.cs index ccb91d16..995415f9 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/SchedulerTasks/CalculatePackagesBandwidthTask.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/SchedulerTasks/CalculatePackagesBandwidthTask.cs @@ -51,7 +51,7 @@ namespace WebsitePanel.EnterpriseServer public void CalculateBandwidth() { // get all owned packages - List packages = PackageController.GetPackagePackages(TaskManager.PackageId, true); + List packages = PackageController.GetPackagePackages(TaskManager.TopTask.PackageId, true); TaskManager.Write("Packages to calculate: " + packages.Count.ToString()); foreach (PackageInfo package in packages) diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/SchedulerTasks/CalculatePackagesDiskspaceTask.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/SchedulerTasks/CalculatePackagesDiskspaceTask.cs similarity index 97% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/SchedulerTasks/CalculatePackagesDiskspaceTask.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/SchedulerTasks/CalculatePackagesDiskspaceTask.cs index 7a744cf9..200648cc 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/SchedulerTasks/CalculatePackagesDiskspaceTask.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/SchedulerTasks/CalculatePackagesDiskspaceTask.cs @@ -52,7 +52,7 @@ namespace WebsitePanel.EnterpriseServer public void CalculateDiskspace() { // get all owned packages - List packages = PackageController.GetPackagePackages(TaskManager.PackageId, true); + List packages = PackageController.GetPackagePackages(TaskManager.TopTask.PackageId, true); TaskManager.Write("Packages to calculate: " + packages.Count.ToString()); foreach (PackageInfo package in packages) diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/SchedulerTasks/CancelOverdueInvoicesTask.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/SchedulerTasks/CancelOverdueInvoicesTask.cs similarity index 100% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/SchedulerTasks/CancelOverdueInvoicesTask.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/SchedulerTasks/CancelOverdueInvoicesTask.cs diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/SchedulerTasks/CheckWebSiteTask.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/SchedulerTasks/CheckWebSiteTask.cs similarity index 84% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/SchedulerTasks/CheckWebSiteTask.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/SchedulerTasks/CheckWebSiteTask.cs index c16812d9..574e3d26 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/SchedulerTasks/CheckWebSiteTask.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/SchedulerTasks/CheckWebSiteTask.cs @@ -57,17 +57,19 @@ namespace WebsitePanel.EnterpriseServer // - MAIL_SUBJECT // - MAIL_BODY - // get input parameters - string url = (string)TaskManager.TaskParameters["URL"]; - string username = (string)TaskManager.TaskParameters["USERNAME"]; - string password = (string)TaskManager.TaskParameters["PASSWORD"]; - string strResponseStatus = (string)TaskManager.TaskParameters["RESPONSE_STATUS"]; - string responseContains = (string)TaskManager.TaskParameters["RESPONSE_CONTAIN"]; - string responseNotContains = (string)TaskManager.TaskParameters["RESPONSE_DOESNT_CONTAIN"]; + BackgroundTask topTask = TaskManager.TopTask; - bool useResponseStatus = Convert.ToBoolean(TaskManager.TaskParameters["USE_RESPONSE_STATUS"]); - bool useResponseContains = Convert.ToBoolean(TaskManager.TaskParameters["USE_RESPONSE_CONTAIN"]); - bool useResponseDoesntContain = Convert.ToBoolean(TaskManager.TaskParameters["USE_RESPONSE_DOESNT_CONTAIN"]); + // get input parameters + string url = (string)topTask.GetParamValue("URL"); + string username = (string)topTask.GetParamValue("USERNAME"); + string password = (string)topTask.GetParamValue("PASSWORD"); + string strResponseStatus = (string)topTask.GetParamValue("RESPONSE_STATUS"); + string responseContains = (string)topTask.GetParamValue("RESPONSE_CONTAIN"); + string responseNotContains = (string)topTask.GetParamValue("RESPONSE_DOESNT_CONTAIN"); + + bool useResponseStatus = Convert.ToBoolean(topTask.GetParamValue("USE_RESPONSE_STATUS")); + bool useResponseContains = Convert.ToBoolean(topTask.GetParamValue("USE_RESPONSE_CONTAIN")); + bool useResponseDoesntContain = Convert.ToBoolean(topTask.GetParamValue("USE_RESPONSE_DOESNT_CONTAIN")); // check input parameters if (String.IsNullOrEmpty(url)) @@ -126,11 +128,13 @@ namespace WebsitePanel.EnterpriseServer private void SendMailMessage(string url, string message, string content) { + BackgroundTask topTask = TaskManager.TopTask; + // input parameters - string mailFrom = (string)TaskManager.TaskParameters["MAIL_FROM"]; - string mailTo = (string)TaskManager.TaskParameters["MAIL_TO"]; - string mailSubject = (string)TaskManager.TaskParameters["MAIL_SUBJECT"]; - string mailBody = (string)TaskManager.TaskParameters["MAIL_BODY"]; + string mailFrom = (string)topTask.GetParamValue("MAIL_FROM"); + string mailTo = (string)topTask.GetParamValue("MAIL_TO"); + string mailSubject = (string)topTask.GetParamValue("MAIL_SUBJECT"); + string mailBody = (string)topTask.GetParamValue("MAIL_BODY"); if (String.IsNullOrEmpty(mailTo)) { diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/SchedulerTasks/FTPFilesTask.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/SchedulerTasks/FTPFilesTask.cs similarity index 83% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/SchedulerTasks/FTPFilesTask.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/SchedulerTasks/FTPFilesTask.cs index b069aa07..1738f145 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/SchedulerTasks/FTPFilesTask.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/SchedulerTasks/FTPFilesTask.cs @@ -46,12 +46,14 @@ namespace WebsitePanel.EnterpriseServer // - FTP_PASSWORD // - FTP_FOLDER + BackgroundTask topTask = TaskManager.TopTask; + // get input parameters - string filePath = (string)TaskManager.TaskParameters["FILE_PATH"]; - string ftpServer = (string)TaskManager.TaskParameters["FTP_SERVER"]; - string ftpUsername = (string)TaskManager.TaskParameters["FTP_USERNAME"]; - string ftpPassword = (string)TaskManager.TaskParameters["FTP_PASSWORD"]; - string ftpFolder = (string)TaskManager.TaskParameters["FTP_FOLDER"]; + string filePath = (string)topTask.GetParamValue("FILE_PATH"); + string ftpServer = (string)topTask.GetParamValue("FTP_SERVER"); + string ftpUsername = (string)topTask.GetParamValue("FTP_USERNAME"); + string ftpPassword = (string)topTask.GetParamValue("FTP_PASSWORD"); + string ftpFolder = (string)topTask.GetParamValue("FTP_FOLDER"); // check input parameters if (String.IsNullOrEmpty(filePath)) @@ -100,7 +102,7 @@ namespace WebsitePanel.EnterpriseServer // file to send writer.WriteLine("binary"); - writer.WriteLine("put " + FilesController.GetFullPackagePath(TaskManager.PackageId, filePath)); + writer.WriteLine("put " + FilesController.GetFullPackagePath(topTask.PackageId, filePath)); // bye writer.WriteLine("bye"); @@ -109,14 +111,14 @@ namespace WebsitePanel.EnterpriseServer // create temp file in user space string cmdPath = Utils.GetRandomString(10) + ".txt"; - string fullCmdPath = FilesController.GetFullPackagePath(TaskManager.PackageId, cmdPath); + string fullCmdPath = FilesController.GetFullPackagePath(topTask.PackageId, cmdPath); // upload batch - FilesController.UpdateFileBinaryContent(TaskManager.PackageId, cmdPath, Encoding.UTF8.GetBytes(cmdBatch)); + FilesController.UpdateFileBinaryContent(topTask.PackageId, cmdPath, Encoding.UTF8.GetBytes(cmdBatch)); // execute system command // load OS service - int serviceId = PackageController.GetPackageServiceId(TaskManager.PackageId, ResourceGroups.Os); + int serviceId = PackageController.GetPackageServiceId(topTask.PackageId, ResourceGroups.Os); // load service ServiceInfo service = ServerController.GetServiceInfo(serviceId); @@ -128,7 +130,7 @@ namespace WebsitePanel.EnterpriseServer TaskManager.Write(winServer.ExecuteSystemCommand("ftp.exe", "-s:" + fullCmdPath)); // delete batch file - FilesController.DeleteFiles(TaskManager.PackageId, new string[] { cmdPath }); + FilesController.DeleteFiles(topTask.PackageId, new string[] { cmdPath }); } } } diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/SchedulerTasks/GenerateInvoicesTask.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/SchedulerTasks/GenerateInvoicesTask.cs similarity index 100% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/SchedulerTasks/GenerateInvoicesTask.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/SchedulerTasks/GenerateInvoicesTask.cs diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/SchedulerTasks/HostedSolutionReport.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/SchedulerTasks/HostedSolutionReport.cs similarity index 87% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/SchedulerTasks/HostedSolutionReport.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/SchedulerTasks/HostedSolutionReport.cs index b82436df..fedeb3e8 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/SchedulerTasks/HostedSolutionReport.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/SchedulerTasks/HostedSolutionReport.cs @@ -51,16 +51,18 @@ namespace WebsitePanel.EnterpriseServer { try { - bool isExchange = Utils.ParseBool(TaskManager.TaskParameters[EXCHANGE_REPORT], false); - bool isSharePoint = Utils.ParseBool(TaskManager.TaskParameters[SHAREPOINT_REPORT], false); - bool isLync = Utils.ParseBool(TaskManager.TaskParameters[LYNC_REPORT], false); - bool isCRM = Utils.ParseBool(TaskManager.TaskParameters[CRM_REPORT], false); - bool isOrganization = Utils.ParseBool(TaskManager.TaskParameters[ORGANIZATION_REPORT], false); + BackgroundTask topTask = TaskManager.TopTask; - string email = TaskManager.TaskParameters[EMAIL].ToString(); + bool isExchange = Utils.ParseBool(topTask.GetParamValue(EXCHANGE_REPORT), false); + bool isSharePoint = Utils.ParseBool(topTask.GetParamValue(SHAREPOINT_REPORT), false); + bool isLync = Utils.ParseBool(topTask.GetParamValue(LYNC_REPORT), false); + bool isCRM = Utils.ParseBool(topTask.GetParamValue(CRM_REPORT), false); + bool isOrganization = Utils.ParseBool(topTask.GetParamValue(ORGANIZATION_REPORT), false); + + string email = topTask.GetParamValue(EMAIL).ToString(); - UserInfo user = PackageController.GetPackageOwner(TaskManager.PackageId); + UserInfo user = PackageController.GetPackageOwner(topTask.PackageId); EnterpriseSolutionStatisticsReport report = ReportController.GetEnterpriseSolutionStatisticsReport(user.UserId, isExchange, isSharePoint, isCRM, isOrganization, isLync); diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/SchedulerTasks/NotifyOverusedDatabasesTask.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/SchedulerTasks/NotifyOverusedDatabasesTask.cs similarity index 86% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/SchedulerTasks/NotifyOverusedDatabasesTask.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/SchedulerTasks/NotifyOverusedDatabasesTask.cs index 5aae6dff..b38e5f38 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/SchedulerTasks/NotifyOverusedDatabasesTask.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/SchedulerTasks/NotifyOverusedDatabasesTask.cs @@ -44,25 +44,27 @@ namespace WebsitePanel.EnterpriseServer // - DISKSPACE_OVERUSED // - BANDWIDTH_OVERUSED + BackgroundTask topTask = TaskManager.TopTask; + // get the list of all packages - List packages = PackageController.GetPackagePackages(TaskManager.PackageId, false); + List packages = PackageController.GetPackagePackages(topTask.PackageId, false); TaskManager.Write("Packages to verify: " + packages.Count.ToString()); - bool checkMSSQL = (String.Compare((string)TaskManager.TaskParameters["MSSQL_OVERUSED"], "true", true) == 0); - bool checkMySQL = (String.Compare((string)TaskManager.TaskParameters["MYSQL_OVERUSED"], "true", true) == 0); + bool checkMSSQL = (String.Compare((string)topTask.GetParamValue("MSSQL_OVERUSED"), "true", true) == 0); + bool checkMySQL = (String.Compare((string)topTask.GetParamValue("MYSQL_OVERUSED"), "true", true) == 0); - bool sendWarningEmail = Convert.ToBoolean(TaskManager.TaskParameters["SEND_WARNING_EMAIL"]); - bool sendOverusedEmail = Convert.ToBoolean(TaskManager.TaskParameters["SEND_OVERUSED_EMAIL"]); - int warningUsageThreshold = Convert.ToInt32(TaskManager.TaskParameters["WARNING_USAGE_THRESHOLD"]); - int overusedUsageThreshold = Convert.ToInt32(TaskManager.TaskParameters["OVERUSED_USAGE_THRESHOLD"]); - string warningMailFrom = Convert.ToString(TaskManager.TaskParameters["WARNING_MAIL_FROM"]); - string warningMailBcc = Convert.ToString(TaskManager.TaskParameters["WARNING_MAIL_BCC"]); - string warningMailSubject = Convert.ToString(TaskManager.TaskParameters["WARNING_MAIL_SUBJECT"]); - string warningMailBody = Convert.ToString(TaskManager.TaskParameters["WARNING_MAIL_BODY"]); - string overusedMailFrom = Convert.ToString(TaskManager.TaskParameters["OVERUSED_MAIL_FROM"]); - string overusedMailBcc = Convert.ToString(TaskManager.TaskParameters["OVERUSED_MAIL_BCC"]); - string overusedMailSubject = Convert.ToString(TaskManager.TaskParameters["OVERUSED_MAIL_SUBJECT"]); - string overusedMailBody = Convert.ToString(TaskManager.TaskParameters["OVERUSED_MAIL_BODY"]); + bool sendWarningEmail = Convert.ToBoolean(topTask.GetParamValue("SEND_WARNING_EMAIL")); + bool sendOverusedEmail = Convert.ToBoolean(topTask.GetParamValue("SEND_OVERUSED_EMAIL")); + int warningUsageThreshold = Convert.ToInt32(topTask.GetParamValue("WARNING_USAGE_THRESHOLD")); + int overusedUsageThreshold = Convert.ToInt32(topTask.GetParamValue("OVERUSED_USAGE_THRESHOLD")); + string warningMailFrom = Convert.ToString(topTask.GetParamValue("WARNING_MAIL_FROM")); + string warningMailBcc = Convert.ToString(topTask.GetParamValue("WARNING_MAIL_BCC")); + string warningMailSubject = Convert.ToString(topTask.GetParamValue("WARNING_MAIL_SUBJECT")); + string warningMailBody = Convert.ToString(topTask.GetParamValue("WARNING_MAIL_BODY")); + string overusedMailFrom = Convert.ToString(topTask.GetParamValue("OVERUSED_MAIL_FROM")); + string overusedMailBcc = Convert.ToString(topTask.GetParamValue("OVERUSED_MAIL_BCC")); + string overusedMailSubject = Convert.ToString(topTask.GetParamValue("OVERUSED_MAIL_SUBJECT")); + string overusedMailBody = Convert.ToString(topTask.GetParamValue("OVERUSED_MAIL_BODY")); int overusedPackages = 0; diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/SchedulerTasks/RunPaymentQueueTask.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/SchedulerTasks/RunPaymentQueueTask.cs similarity index 100% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/SchedulerTasks/RunPaymentQueueTask.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/SchedulerTasks/RunPaymentQueueTask.cs diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/SchedulerTasks/RunSystemCommandTask.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/SchedulerTasks/RunSystemCommandTask.cs similarity index 88% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/SchedulerTasks/RunSystemCommandTask.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/SchedulerTasks/RunSystemCommandTask.cs index 3dba9938..e05bf145 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/SchedulerTasks/RunSystemCommandTask.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/SchedulerTasks/RunSystemCommandTask.cs @@ -42,10 +42,12 @@ namespace WebsitePanel.EnterpriseServer // - SERVER_NAME // - EXECUTABLE_PATH + BackgroundTask topTask = TaskManager.TopTask; + // get input parameters - string serverName = (string)TaskManager.TaskParameters["SERVER_NAME"]; - string execPath = (string)TaskManager.TaskParameters["EXECUTABLE_PATH"]; - string execParams = (string)TaskManager.TaskParameters["EXECUTABLE_PARAMS"]; + string serverName = (string)topTask.GetParamValue("SERVER_NAME"); + string execPath = (string)topTask.GetParamValue("EXECUTABLE_PATH"); + string execParams = (string)topTask.GetParamValue("EXECUTABLE_PARAMS"); if (execParams == null) execParams = ""; diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/SchedulerTasks/SendMailNotificationTask.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/SchedulerTasks/SendMailNotificationTask.cs similarity index 86% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/SchedulerTasks/SendMailNotificationTask.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/SchedulerTasks/SendMailNotificationTask.cs index 57e722ea..b7a0308f 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/SchedulerTasks/SendMailNotificationTask.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/SchedulerTasks/SendMailNotificationTask.cs @@ -42,11 +42,13 @@ namespace WebsitePanel.EnterpriseServer // - MAIL_SUBJECT // - MAIL_BODY + BackgroundTask topTask = TaskManager.TopTask; + // get input parameters - string mailFrom = (string)TaskManager.TaskParameters["MAIL_FROM"]; - string mailTo = (string)TaskManager.TaskParameters["MAIL_TO"]; - string mailSubject = (string)TaskManager.TaskParameters["MAIL_SUBJECT"]; - string mailBody = (string)TaskManager.TaskParameters["MAIL_BODY"]; + string mailFrom = (string)topTask.GetParamValue("MAIL_FROM"); + string mailTo = (string)topTask.GetParamValue("MAIL_TO"); + string mailSubject = (string)topTask.GetParamValue("MAIL_SUBJECT"); + string mailBody = (string)topTask.GetParamValue("MAIL_BODY"); // check input parameters if (String.IsNullOrEmpty(mailFrom)) diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/SchedulerTasks/SuspendOverdueInvoicesTask.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/SchedulerTasks/SuspendOverdueInvoicesTask.cs similarity index 100% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/SchedulerTasks/SuspendOverdueInvoicesTask.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/SchedulerTasks/SuspendOverdueInvoicesTask.cs diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/SchedulerTasks/SuspendOverusedPackagesTask.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/SchedulerTasks/SuspendOverusedPackagesTask.cs similarity index 83% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/SchedulerTasks/SuspendOverusedPackagesTask.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/SchedulerTasks/SuspendOverusedPackagesTask.cs index 5fa58ce9..e7201be1 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/SchedulerTasks/SuspendOverusedPackagesTask.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/SchedulerTasks/SuspendOverusedPackagesTask.cs @@ -43,27 +43,29 @@ namespace WebsitePanel.EnterpriseServer // - DISKSPACE_OVERUSED // - BANDWIDTH_OVERUSED + BackgroundTask topTask = TaskManager.TopTask; + // get the list of all packages - List packages = PackageController.GetPackagePackages(TaskManager.PackageId, false); + List packages = PackageController.GetPackagePackages(topTask.PackageId, false); TaskManager.Write("Packages to verify: " + packages.Count.ToString()); - bool checkDiskspace = (String.Compare((string)TaskManager.TaskParameters["DISKSPACE_OVERUSED"], "true", true) == 0); - bool checkBandwidth = (String.Compare((string)TaskManager.TaskParameters["BANDWIDTH_OVERUSED"], "true", true) == 0); + bool checkDiskspace = (String.Compare((string)topTask.GetParamValue("DISKSPACE_OVERUSED"), "true", true) == 0); + bool checkBandwidth = (String.Compare((string)topTask.GetParamValue("BANDWIDTH_OVERUSED"), "true", true) == 0); - bool suspendOverused = Convert.ToBoolean(TaskManager.TaskParameters["SUSPEND_OVERUSED"]); + bool suspendOverused = Convert.ToBoolean(topTask.GetParamValue("SUSPEND_OVERUSED")); - bool sendWarningEmail = Convert.ToBoolean(TaskManager.TaskParameters["SEND_WARNING_EMAIL"]); - bool sendSuspensionEmail = Convert.ToBoolean(TaskManager.TaskParameters["SEND_SUSPENSION_EMAIL"]); - int warningUsageThreshold = Convert.ToInt32(TaskManager.TaskParameters["WARNING_USAGE_THRESHOLD"]); - int suspensionUsageThreshold = Convert.ToInt32(TaskManager.TaskParameters["SUSPENSION_USAGE_THRESHOLD"]); - string warningMailFrom = Convert.ToString(TaskManager.TaskParameters["WARNING_MAIL_FROM"]); - string warningMailBcc = Convert.ToString(TaskManager.TaskParameters["WARNING_MAIL_BCC"]); - string warningMailSubject = Convert.ToString(TaskManager.TaskParameters["WARNING_MAIL_SUBJECT"]); - string warningMailBody = Convert.ToString(TaskManager.TaskParameters["WARNING_MAIL_BODY"]); - string suspensionMailFrom = Convert.ToString(TaskManager.TaskParameters["SUSPENSION_MAIL_FROM"]); - string suspensionMailBcc = Convert.ToString(TaskManager.TaskParameters["SUSPENSION_MAIL_BCC"]); - string suspensionMailSubject = Convert.ToString(TaskManager.TaskParameters["SUSPENSION_MAIL_SUBJECT"]); - string suspensionMailBody = Convert.ToString(TaskManager.TaskParameters["SUSPENSION_MAIL_BODY"]); + bool sendWarningEmail = Convert.ToBoolean(topTask.GetParamValue("SEND_WARNING_EMAIL")); + bool sendSuspensionEmail = Convert.ToBoolean(topTask.GetParamValue("SEND_SUSPENSION_EMAIL")); + int warningUsageThreshold = Convert.ToInt32(topTask.GetParamValue("WARNING_USAGE_THRESHOLD")); + int suspensionUsageThreshold = Convert.ToInt32(topTask.GetParamValue("SUSPENSION_USAGE_THRESHOLD")); + string warningMailFrom = Convert.ToString(topTask.GetParamValue("WARNING_MAIL_FROM")); + string warningMailBcc = Convert.ToString(topTask.GetParamValue("WARNING_MAIL_BCC")); + string warningMailSubject = Convert.ToString(topTask.GetParamValue("WARNING_MAIL_SUBJECT")); + string warningMailBody = Convert.ToString(topTask.GetParamValue("WARNING_MAIL_BODY")); + string suspensionMailFrom = Convert.ToString(topTask.GetParamValue("SUSPENSION_MAIL_FROM")); + string suspensionMailBcc = Convert.ToString(topTask.GetParamValue("SUSPENSION_MAIL_BCC")); + string suspensionMailSubject = Convert.ToString(topTask.GetParamValue("SUSPENSION_MAIL_SUBJECT")); + string suspensionMailBody = Convert.ToString(topTask.GetParamValue("SUSPENSION_MAIL_BODY")); int suspendedPackages = 0; diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/SchedulerTasks/ZipFilesTask.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/SchedulerTasks/ZipFilesTask.cs similarity index 88% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/SchedulerTasks/ZipFilesTask.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/SchedulerTasks/ZipFilesTask.cs index 5f93c1ac..20247fee 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/SchedulerTasks/ZipFilesTask.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/SchedulerTasks/ZipFilesTask.cs @@ -40,9 +40,11 @@ namespace WebsitePanel.EnterpriseServer // - FOLDER // - ZIP_FILE + BackgroundTask topTask = TaskManager.TopTask; + // get input parameters - string filesList = (string)TaskManager.TaskParameters["FOLDER"]; - string zipFile = (string)TaskManager.TaskParameters["ZIP_FILE"]; + string filesList = (string)topTask.GetParamValue("FOLDER"); + string zipFile = (string)topTask.GetParamValue("ZIP_FILE"); // check input parameters if (String.IsNullOrEmpty(filesList)) @@ -68,7 +70,7 @@ namespace WebsitePanel.EnterpriseServer zipFile = Utils.ReplaceStringVariable(zipFile, "time", time); // zip files and folders - FilesController.ZipFiles(TaskManager.PackageId, new string[] { filesList }, zipFile); + FilesController.ZipFiles(topTask.PackageId, new string[] { filesList }, zipFile); } } } diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Scheduling/Scheduler.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Scheduling/Scheduler.cs similarity index 71% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Scheduling/Scheduler.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Scheduling/Scheduler.cs index 268391b7..34b9ffbf 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Scheduling/Scheduler.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Scheduling/Scheduler.cs @@ -28,6 +28,7 @@ using System; using System.IO; +using System.ServiceProcess; using System.Threading; using System.Collections; using System.Diagnostics; @@ -43,77 +44,91 @@ namespace WebsitePanel.EnterpriseServer { public static SchedulerJob nextSchedule = null; - // main timer and put it to sleep - static Timer scheduleTimer = new Timer(new TimerCallback(RunNextSchedule), - null, - Timeout.Infinite, - Timeout.Infinite); - public static void Start() - { - // schedule tasks + { ScheduleTasks(); } public static bool IsScheduleActive(int scheduleId) { Dictionary scheduledTasks = TaskManager.GetScheduledTasks(); + return scheduledTasks.ContainsKey(scheduleId); } - public static void StartSchedule(SchedulerJob schedule) - { - Dictionary scheduledTasks = TaskManager.GetScheduledTasks(); - if (scheduledTasks.ContainsKey(schedule.ScheduleInfo.ScheduleId)) - return; - - // run schedule - RunSchedule(schedule, false); - } - - public static void StopSchedule(SchedulerJob schedule) - { - Dictionary scheduledTasks = TaskManager.GetScheduledTasks(); - if (!scheduledTasks.ContainsKey(schedule.ScheduleInfo.ScheduleId)) - return; - - BackgroundTask activeTask = scheduledTasks[schedule.ScheduleInfo.ScheduleId]; - TaskManager.StopTask(activeTask.TaskId); - } - public static void ScheduleTasks() { + RunManualTasks(); + nextSchedule = SchedulerController.GetNextSchedule(); - // set timer if (nextSchedule != null) { if (nextSchedule.ScheduleInfo.NextRun <= DateTime.Now) { - // this will put the timer to sleep - scheduleTimer.Change(Timeout.Infinite, Timeout.Infinite); - - System.Threading.Thread.Sleep(1000); - - // run immediately RunNextSchedule(null); } - else - { - // set timer - TimeSpan ts = nextSchedule.ScheduleInfo.NextRun.Subtract(DateTime.Now); - if (ts < TimeSpan.Zero) - ts = TimeSpan.Zero; // cannot be negative ! + } + } - // invoke after the timespan - scheduleTimer.Change((long)ts.TotalMilliseconds, Timeout.Infinite); + private static void RunManualTasks() + { + var tasks = TaskController.GetProcessTasks(BackgroundTaskStatus.Stopping); + + foreach (var task in tasks) + { + TaskManager.StopTask(task.TaskId); + } + + tasks = TaskController.GetProcessTasks(BackgroundTaskStatus.Starting); + + foreach (var task in tasks) + { + var taskThread = new Thread(() => RunBackgroundTask(task)) { Priority = ThreadPriority.Highest }; + taskThread.Start(); + TaskManager.AddTaskThread(task.Id, taskThread); + } + } + + private static void RunBackgroundTask(BackgroundTask backgroundTask) + { + UserInfo user = PackageController.GetPackageOwner(backgroundTask.PackageId); + + SecurityContext.SetThreadPrincipal(user.UserId); + + var schedule = SchedulerController.GetScheduleComplete(backgroundTask.ScheduleId); + + backgroundTask.Guid = TaskManager.Guid; + backgroundTask.Status = BackgroundTaskStatus.Run; + + + TaskController.UpdateTask(backgroundTask); + + try + { + var objTask = (SchedulerTask)Activator.CreateInstance(Type.GetType(schedule.Task.TaskType)); + + objTask.DoWork(); + } + catch (Exception ex) + { + TaskManager.WriteError(ex, "Error executing scheduled task"); + } + finally + { + try + { + TaskManager.CompleteTask(); + } + catch (Exception) + { } } } // call back for the timer function static void RunNextSchedule(object obj) // obj ignored - { + { if (nextSchedule == null) return; @@ -125,8 +140,6 @@ namespace WebsitePanel.EnterpriseServer static void RunSchedule(SchedulerJob schedule, bool changeNextRun) { - - try { // update next run (if required) @@ -162,6 +175,8 @@ namespace WebsitePanel.EnterpriseServer counter++; } + if (counter == MAX_RETRY_COUNT) + return; // skip execution if the current task is still running scheduledTasks = TaskManager.GetScheduledTasks(); diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Scheduling/SchedulerController.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Scheduling/SchedulerController.cs similarity index 84% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Scheduling/SchedulerController.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Scheduling/SchedulerController.cs index 0fc85004..be434a2e 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Scheduling/SchedulerController.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Scheduling/SchedulerController.cs @@ -31,6 +31,7 @@ using System.Data; using System.Collections.Generic; using System.Text; using System.Xml; +using System.Linq; using WebsitePanel.EnterpriseServer.Base.Scheduling; namespace WebsitePanel.EnterpriseServer @@ -151,30 +152,74 @@ namespace WebsitePanel.EnterpriseServer { // check account int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo); - if (accountCheck < 0) return accountCheck; + + if (accountCheck < 0) + return accountCheck; SchedulerJob schedule = GetScheduleComplete(scheduleId); if (schedule == null) return 0; - Scheduler.StartSchedule(schedule); + if (TaskController.GetScheduleTasks(scheduleId).Any(x => x.Status == BackgroundTaskStatus.Run + || x.Status == BackgroundTaskStatus.Starting)) + return 0; + + var parameters = schedule.ScheduleInfo.Parameters.Select( + prm => new BackgroundTaskParameter(prm.ParameterId, prm.ParameterValue)).ToList(); + + var userInfo = PackageController.GetPackageOwner(schedule.ScheduleInfo.PackageId); + + var backgroundTask = new BackgroundTask( + Guid.NewGuid(), + Guid.NewGuid().ToString("N"), + userInfo.OwnerId == 0 ? userInfo.UserId : userInfo.OwnerId, + userInfo.UserId, + "SCHEDULER", + "RUN_SCHEDULE", + schedule.ScheduleInfo.ScheduleName, + schedule.ScheduleInfo.ScheduleId, + schedule.ScheduleInfo.ScheduleId, + schedule.ScheduleInfo.PackageId, + schedule.ScheduleInfo.MaxExecutionTime, parameters) + { + Status = BackgroundTaskStatus.Starting + }; + + TaskController.AddTask(backgroundTask); + + // update next run (if required) + CalculateNextStartTime(schedule.ScheduleInfo); + + // disable run once task + if (schedule.ScheduleInfo.ScheduleType == ScheduleType.OneTime) + schedule.ScheduleInfo.Enabled = false; + + schedule.ScheduleInfo.LastRun = DateTime.Now; + UpdateSchedule(schedule.ScheduleInfo); return 0; - } + } public static int StopSchedule(int scheduleId) { - // check account int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo); - if (accountCheck < 0) return accountCheck; + if (accountCheck < 0) + return accountCheck; + SchedulerJob schedule = GetScheduleComplete(scheduleId); if (schedule == null) return 0; - Scheduler.StopSchedule(schedule); - + foreach (BackgroundTask task in TaskController.GetScheduleTasks(scheduleId)) + { + task.Status = BackgroundTaskStatus.Stopping; + + TaskController.UpdateTask(task); + } + return 0; + } public static void CalculateNextStartTime(ScheduleInfo schedule) @@ -275,7 +320,7 @@ namespace WebsitePanel.EnterpriseServer schedule.HistoriesNumber, schedule.MaxExecutionTime, schedule.WeekMonthDay, xmlParameters); // re-schedule tasks - Scheduler.ScheduleTasks(); + //Scheduler.ScheduleTasks(); return scheduleId; } @@ -301,7 +346,7 @@ namespace WebsitePanel.EnterpriseServer schedule.HistoriesNumber, schedule.MaxExecutionTime, schedule.WeekMonthDay, xmlParameters); // re-schedule tasks - Scheduler.ScheduleTasks(); + //Scheduler.ScheduleTasks(); return 0; } @@ -336,7 +381,7 @@ namespace WebsitePanel.EnterpriseServer DataProvider.DeleteSchedule(SecurityContext.User.UserId, scheduleId); // re-schedule tasks - Scheduler.ScheduleTasks(); + //Scheduler.ScheduleTasks(); return 0; } diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Scheduling/SchedulerJob.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Scheduling/SchedulerJob.cs similarity index 87% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Scheduling/SchedulerJob.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Scheduling/SchedulerJob.cs index c29be3fd..7b9d2efd 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Scheduling/SchedulerJob.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Scheduling/SchedulerJob.cs @@ -66,7 +66,6 @@ namespace WebsitePanel.EnterpriseServer { // create worker Thread worker = new Thread(new ThreadStart(RunSchedule)); - // set worker priority switch (scheduleInfo.Priority) { @@ -89,15 +88,15 @@ namespace WebsitePanel.EnterpriseServer UserInfo user = PackageController.GetPackageOwner(scheduleInfo.PackageId); SecurityContext.SetThreadPrincipal(user.UserId); - TaskManager.StartTask("SCHEDULER", "RUN_SCHEDULE", scheduleInfo.ScheduleName); - TaskManager.PackageId = scheduleInfo.PackageId; - TaskManager.ItemId = scheduleInfo.ScheduleId; - TaskManager.ScheduleId = scheduleInfo.ScheduleId; - TaskManager.MaximumExecutionTime = scheduleInfo.MaxExecutionTime; - - // set task parameters + List parameters = new List(); foreach (ScheduleTaskParameterInfo prm in scheduleInfo.Parameters) - TaskManager.TaskParameters[prm.ParameterId] = prm.ParameterValue; + { + parameters.Add(new BackgroundTaskParameter(prm.ParameterId, prm.ParameterValue)); + } + + TaskManager.StartTask("SCHEDULER", "RUN_SCHEDULE", scheduleInfo.ScheduleName, scheduleInfo.ScheduleId, + scheduleInfo.ScheduleId, scheduleInfo.PackageId, scheduleInfo.MaxExecutionTime, + parameters); // run task try @@ -109,7 +108,8 @@ namespace WebsitePanel.EnterpriseServer objTask.DoWork(); else throw new Exception(String.Format("Could not create scheduled task of '{0}' type", - task.TaskType)); + task.TaskType)); + // Thread.Sleep(40000); } catch (Exception ex) { diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Servers/ServerController.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Servers/ServerController.cs similarity index 95% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Servers/ServerController.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Servers/ServerController.cs index b1cd15f0..61e838a6 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Servers/ServerController.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Servers/ServerController.cs @@ -265,6 +265,7 @@ namespace WebsitePanel.EnterpriseServer } TaskManager.ItemId = serverId; + TaskManager.CompleteTask(); return serverId; @@ -277,12 +278,10 @@ namespace WebsitePanel.EnterpriseServer | DemandAccount.IsAdmin); if (accountCheck < 0) return accountCheck; - TaskManager.StartTask("SERVER", "UPDATE"); - TaskManager.ItemId = server.ServerId; - // get original server ServerInfo origServer = GetServerByIdInternal(server.ServerId); - TaskManager.ItemName = origServer.ServerName; + + TaskManager.StartTask("SERVER", "UPDATE", origServer.ServerName, server.ServerId); // preserve passwords server.Password = origServer.Password; @@ -313,12 +312,10 @@ namespace WebsitePanel.EnterpriseServer | DemandAccount.IsAdmin); if (accountCheck < 0) return accountCheck; - TaskManager.StartTask("SERVER", "UPDATE_PASSWORD"); - TaskManager.ItemId = serverId; - // get original server ServerInfo server = GetServerByIdInternal(serverId); - TaskManager.ItemName = server.ServerName; + + TaskManager.StartTask("SERVER", "UPDATE_PASSWORD", server.ServerName, serverId); // set password server.Password = password; @@ -341,12 +338,10 @@ namespace WebsitePanel.EnterpriseServer | DemandAccount.IsAdmin); if (accountCheck < 0) return accountCheck; - TaskManager.StartTask("SERVER", "UPDATE_AD_PASSWORD"); - TaskManager.ItemId = serverId; - // get original server ServerInfo server = GetServerByIdInternal(serverId); - TaskManager.ItemName = server.ServerName; + + TaskManager.StartTask("SERVER", "UPDATE_AD_PASSWORD", server.ServerName, serverId); // set password server.ADPassword = adPassword; @@ -369,12 +364,10 @@ namespace WebsitePanel.EnterpriseServer | DemandAccount.IsAdmin); if (accountCheck < 0) return accountCheck; - TaskManager.StartTask("SERVER", "DELETE"); - TaskManager.ItemId = serverId; - // get original server ServerInfo server = GetServerByIdInternal(serverId); - TaskManager.ItemName = server.ServerName; + + TaskManager.StartTask("SERVER", "DELETE", server.ServerName, serverId); try { @@ -427,10 +420,9 @@ namespace WebsitePanel.EnterpriseServer | DemandAccount.IsActive); if (accountCheck < 0) return accountCheck; - TaskManager.StartTask("VIRTUAL_SERVER", "ADD_SERVICES"); ServerInfo server = GetServerByIdInternal(serverId); - TaskManager.ItemId = serverId; - TaskManager.ItemName = server.ServerName; + + TaskManager.StartTask("VIRTUAL_SERVER", "ADD_SERVICES", server.ServerName, serverId); // build XML string xml = BuildXmlFromArray(ids, "services", "service"); @@ -450,10 +442,9 @@ namespace WebsitePanel.EnterpriseServer | DemandAccount.IsActive); if (accountCheck < 0) return accountCheck; - TaskManager.StartTask("VIRTUAL_SERVER", "DELETE_SERVICES"); ServerInfo server = GetServerByIdInternal(serverId); - TaskManager.ItemId = serverId; - TaskManager.ItemName = server.ServerName; + + TaskManager.StartTask("VIRTUAL_SERVER", "DELETE_SERVICES", server.ServerName, serverId); // build XML string xml = BuildXmlFromArray(ids, "services", "service"); @@ -585,9 +576,8 @@ namespace WebsitePanel.EnterpriseServer | DemandAccount.IsActive); if (accountCheck < 0) return accountCheck; - TaskManager.StartTask("SERVER", "ADD_SERVICE"); - TaskManager.ItemId = service.ServerId; - TaskManager.ItemName = GetServerByIdInternal(service.ServerId).ServerName; + TaskManager.StartTask("SERVER", "ADD_SERVICE", GetServerByIdInternal(service.ServerId).ServerName, service.ServerId); + TaskManager.WriteParameter("Service name", service.ServiceName); TaskManager.WriteParameter("Provider", service.ProviderId); @@ -641,9 +631,8 @@ namespace WebsitePanel.EnterpriseServer // load original service ServiceInfo origService = GetServiceInfo(service.ServiceId); - TaskManager.StartTask("SERVER", "UPDATE_SERVICE"); - TaskManager.ItemId = origService.ServerId; - TaskManager.ItemName = GetServerByIdInternal(origService.ServerId).ServerName; + TaskManager.StartTask("SERVER", "UPDATE_SERVICE", GetServerByIdInternal(origService.ServerId).ServerName, origService.ServerId); + TaskManager.WriteParameter("New service name", service.ServiceName); DataProvider.UpdateService(service.ServiceId, service.ServiceName, @@ -663,9 +652,8 @@ namespace WebsitePanel.EnterpriseServer ServiceInfo service = GetServiceInfoAdmin(serviceId); - TaskManager.StartTask("SERVER", "DELETE_SERVICE"); - TaskManager.ItemId = service.ServerId; - TaskManager.ItemName = GetServerByIdInternal(service.ServerId).ServerName; + TaskManager.StartTask("SERVER", "DELETE_SERVICE", GetServerByIdInternal(service.ServerId).ServerName, service.ServerId); + TaskManager.WriteParameter("Service name", service.ServiceName); try @@ -926,8 +914,8 @@ namespace WebsitePanel.EnterpriseServer #endregion // start task - res = TaskManager.StartResultTask("IP_ADDRESS", "ADD"); - TaskManager.ItemName = externalIP; + res = TaskManager.StartResultTask("IP_ADDRESS", "ADD", externalIP); + TaskManager.WriteParameter("IP Address", externalIP); TaskManager.WriteParameter("NAT Address", internalIP); @@ -961,8 +949,8 @@ namespace WebsitePanel.EnterpriseServer #endregion // start task - res = TaskManager.StartResultTask("IP_ADDRESS", "ADD_RANGE"); - TaskManager.ItemName = externalIP; + res = TaskManager.StartResultTask("IP_ADDRESS", "ADD_RANGE", externalIP); + TaskManager.WriteParameter("IP Address", externalIP); TaskManager.WriteParameter("End IP Address", endIP); TaskManager.WriteParameter("NAT Address", internalIP); @@ -1251,8 +1239,7 @@ namespace WebsitePanel.EnterpriseServer if (addressesNumber > maxAvailableIPs) addressesNumber = maxAvailableIPs; - res = TaskManager.StartResultTask("IP_ADDRESS", "ALLOCATE_PACKAGE_IP"); - TaskManager.PackageId = packageId; + res = TaskManager.StartResultTask("IP_ADDRESS", "ALLOCATE_PACKAGE_IP", packageId); try { @@ -1337,8 +1324,8 @@ namespace WebsitePanel.EnterpriseServer return res; #endregion - res = TaskManager.StartResultTask("IP_ADDRESS", "DEALLOCATE_PACKAGE_IP"); - TaskManager.PackageId = packageId; + res = TaskManager.StartResultTask("IP_ADDRESS", "DEALLOCATE_PACKAGE_IP", packageId); + try { foreach (int id in addressId) @@ -1876,11 +1863,7 @@ namespace WebsitePanel.EnterpriseServer */ // place log record - TaskManager.StartTask("DOMAIN", "ADD", domainName); - TaskManager.PackageId = packageId; - TaskManager.TaskParameters["CreateZone"] = createDnsZone; - - + TaskManager.StartTask("DOMAIN", "ADD", domainName, 0, packageId, new BackgroundTaskParameter("CreateZone", createDnsZone)); // create DNS zone int zoneItemId = 0; @@ -1911,6 +1894,7 @@ namespace WebsitePanel.EnterpriseServer packageId, zoneItemId, domainName, allowSubDomains, 0, 0, isSubDomain, isInstantAlias, isDomainPointer); TaskManager.ItemId = itemId; + TaskManager.CompleteTask(); return itemId; @@ -2041,8 +2025,7 @@ namespace WebsitePanel.EnterpriseServer // place log record DomainInfo origDomain = GetDomain(domain.DomainId); - TaskManager.StartTask("DOMAIN", "UPDATE", origDomain.DomainName); - TaskManager.ItemId = domain.DomainId; + TaskManager.StartTask("DOMAIN", "UPDATE", origDomain.DomainName, domain.DomainId); try { @@ -2074,8 +2057,7 @@ namespace WebsitePanel.EnterpriseServer return 0; // place log record - TaskManager.StartTask("DOMAIN", "DETACH", domain.DomainName); - TaskManager.ItemId = domain.DomainId; + TaskManager.StartTask("DOMAIN", "DETACH", domain.DomainName, domain.DomainId); try { @@ -2143,8 +2125,7 @@ namespace WebsitePanel.EnterpriseServer return 0; // place log record - TaskManager.StartTask("DOMAIN", "DELETE", domain.DomainName); - TaskManager.ItemId = domain.DomainId; + TaskManager.StartTask("DOMAIN", "DELETE", domain.DomainName, domain.DomainId); try { @@ -2223,8 +2204,7 @@ namespace WebsitePanel.EnterpriseServer return 0; // place log record - TaskManager.StartTask("DOMAIN", "DISABLE_DNS", domain.DomainName); - TaskManager.ItemId = domain.DomainId; + TaskManager.StartTask("DOMAIN", "DISABLE_DNS", domain.DomainName, domain.DomainId); try { @@ -2270,8 +2250,7 @@ namespace WebsitePanel.EnterpriseServer return 0; // place log record - TaskManager.StartTask("DOMAIN", "ENABLE_DNS", domain.DomainName); - TaskManager.ItemId = domain.DomainId; + TaskManager.StartTask("DOMAIN", "ENABLE_DNS", domain.DomainName, domain.DomainId); try { @@ -2475,8 +2454,7 @@ namespace WebsitePanel.EnterpriseServer return BusinessErrorCodes.ERROR_INSTANT_ALIAS_IS_NOT_CONFIGURED; // place log record - TaskManager.StartTask("DOMAIN", "CREATE_INSTANT_ALIAS", domain.DomainName); - TaskManager.ItemId = domain.DomainId; + TaskManager.StartTask("DOMAIN", "CREATE_INSTANT_ALIAS", domain.DomainName, domain.DomainId); try { @@ -2560,8 +2538,7 @@ namespace WebsitePanel.EnterpriseServer return 0; // place log record - TaskManager.StartTask("DOMAIN", "DELETE_INSTANT_ALIAS", domain.DomainName); - TaskManager.ItemId = domain.DomainId; + TaskManager.StartTask("DOMAIN", "DELETE_INSTANT_ALIAS", domain.DomainName, domain.DomainId); try { @@ -2695,8 +2672,7 @@ namespace WebsitePanel.EnterpriseServer return 0; // place log record - TaskManager.StartTask("DNS_ZONE", "ADD_RECORD", domain.DomainName); - TaskManager.ItemId = domain.ZoneItemId; + TaskManager.StartTask("DNS_ZONE", "ADD_RECORD", domain.DomainName, domain.ZoneItemId); try { @@ -2736,8 +2712,7 @@ namespace WebsitePanel.EnterpriseServer { // place log record DomainInfo domain = GetDomain(domainId); - TaskManager.StartTask("DNS_ZONE", "UPDATE_RECORD", domain.DomainName); - TaskManager.ItemId = domain.ZoneItemId; + TaskManager.StartTask("DNS_ZONE", "UPDATE_RECORD", domain.DomainName, domain.ZoneItemId); try { @@ -2783,8 +2758,7 @@ namespace WebsitePanel.EnterpriseServer try { // place log record - TaskManager.StartTask("DNS_ZONE", "DELETE_RECORD", domain.DomainName); - TaskManager.ItemId = domain.ZoneItemId; + TaskManager.StartTask("DNS_ZONE", "DELETE_RECORD", domain.DomainName, domain.ZoneItemId); DNSServer dns = new DNSServer(); ServiceProviderProxy.Init(dns, zoneItem.ServiceId); diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/SharePoint/HostedSharePointServerController.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/SharePoint/HostedSharePointServerController.cs similarity index 97% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/SharePoint/HostedSharePointServerController.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/SharePoint/HostedSharePointServerController.cs index eebff84b..886936a1 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/SharePoint/HostedSharePointServerController.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/SharePoint/HostedSharePointServerController.cs @@ -341,6 +341,7 @@ namespace WebsitePanel.EnterpriseServer.Code.SharePoint } TaskManager.ItemId = itemId; + return itemId; } catch (Exception ex) @@ -380,8 +381,7 @@ namespace WebsitePanel.EnterpriseServer.Code.SharePoint string siteName = origItem.Name.Replace(String.Format("{0}://", rootWebApplicationUri.Scheme), String.Empty); // Log operation. - TaskManager.StartTask("HOSTEDSHAREPOINT", "DELETE_SITE", origItem.Name); - TaskManager.ItemId = itemId; + TaskManager.StartTask("HOSTEDSHAREPOINT", "DELETE_SITE", origItem.Name, itemId); try { @@ -459,8 +459,7 @@ namespace WebsitePanel.EnterpriseServer.Code.SharePoint } // Log operation. - TaskManager.StartTask("HOSTEDSHAREPOINT", "BACKUP_SITE_COLLECTION", origItem.Name); - TaskManager.ItemId = itemId; + TaskManager.StartTask("HOSTEDSHAREPOINT", "BACKUP_SITE_COLLECTION", origItem.Name, itemId); try { @@ -550,8 +549,7 @@ namespace WebsitePanel.EnterpriseServer.Code.SharePoint } // Log operation. - TaskManager.StartTask("HOSTEDSHAREPOINT", "BACKUP_SITE_COLLECTION", origItem.Name); - TaskManager.ItemId = itemId; + TaskManager.StartTask("HOSTEDSHAREPOINT", "BACKUP_SITE_COLLECTION", origItem.Name, itemId); try { @@ -850,8 +848,7 @@ namespace WebsitePanel.EnterpriseServer.Code.SharePoint if (accountCheck < 0) return accountCheck; // place log record - TaskManager.StartTask("HOSTED_SHAREPOINT", "SET_ORG_LIMITS"); - TaskManager.ItemId = itemId; + TaskManager.StartTask("HOSTED_SHAREPOINT", "SET_ORG_LIMITS", itemId); try { @@ -923,8 +920,8 @@ namespace WebsitePanel.EnterpriseServer.Code.SharePoint } // place log record - TaskManager.StartTask("HOSTED_SHAREPOINT", "CALCULATE_DISK_SPACE"); - TaskManager.ItemId = itemId; + TaskManager.StartTask("HOSTED_SHAREPOINT", "CALCULATE_DISK_SPACE", itemId); + try { Organization org = (Organization)PackageController.GetPackageItem(itemId); diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/SharePoint/SharePointServerController.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/SharePoint/SharePointServerController.cs similarity index 96% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/SharePoint/SharePointServerController.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/SharePoint/SharePointServerController.cs index 63382be7..f516bfa6 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/SharePoint/SharePointServerController.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/SharePoint/SharePointServerController.cs @@ -268,8 +268,7 @@ namespace WebsitePanel.EnterpriseServer return BusinessErrorCodes.ERROR_SHAREPOINT_PACKAGE_ITEM_NOT_FOUND; // place log record - TaskManager.StartTask("SHAREPOINT", "DELETE_SITE", origItem.Name); - TaskManager.ItemId = itemId; + TaskManager.StartTask("SHAREPOINT", "DELETE_SITE", origItem.Name, itemId); try { @@ -340,8 +339,7 @@ namespace WebsitePanel.EnterpriseServer return null; // place log record - TaskManager.StartTask("SHAREPOINT", "BACKUP_SITE", item.Name); - TaskManager.ItemId = itemId; + TaskManager.StartTask("SHAREPOINT", "BACKUP_SITE", item.Name, itemId); try { @@ -432,8 +430,7 @@ namespace WebsitePanel.EnterpriseServer if (packageCheck < 0) return packageCheck; // place log record - TaskManager.StartTask("SHAREPOINT", "RESTORE_SITE", item.Name); - TaskManager.ItemId = itemId; + TaskManager.StartTask("SHAREPOINT", "RESTORE_SITE", item.Name, itemId); try { @@ -520,8 +517,8 @@ namespace WebsitePanel.EnterpriseServer if (packageCheck < 0) return packageCheck; // place log record - TaskManager.StartTask("SHAREPOINT", "INSTALL_WEBPARTS", item.Name); - TaskManager.ItemId = itemId; + TaskManager.StartTask("SHAREPOINT", "INSTALL_WEBPARTS", item.Name, itemId); + TaskManager.WriteParameter("Package file", packageFile); try @@ -592,8 +589,8 @@ namespace WebsitePanel.EnterpriseServer if (packageCheck < 0) return packageCheck; // place log record - TaskManager.StartTask("SHAREPOINT", "UNINSTALL_WEBPARTS", item.Name); - TaskManager.ItemId = itemId; + TaskManager.StartTask("SHAREPOINT", "UNINSTALL_WEBPARTS", item.Name, itemId); + TaskManager.WriteParameter("Package name", packageName); try @@ -736,8 +733,7 @@ namespace WebsitePanel.EnterpriseServer if (packageCheck < 0) return packageCheck; // place log record - TaskManager.StartTask("SHAREPOINT", "UPDATE_USER", origItem.Name); - TaskManager.ItemId = item.Id; + TaskManager.StartTask("SHAREPOINT", "UPDATE_USER", origItem.Name, item.Id); try { @@ -785,8 +781,7 @@ namespace WebsitePanel.EnterpriseServer return BusinessErrorCodes.ERROR_SHAREPOINT_USERS_PACKAGE_ITEM_NOT_FOUND; // place log record - TaskManager.StartTask("SHAREPOINT", "DELETE_USER", origItem.Name); - TaskManager.ItemId = itemId; + TaskManager.StartTask("SHAREPOINT", "DELETE_USER", origItem.Name, itemId); try { @@ -925,8 +920,7 @@ namespace WebsitePanel.EnterpriseServer if (packageCheck < 0) return packageCheck; // place log record - TaskManager.StartTask("SHAREPOINT", "UPDATE_GROUP", origItem.Name); - TaskManager.ItemId = item.Id; + TaskManager.StartTask("SHAREPOINT", "UPDATE_GROUP", origItem.Name, item.Id); try { @@ -962,8 +956,7 @@ namespace WebsitePanel.EnterpriseServer return BusinessErrorCodes.ERROR_SHAREPOINT_GROUPS_PACKAGE_ITEM_NOT_FOUND; // place log record - TaskManager.StartTask("SHAREPOINT", "DELETE_GROUP", origItem.Name); - TaskManager.ItemId = itemId; + TaskManager.StartTask("SHAREPOINT", "DELETE_GROUP", origItem.Name, itemId); try { diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/StatisticsServers/StatisticsServerController.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/StatisticsServers/StatisticsServerController.cs similarity index 96% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/StatisticsServers/StatisticsServerController.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/StatisticsServers/StatisticsServerController.cs index 1f060c99..29b33e14 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/StatisticsServers/StatisticsServerController.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/StatisticsServers/StatisticsServerController.cs @@ -226,8 +226,7 @@ namespace WebsitePanel.EnterpriseServer item.SiteId = origItem.SiteId; // place log record - TaskManager.StartTask("STATS_SITE", "UPDATE", origItem.Name); - TaskManager.ItemId = origItem.Id; + TaskManager.StartTask("STATS_SITE", "UPDATE", origItem.Name, origItem.Id); try { @@ -263,8 +262,7 @@ namespace WebsitePanel.EnterpriseServer return BusinessErrorCodes.ERROR_STATS_PACKAGE_ITEM_NOT_FOUND; // place log record - TaskManager.StartTask("STATS_SITE", "DELETE", origItem.Name); - TaskManager.ItemId = origItem.Id; + TaskManager.StartTask("STATS_SITE", "DELETE", origItem.Name, itemId); try { diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/System/SystemController.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/System/SystemController.cs similarity index 94% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/System/SystemController.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/System/SystemController.cs index 322e30d6..3f010eec 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/System/SystemController.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/System/SystemController.cs @@ -119,7 +119,7 @@ namespace WebsitePanel.EnterpriseServer return 0; } - internal static bool GetSystemSetupMode() + public static bool GetSystemSetupMode() { var scpaSystemSettings = GetSystemSettings(SystemSettings.SETUP_SETTINGS); // Flag either not found or empty @@ -131,7 +131,7 @@ namespace WebsitePanel.EnterpriseServer return true; } - internal static int SetupControlPanelAccounts(string passwordA, string passwordB, string ip) + public static int SetupControlPanelAccounts(string passwordA, string passwordB, string ip) { try { diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Tasks/SendEmailNotification.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Tasks/SendEmailNotification.cs similarity index 76% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Tasks/SendEmailNotification.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Tasks/SendEmailNotification.cs index 67d246b2..e36eacb6 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Tasks/SendEmailNotification.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Tasks/SendEmailNotification.cs @@ -40,23 +40,25 @@ namespace WebsitePanel.EnterpriseServer.Tasks public override void OnComplete() { - if (!TaskManager.HasErrors) + BackgroundTask topTask = TaskManager.TopTask; + + if (!TaskManager.HasErrors(topTask)) { // Send user add notification - if (TaskManager.TaskSource == "USER" && - TaskManager.TaskName == "ADD" && TaskManager.ItemId > 0) + if (topTask.Source == "USER" && + topTask.TaskName == "ADD" && topTask.ItemId > 0) { SendAddUserNotification(); } // Send hosting package add notification - if (TaskManager.TaskSource == "HOSTING_SPACE" - && TaskManager.TaskName == "ADD" && TaskManager.ItemId > 0) + if (topTask.Source == "HOSTING_SPACE" + && topTask.TaskName == "ADD" && topTask.ItemId > 0) { SendAddPackageNotification(); } // Send hosting package add notification - if (TaskManager.TaskSource == "HOSTING_SPACE_WR" - && TaskManager.TaskName == "ADD" && TaskManager.ItemId > 0) + if (topTask.Source == "HOSTING_SPACE_WR" + && topTask.TaskName == "ADD" && topTask.ItemId > 0) { SendAddPackageWithResourcesNotification(); } @@ -76,10 +78,13 @@ namespace WebsitePanel.EnterpriseServer.Tasks { try { - bool sendLetter = (bool)TaskManager.TaskParameters["SendLetter"]; + BackgroundTask topTask = TaskManager.TopTask; + + bool sendLetter = Utils.ParseBool(topTask.GetParamValue("SendLetter"), false); + if (sendLetter) { - int sendResult = PackageController.SendPackageSummaryLetter(TaskManager.ItemId, null, null, true); + int sendResult = PackageController.SendPackageSummaryLetter(topTask.ItemId, null, null, true); CheckSmtpResult(sendResult); } } @@ -93,9 +98,12 @@ namespace WebsitePanel.EnterpriseServer.Tasks { try { - int userId = (int)TaskManager.TaskParameters["UserId"]; - bool sendLetter = (bool)TaskManager.TaskParameters["SendLetter"]; - bool signup = (bool)TaskManager.TaskParameters["Signup"]; + BackgroundTask topTask = TaskManager.TopTask; + + int userId = Utils.ParseInt(topTask.GetParamValue("UserId").ToString(), 0); + bool sendLetter = Utils.ParseBool(topTask.GetParamValue("SendLetter"), false); + bool signup = Utils.ParseBool(topTask.GetParamValue("Signup"), false); + // send space letter if enabled UserSettings settings = UserController.GetUserSettings(userId, UserSettings.PACKAGE_SUMMARY_LETTER); if (sendLetter @@ -103,7 +111,7 @@ namespace WebsitePanel.EnterpriseServer.Tasks && Utils.ParseBool(settings["EnableLetter"], false)) { // send letter - int smtpResult = PackageController.SendPackageSummaryLetter(TaskManager.ItemId, null, null, signup); + int smtpResult = PackageController.SendPackageSummaryLetter(topTask.ItemId, null, null, signup); CheckSmtpResult(smtpResult); } } @@ -117,8 +125,11 @@ namespace WebsitePanel.EnterpriseServer.Tasks { try { - bool sendLetter = (bool)TaskManager.TaskParameters["SendLetter"]; - int userId = TaskManager.ItemId; + BackgroundTask topTask = TaskManager.TopTask; + + bool sendLetter = Utils.ParseBool(topTask.GetParamValue("SendLetter"), false); + + int userId = topTask.ItemId; // send account letter if enabled UserSettings settings = UserController.GetUserSettings(userId, UserSettings.ACCOUNT_SUMMARY_LETTER); if (sendLetter diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Tasks/TaskController.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Tasks/TaskController.cs new file mode 100644 index 00000000..b6207b84 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Tasks/TaskController.cs @@ -0,0 +1,243 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Xml; +using System.Xml.Serialization; +namespace WebsitePanel.EnterpriseServer +{ + public class TaskController + { + public static BackgroundTask GetTask(string taskId) + { + BackgroundTask task = ObjectUtils.FillObjectFromDataReader( + DataProvider.GetBackgroundTask(taskId)); + + if (task == null) + { + return null; + } + + task.Params = GetTaskParams(task.Id); + + return task; + } + + public static List GetScheduleTasks(int scheduleId) + { + return ObjectUtils.CreateListFromDataReader( + DataProvider.GetScheduleBackgroundTasks(scheduleId)); + } + + public static List GetTasks() + { + var user = SecurityContext.User; + + return GetTasks(user.IsPeer ? user.OwnerId : user.UserId); + } + + public static List GetTasks(int actorId) + { + return ObjectUtils.CreateListFromDataReader( + DataProvider.GetBackgroundTasks(actorId)); + } + + public static List GetTasks(Guid guid) + { + return ObjectUtils.CreateListFromDataReader( + DataProvider.GetBackgroundTasks(guid)); + } + + public static List GetProcessTasks(BackgroundTaskStatus status) + { + return ObjectUtils.CreateListFromDataReader( + DataProvider.GetProcessBackgroundTasks(status)); + } + + public static BackgroundTask GetTopTask(Guid guid) + { + BackgroundTask task = ObjectUtils.FillObjectFromDataReader( + DataProvider.GetBackgroundTopTask(guid)); + + if (task == null) + { + return null; + } + + task.Params = GetTaskParams(task.Id); + + return task; + } + + public static int AddTask(BackgroundTask task) + { + int taskId = DataProvider.AddBackgroundTask(task.Guid, task.TaskId, task.ScheduleId, task.PackageId, task.UserId, + task.EffectiveUserId, task.TaskName, task.ItemId, task.ItemName, + task.StartDate, task.IndicatorCurrent, task.IndicatorMaximum, + task.MaximumExecutionTime, task.Source, task.Severity, task.Completed, + task.NotifyOnComplete, task.Status); + + AddTaskParams(taskId, task.Params); + + DataProvider.AddBackgroundTaskStack(taskId); + + return taskId; + } + + public static void UpdateTaskWithParams(BackgroundTask task) + { + if (UpdateTask(task)) + { + UpdateBackgroundTaskParams(task); + } + } + + public static bool UpdateTask(BackgroundTask task) + { + if (task.Status == BackgroundTaskStatus.Abort) + { + DeleteBackgroundTasks(task.Guid); + + return false; + } + + if (task.Completed) + { + DeleteBackgroundTask(task.Id); + + return false; + } + + DataProvider.UpdateBackgroundTask(task.Guid, task.Id, task.ScheduleId, task.PackageId, task.TaskName, task.ItemId, + task.ItemName, task.FinishDate, task.IndicatorCurrent, + task.IndicatorMaximum, task.MaximumExecutionTime, task.Source, + task.Severity, task.Completed, task.NotifyOnComplete, task.Status); + + return true; + } + + public static void UpdateBackgroundTaskParams(BackgroundTask task) + { + DataProvider.DeleteBackgroundTaskParams(task.Id); + + AddTaskParams(task.Id, task.Params); + } + + public static void DeleteBackgroundTasks(Guid guid) + { + DataProvider.DeleteBackgroundTasks(guid); + } + + public static void DeleteBackgroundTask(int id) + { + DataProvider.DeleteBackgroundTask(id); + } + + public static void AddTaskParams(int taskId, List parameters) + { + foreach (BackgroundTaskParameter param in SerializeParams(parameters)) + { + DataProvider.AddBackgroundTaskParam(taskId, param.Name, param.SerializerValue, param.TypeName); + } + } + + public static List GetTaskParams(int taskId) + { + List parameters = ObjectUtils.CreateListFromDataReader( + DataProvider.GetBackgroundTaskParams(taskId)); + + return DeserializeParams(parameters); + } + + public static void AddLog(BackgroundTaskLogRecord log) + { + DataProvider.AddBackgroundTaskLog(log.TaskId, log.Date, log.ExceptionStackTrace, log.InnerTaskStart, + log.Severity, log.Text, log.TextIdent, BuildParametersXml(log.TextParameters)); + } + + public static List GetLogs(BackgroundTask task, DateTime startLogTime) + { + if (startLogTime <= task.StartDate) + { + startLogTime = task.StartDate; + } + + List logs = ObjectUtils.CreateListFromDataReader( + DataProvider.GetBackgroundTaskLogs(task.Id, startLogTime)); + + foreach (BackgroundTaskLogRecord log in logs) + { + log.TextParameters = ReBuildParametersXml(log.XmlParameters); + } + + return logs; + } + + private static List SerializeParams(List parameters) + { + foreach (BackgroundTaskParameter param in parameters) + { + var type = param.Value.GetType(); + param.TypeName = type.FullName; + + XmlSerializer serializer = new XmlSerializer(type); + MemoryStream ms = new MemoryStream(); + serializer.Serialize(ms, param.Value); + + ms.Position = 0; + StreamReader sr = new StreamReader(ms); + + param.SerializerValue = sr.ReadToEnd(); + } + + return parameters; + } + + private static List DeserializeParams(List parameters) + { + foreach (BackgroundTaskParameter param in parameters) + { + XmlSerializer deserializer = new XmlSerializer(Type.GetType(param.TypeName)); + StringReader sr = new StringReader(param.SerializerValue); + + param.Value = deserializer.Deserialize(sr); + } + + return parameters; + } + + private static string BuildParametersXml(string[] parameters) + { + XmlDocument xmlDoc = new XmlDocument(); + XmlElement nodeProps = xmlDoc.CreateElement("parameters"); + + if (parameters != null) + { + foreach (string parameter in parameters) + { + XmlElement nodeProp = xmlDoc.CreateElement("parameter"); + nodeProp.SetAttribute("value", parameter); + nodeProps.AppendChild(nodeProp); + } + } + return nodeProps.OuterXml; + } + + private static string[] ReBuildParametersXml(string parameters) + { + var textParameters = new List(); + + var xmlDoc = new XmlDocument(); + xmlDoc.LoadXml(parameters); + + if (xmlDoc != null) + { + textParameters.AddRange(from XmlNode xmlParameter in xmlDoc.SelectNodes("parameters/parameter") select xmlParameter.Attributes.GetNamedItem("value").Value); + } + + return textParameters.ToArray(); + } + } +} + diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Tasks/TaskEventHandler.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Tasks/TaskEventHandler.cs similarity index 100% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Tasks/TaskEventHandler.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Tasks/TaskEventHandler.cs diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Tasks/TaskManager.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Tasks/TaskManager.cs new file mode 100644 index 00000000..0e8ebe0b --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Tasks/TaskManager.cs @@ -0,0 +1,857 @@ +// Copyright (c) 2012, Outercurve Foundation. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +using System; +using System.Collections.Concurrent; +using System.IO; +using System.Threading; +using System.Collections; +using System.Collections.Generic; +using System.Text; +using System.Web; +using System.Web.Caching; +using System.Xml; +using System.Reflection; +using WebsitePanel.Providers.Common; +using System.Diagnostics; +using System.Linq; + +namespace WebsitePanel.EnterpriseServer +{ + public class TaskManager + { + private static Hashtable eventHandlers = null; + //using id instead of guid + private static ConcurrentDictionary _taskThreadsDictionary = new ConcurrentDictionary(); + + // purge timer, used for killing old tasks from the hash + static Timer purgeTimer = new Timer(new TimerCallback(PurgeCompletedTasks), + null, + 60000, // start from 1 minute + 60000); // invoke each minute + + public static Guid Guid + { + get + { + Guid? guid = (Guid?)Thread.GetData(Thread.GetNamedDataSlot("BackgroundTaskGuid")); + if (!guid.HasValue) + { + guid = Guid.NewGuid(); + Thread.SetData(Thread.GetNamedDataSlot("BackgroundTaskGuid"), guid.Value); + } + + return guid.Value; + } + } + + public static void StartTask(string source, string taskName) + { + StartTask(source, taskName, 0); + } + + public static void StartTask(string source, string taskName, int itemId) + { + StartTask(source, taskName, 0, new List()); + } + + public static void StartTask(string source, string taskName, int itemId, BackgroundTaskParameter parameter) + { + StartTask(source, taskName, null, itemId, parameter); + } + + public static void StartTask(string source, string taskName, int itemId, List parameters) + { + StartTask(source, taskName, null, itemId, parameters); + } + + public static void StartTask(string source, string taskName, object itemName) + { + StartTask(source, taskName, itemName, 0); + } + + public static void StartTask(string source, string taskName, object itemName, int itemId) + { + StartTask(source, taskName, itemName, itemId, new List()); + } + + public static void StartTask(string source, string taskName, object itemName, BackgroundTaskParameter parameter) + { + StartTask(source, taskName, itemName, 0, parameter); + } + + public static void StartTask(string source, string taskName, object itemName, List parameters) + { + StartTask(source, taskName, itemName, 0, parameters); + } + + public static void StartTask(string source, string taskName, object itemName, int itemId, BackgroundTaskParameter parameter) + { + StartTask(source, taskName, itemName, itemId, 0, parameter); + } + + public static void StartTask(string source, string taskName, object itemName, int itemId, List parameters) + { + StartTask(source, taskName, itemName, itemId, 0, 0, -1, parameters); + } + + public static void StartTask(string source, string taskName, object itemName, int itemId, int packageId, BackgroundTaskParameter parameter) + { + List parameters = new List(); + if (parameter != null) + { + parameters.Add(parameter); + } + + StartTask(source, taskName, itemName, itemId, 0, packageId, -1, parameters); + } + + public static void StartTask(string taskId, string source, string taskName, object itemName, int itemId) + { + StartTask(taskId, source, taskName, itemName, itemId, 0, 0, -1, new List()); + } + + public static void StartTask(string taskId, string source, string taskName, object itemName, int itemId, int packageId) + { + StartTask(taskId, source, taskName, itemName, itemId, 0, packageId, -1, new List()); + } + + public static void StartTask(string source, string taskName, object itemName, int itemId, + int scheduleId, int packageId, int maximumExecutionTime, List parameters) + { + StartTask(null, source, taskName, itemName, itemId, scheduleId, packageId, maximumExecutionTime, parameters); + } + + public static void StartTask(string taskId, string source, string taskName, object itemName, int itemId, + int scheduleId, int packageId, int maximumExecutionTime, List parameters) + { + if (String.IsNullOrEmpty(taskId)) + { + taskId = Guid.NewGuid().ToString("N"); + } + + var user = SecurityContext.User; + + int userId = user.OwnerId == 0 + ? user.UserId + : user.OwnerId; + + int effectiveUserId = user.UserId; + + String itemNameStr = itemName != null + ? itemName.ToString() + : String.Empty; + BackgroundTask task = new BackgroundTask(Guid, taskId, userId, effectiveUserId, source, taskName, itemNameStr, + itemId, scheduleId, packageId, maximumExecutionTime, parameters); + + + List tasks = TaskController.GetTasks(Guid); + + if (tasks.Count > 0) + { + BackgroundTask rootTask = tasks[0]; + + BackgroundTaskLogRecord log = new BackgroundTaskLogRecord( + rootTask.Id, + tasks.Count - 1, + true, + String.Format("{0}_{1}", source, taskName), + new string[] { itemNameStr }); + + + TaskController.AddLog(log); + } + + // call event handler + CallTaskEventHandler(task, false); + + AddTaskThread(TaskController.AddTask(task), Thread.CurrentThread); + } + + public static void WriteParameter(string parameterName, object parameterValue) + { + string val = parameterValue != null ? parameterValue.ToString() : ""; + WriteLogRecord(Guid, 0, parameterName + ": " + val, null, null); + } + + public static void Write(string text, params string[] textParameters) + { + // INFO + WriteLogRecord(Guid, 0, text, null, textParameters); + } + + public static void WriteWarning(string text, params string[] textParameters) + { + WriteWarning(Guid, text, textParameters); + } + + public static void WriteWarning(Guid guid, string text, params string[] textParameters) + { + // WARNING + WriteLogRecord(guid, 1, text, null, textParameters); + } + + public static Exception WriteError(Exception ex) + { + // ERROR + WriteLogRecord(Guid, 2, ex.Message, ex.StackTrace); + + return new Exception((TopTask != null) + ? String.Format("Error executing '{0}' task on '{1}' {2}", + TopTask.TaskName, TopTask.ItemName, TopTask.Source) + : String.Format("Error executing task"), ex); + } + + public static void WriteError(Exception ex, string text, params string[] textParameters) + { + // ERROR + string[] prms = new string[] { ex.Message }; + if (textParameters != null && textParameters.Length > 0) + { + prms = new string[textParameters.Length + 1]; + Array.Copy(textParameters, 0, prms, 1, textParameters.Length); + prms[0] = ex.Message; + } + + WriteLogRecord(Guid, 2, text, ex.Message + "\n" + ex.StackTrace, prms); + } + + public static void WriteError(string text, params string[] textParameters) + { + // ERROR + WriteLogRecord(Guid, 2, text, null, textParameters); + } + + private static void WriteLogRecord(Guid guid, int severity, string text, string stackTrace, params string[] textParameters) + { + List tasks = TaskController.GetTasks(guid); + + if (tasks.Count > 0) + { + BackgroundTask rootTask = tasks[0]; + + BackgroundTaskLogRecord log = new BackgroundTaskLogRecord( + rootTask.Id, + tasks.Count - 1, + false, + text, + stackTrace, + textParameters); + + TaskController.AddLog(log); + + if (severity > rootTask.Severity) + { + rootTask.Severity = severity; + + TaskController.UpdateTask(rootTask); + } + } + } + + public static void CompleteTask() + { + List tasks = TaskController.GetTasks(Guid); + + if (tasks.Count == 0) + return; + + BackgroundTask topTask = tasks[tasks.Count - 1]; + + // call event handler + CallTaskEventHandler(topTask, true); + + // finish task + topTask.FinishDate = DateTime.Now; + topTask.Completed = true; + + // write task execution result to database + if (tasks.Count == 1) // single task + { + // write to database + AddAuditLog(topTask); + } + + TaskController.UpdateTask(topTask); + StopProcess(topTask); + } + + public static void UpdateParam(String name, Object value) + { + BackgroundTask topTask = TopTask; + + if (topTask == null) + return; + + topTask.UpdateParamValue(name, value); + + TaskController.UpdateTaskWithParams(topTask); + } + + public static int ItemId + { + set + { + BackgroundTask topTask = TopTask; + + if (topTask == null) + return; + + topTask.ItemId = value; + + TaskController.UpdateTask(topTask); + } + } + + public static String ItemName + { + set + { + BackgroundTask topTask = TopTask; + + if (topTask == null) + return; + + topTask.ItemName = value; + + TaskController.UpdateTask(topTask); + } + } + + public static void UpdateParams(Hashtable parameters) + { + BackgroundTask topTask = TopTask; + + if (topTask == null) + return; + + foreach (string key in parameters.Keys) + { + topTask.UpdateParamValue(key, parameters[key]); + } + + TaskController.UpdateTaskWithParams(topTask); + } + + static string FormatExecutionLog(BackgroundTask task) + { + StringWriter sw = new StringWriter(); + XmlWriter writer = new XmlTextWriter(sw); + + writer.WriteStartElement("log"); + + // parameters + writer.WriteStartElement("parameters"); + foreach (BackgroundTaskParameter param in task.Params) + { + writer.WriteStartElement("parameter"); + writer.WriteAttributeString("name", param.Name); + writer.WriteString(param.Value.ToString()); + + writer.WriteEndElement(); + } + writer.WriteEndElement(); // parameters + + // records + writer.WriteStartElement("records"); + foreach (BackgroundTaskLogRecord record in task.Logs) + { + writer.WriteStartElement("record"); + writer.WriteAttributeString("severity", record.Severity.ToString()); + writer.WriteAttributeString("date", record.Date.ToString(System.Globalization.CultureInfo.InvariantCulture)); + writer.WriteAttributeString("ident", record.TextIdent.ToString()); + + // text + writer.WriteElementString("text", record.Text); + + // text parameters + if (record.TextParameters != null && record.TextParameters.Length > 0) + { + writer.WriteStartElement("textParameters"); + foreach (string prm in record.TextParameters) + { + writer.WriteElementString("value", prm); + } + writer.WriteEndElement(); // textParameters + } + + // stack trace + writer.WriteElementString("stackTrace", record.ExceptionStackTrace); + writer.WriteEndElement(); + } + writer.WriteEndElement(); + writer.WriteEndElement(); + + return sw.ToString(); + } + + static void PurgeCompletedTasks(object obj) + { + List tasks = TaskController.GetTasks(Guid); + + foreach (BackgroundTask task in tasks) + { + if (task.MaximumExecutionTime != -1 + && ((TimeSpan)(DateTime.Now - task.StartDate)).TotalSeconds > task.MaximumExecutionTime) + { + task.Status = BackgroundTaskStatus.Stopping; + + TaskController.UpdateTask(task); + } + } + } + + public static int IndicatorMaximum + { + set + { + BackgroundTask topTask = TopTask; + + if (topTask == null) + { + return; + } + + topTask.IndicatorMaximum = value; + + TaskController.UpdateTask(topTask); + } + } + + public static int IndicatorCurrent + { + get + { + return TopTask.IndicatorCurrent; + } + set + { + BackgroundTask topTask = TopTask; + + if (topTask == null) + { + return; + } + + topTask.IndicatorCurrent = value; + + TaskController.UpdateTask(topTask); + } + } + + public static int MaximumExecutionTime + { + get + { + return TopTask.MaximumExecutionTime; + } + set + { + BackgroundTask topTask = TopTask; + + if (topTask == null) + { + return; + } + + topTask.MaximumExecutionTime = value; + + TaskController.UpdateTask(topTask); + } + } + + public static bool HasErrors(BackgroundTask task) + { + return task.Severity == 2; + } + + public static BackgroundTask TopTask + { + get { return TaskController.GetTopTask(Guid); } + } + + public static BackgroundTask GetTask(string taskId) + { + BackgroundTask task = TaskController.GetTask(taskId); + + if (task == null) + return null; + + return task; + } + + public static BackgroundTask GetTaskWithLogRecords(string taskId, DateTime startLogTime) + { + BackgroundTask task = GetTask(taskId); + + if (task == null) + return null; + + task.Logs = TaskController.GetLogs(task, startLogTime); + + return task; + } + + public static Dictionary GetScheduledTasks() + { + Dictionary scheduledTasks = new Dictionary(); + try + { + foreach (BackgroundTask task in TaskController.GetTasks()) + { + if (task.ScheduleId > 0 + && !task.Completed + && (task.Status == BackgroundTaskStatus.Run || task.Status == BackgroundTaskStatus.Starting) + && !scheduledTasks.ContainsKey(task.ScheduleId)) + scheduledTasks.Add(task.ScheduleId, task); + } + } + catch { } + + return scheduledTasks; + } + + public static void SetTaskNotifyOnComplete(string taskId) + { + BackgroundTask task = GetTask(taskId); + + if (task == null) + return; + + task.NotifyOnComplete = true; + } + + internal static void AddTaskThread(int taskId, Thread taskThread) + { + if (_taskThreadsDictionary.ContainsKey(taskId)) + _taskThreadsDictionary[taskId] = taskThread; + else + _taskThreadsDictionary.AddOrUpdate(taskId, taskThread, (key, oldValue) => taskThread); + } + + public static void StopTask(string taskId) + { + BackgroundTask task = GetTask(taskId); + + if (task == null) + { + return; + } + + task.Status = BackgroundTaskStatus.Abort; + + StopProcess(task); + + if (!HasErrors(task)) + { + task.Severity = 1; + } + + task.FinishDate = DateTime.Now; + + WriteWarning(task.Guid, "Task aborted by user"); + + AddAuditLog(task); + + TaskController.UpdateTask(task); + } + + private static void StopProcess(BackgroundTask task) + { + if (_taskThreadsDictionary.ContainsKey(task.Id)) + { + if (_taskThreadsDictionary[task.Id] != null) + if (_taskThreadsDictionary[task.Id].IsAlive) + { + if (!task.Completed) + _taskThreadsDictionary[task.Id].Abort(); + _taskThreadsDictionary[task.Id] = null; + } + Thread deleted; + _taskThreadsDictionary.TryRemove(task.Id, out deleted); + } + } + + private static void AddAuditLog(BackgroundTask task) + { + task.Logs = TaskController.GetLogs(task, task.StartDate); + + string executionLog = FormatExecutionLog(task); + + UserInfo user = UserController.GetUserInternally(task.EffectiveUserId); + string username = user != null ? user.Username : null; + + AuditLog.AddAuditLogRecord(task.TaskId, task.Severity, task.EffectiveUserId, + username, task.PackageId, task.ItemId, + task.ItemName, task.StartDate, task.FinishDate, task.Source, + task.TaskName, executionLog); + } + + public static List GetUserTasks(int userId) + { + List list = new List(); + + // try to get user first + UserInfo user = UserController.GetUser(userId); + if (user == null) + return list; // prohibited user + + // get user tasks + foreach (BackgroundTask task in TaskController.GetTasks(user.IsPeer ? user.OwnerId : user.UserId)) + { + if (task.UserId == userId && !task.Completed + && task.Status == BackgroundTaskStatus.Run) + { + list.Add(task); + } + } + return list; + } + + public static List GetUserCompletedTasks(int userId) + { + return new List(); + } + + public static int GetTasksNumber() + { + return TaskController.GetTasks().Count; + } + + #region Private Helpers + + private static void CallTaskEventHandler(BackgroundTask task, bool onComplete) + { + string[] taskHandlers = GetTaskEventHandlers(task.Source, task.TaskName); + if (taskHandlers != null) + { + foreach (string taskHandler in taskHandlers) + { + try + { + Type handlerType = Type.GetType(taskHandler); + TaskEventHandler handler = (TaskEventHandler)Activator.CreateInstance(handlerType); + + if (handler != null) + { + if (onComplete) + handler.OnComplete(); + else + handler.OnStart(); + } + } + catch (Exception ex) + { + WriteError(ex, "Error executing task event handler: {0}", ex.Message); + } + } + } + } + + private static string[] GetTaskEventHandlers(string source, string taskName) + { + // load configuration + string appRoot = AppDomain.CurrentDomain.BaseDirectory; + string path = Path.Combine(appRoot, "TaskEventHandlers.config"); + + if (eventHandlers == null) + { + eventHandlers = Hashtable.Synchronized(new Hashtable()); + + // load from XML + if (File.Exists(path)) + { + List xmlConfigs = new List(); + xmlConfigs.Add(new XmlDocument()); + xmlConfigs[0].Load(path); + // Lookup for external references first + XmlNodeList xmlReferences = xmlConfigs[0].SelectNodes("//reference"); + foreach (XmlElement xmlReference in xmlReferences) + { + string referencePath = Path.Combine(appRoot, xmlReference.GetAttribute("src")); + if (File.Exists(referencePath)) + { + XmlDocument xmldoc = new XmlDocument(); + xmldoc.Load(referencePath); + xmlConfigs.Add(xmldoc); + } + } + + // parse XML + foreach (XmlDocument xml in xmlConfigs) + { + XmlNodeList xmlHandlers = xml.SelectNodes("//handler"); + foreach (XmlNode xmlHandler in xmlHandlers) + { + string keyName = xmlHandler.ParentNode.Attributes["source"].Value + + xmlHandler.ParentNode.Attributes["name"].Value; + + // get handlers collection + List taskHandlers = (List)eventHandlers[keyName]; + if (taskHandlers == null) + { + taskHandlers = new List(); + eventHandlers[keyName] = taskHandlers; + } + + string handlerType = xmlHandler.Attributes["type"].Value; + taskHandlers.Add(handlerType); + } + } + } + } + + string fullTaskName = source + taskName; + List handlersList = (List)eventHandlers[fullTaskName]; + return handlersList == null ? null : handlersList.ToArray(); + } + + #endregion + + + #region ResultTasks + + public static void CompleteResultTask(ResultObject res, string errorCode, Exception ex, string errorMessage) + { + if (res != null) + { + res.IsSuccess = false; + + if (!string.IsNullOrEmpty(errorCode)) + res.ErrorCodes.Add(errorCode); + } + + if (ex != null) + TaskManager.WriteError(ex); + + if (!string.IsNullOrEmpty(errorMessage)) + TaskManager.WriteError(errorMessage); + + //LogRecord. + CompleteTask(); + + + } + + public static void CompleteResultTask(ResultObject res, string errorCode, Exception ex) + { + CompleteResultTask(res, errorCode, ex, null); + } + + public static void CompleteResultTask(ResultObject res, string errorCode) + { + CompleteResultTask(res, errorCode, null, null); + } + + public static void CompleteResultTask(ResultObject res) + { + CompleteResultTask(res, null); + } + + public static void CompleteResultTask() + { + CompleteResultTask(null); + } + + public static T StartResultTask(string source, string taskName) where T : ResultObject, new() + { + StartTask(source, taskName); + T res = new T(); + res.IsSuccess = true; + return res; + } + + public static T StartResultTask(string source, string taskName, object itemName) where T : ResultObject, new() + { + StartTask(source, taskName, itemName); + T res = new T(); + res.IsSuccess = true; + return res; + } + + public static T StartResultTask(string source, string taskName, object itemName, int packageId) where T : ResultObject, new() + { + StartTask(source, taskName, itemName, 0, packageId, null); + T res = new T(); + res.IsSuccess = true; + return res; + } + + public static T StartResultTask(string source, string taskName, int packageId) where T : ResultObject, new() + { + StartTask(source, taskName, null, 0, packageId, null); + T res = new T(); + res.IsSuccess = true; + return res; + } + + public static T StartResultTask(string source, string taskName, int itemId, BackgroundTaskParameter parameter) where T : ResultObject, new() + { + StartTask(source, taskName, itemId, parameter); + T res = new T(); + res.IsSuccess = true; + return res; + } + + public static T StartResultTask(string source, string taskName, int itemId, List parameters) where T : ResultObject, new() + { + StartTask(source, taskName, itemId, parameters); + T res = new T(); + res.IsSuccess = true; + return res; + } + + public static T StartResultTask(string source, string taskName, int itemId, object itemName, int packageId) where T : ResultObject, new() + { + StartTask(source, taskName, itemName, itemId, packageId, null); + T res = new T(); + res.IsSuccess = true; + return res; + } + + public static T StartResultTask(string source, string taskName, Guid taskId, object itemName, int packageId) where T : ResultObject, new() + { + StartTask(taskId.ToString(), source, taskName, itemName, 0, packageId); + T res = new T(); + res.IsSuccess = true; + return res; + } + + public static T StartResultTask(string source, string taskName, Guid taskId, int itemId, object itemName, int packageId) where T : ResultObject, new() + { + StartTask(taskId.ToString(), source, taskName, itemName, itemId, packageId); + T res = new T(); + res.IsSuccess = true; + return res; + } + + #endregion + + } +} + diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Users/UserAsyncWorker.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Users/UserAsyncWorker.cs similarity index 95% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Users/UserAsyncWorker.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Users/UserAsyncWorker.cs index d5a66597..33cac57d 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Users/UserAsyncWorker.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Users/UserAsyncWorker.cs @@ -103,8 +103,7 @@ namespace WebsitePanel.EnterpriseServer UserInfo user = UserController.GetUserInternally(userId); // place log record - TaskManager.StartTask(taskId, "USER", "DELETE", user.Username); - TaskManager.ItemId = userId; + TaskManager.StartTask(taskId, "USER", "DELETE", user.Username, userId); try { diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Users/UserController.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Users/UserController.cs similarity index 94% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Users/UserController.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Users/UserController.cs index ff333445..4f51e249 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Users/UserController.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Users/UserController.cs @@ -448,8 +448,12 @@ namespace WebsitePanel.EnterpriseServer return BusinessErrorCodes.ERROR_USER_ALREADY_EXISTS; } - TaskManager.ItemId = userId; - TaskManager.TaskParameters["SendLetter"] = sendLetter; + BackgroundTask topTask = TaskManager.TopTask; + + topTask.ItemId = userId; + topTask.UpdateParamValue("SendLetter", sendLetter); + + TaskController.UpdateTaskWithParams(topTask); return userId; } @@ -518,8 +522,7 @@ namespace WebsitePanel.EnterpriseServer try { // start task - TaskManager.StartTask(taskId, "USER", "UPDATE", user.Username); - TaskManager.ItemId = user.UserId; + TaskManager.StartTask(taskId, "USER", "UPDATE", user.Username, user.UserId); // check account int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo); @@ -637,10 +640,9 @@ namespace WebsitePanel.EnterpriseServer UserInfo user = GetUserInternally(userId); // place log record - TaskManager.StartTask("USER", "CHANGE_PASSWORD", user.Username); - TaskManager.ItemId = user.UserId; + TaskManager.StartTask("USER", "CHANGE_PASSWORD", user.Username, user.UserId); - try + try { DataProvider.ChangeUserPassword(SecurityContext.User.UserId, userId, @@ -675,8 +677,7 @@ namespace WebsitePanel.EnterpriseServer UserInfo user = GetUserInternally(userId); // place log record - TaskManager.StartTask(taskId, "USER", "CHANGE_STATUS", user.Username); - TaskManager.ItemId = user.UserId; + TaskManager.StartTask(taskId, "USER", "CHANGE_STATUS", user.Username, user.UserId); // update user packages List packages = new List(); @@ -796,8 +797,7 @@ namespace WebsitePanel.EnterpriseServer UserInfo user = GetUserInternally(settings.UserId); // place log record - TaskManager.StartTask("USER", "UPDATE_SETTINGS", user.Username); - TaskManager.ItemId = user.UserId; + TaskManager.StartTask("USER", "UPDATE_SETTINGS", user.Username, user.UserId); try { diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Virtualization/CreateServerAsyncWorker.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Virtualization/CreateServerAsyncWorker.cs similarity index 100% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Virtualization/CreateServerAsyncWorker.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Virtualization/CreateServerAsyncWorker.cs diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Virtualization/VirtualizationServerController.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Virtualization/VirtualizationServerController.cs similarity index 95% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Virtualization/VirtualizationServerController.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Virtualization/VirtualizationServerController.cs index ee986ab1..b6dec6b3 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Virtualization/VirtualizationServerController.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Virtualization/VirtualizationServerController.cs @@ -583,9 +583,7 @@ namespace WebsitePanel.EnterpriseServer string summaryLetterEmail) { // start task - TaskManager.StartTask(taskId, "VPS", "CREATE", vm.Name); - TaskManager.ItemId = vm.Id; - TaskManager.PackageId = vm.PackageId; + TaskManager.StartTask(taskId, "VPS", "CREATE", vm.Name, vm.Id, vm.PackageId); try { @@ -1647,12 +1645,7 @@ namespace WebsitePanel.EnterpriseServer #endregion // start task - res = TaskManager.StartResultTask("VPS", "UPDATE_HOSTNAME"); - - // log item info - TaskManager.ItemId = vm.Id; - TaskManager.ItemName = vm.Name; - TaskManager.PackageId = vm.PackageId; + res = TaskManager.StartResultTask("VPS", "UPDATE_HOSTNAME", vm.Id, vm.Name, vm.PackageId); try { @@ -1767,9 +1760,13 @@ namespace WebsitePanel.EnterpriseServer return res; } - TaskManager.ItemId = machine.Id; - TaskManager.ItemName = machine.Name; - TaskManager.PackageId = machine.PackageId; + BackgroundTask topTask = TaskManager.TopTask; + topTask.ItemId = machine.Id; + topTask.ItemName = machine.Name; + topTask.PackageId = machine.PackageId; + + TaskController.UpdateTask(topTask); + TaskManager.WriteParameter("New state", state); // load proxy @@ -1881,12 +1878,7 @@ namespace WebsitePanel.EnterpriseServer #endregion // start task - res = TaskManager.StartResultTask("VPS", "CHANGE_ADMIN_PASSWORD"); - - // log item info - TaskManager.ItemId = vm.Id; - TaskManager.ItemName = vm.Name; - TaskManager.PackageId = vm.PackageId; + res = TaskManager.StartResultTask("VPS", "CHANGE_ADMIN_PASSWORD", vm.Id, vm.Name, vm.PackageId); try { @@ -1983,12 +1975,7 @@ namespace WebsitePanel.EnterpriseServer #endregion // start task - res = TaskManager.StartResultTask("VPS", "UPDATE_CONFIGURATION"); - - // log item info - TaskManager.ItemId = vm.Id; - TaskManager.ItemName = vm.Name; - TaskManager.PackageId = vm.PackageId; + res = TaskManager.StartResultTask("VPS", "UPDATE_CONFIGURATION", vm.Id, vm.Name, vm.PackageId); try { @@ -2185,12 +2172,7 @@ namespace WebsitePanel.EnterpriseServer #endregion // start task - res = TaskManager.StartResultTask("VPS", "INSERT_DVD_DISK"); - - // log item info - TaskManager.ItemId = vm.Id; - TaskManager.ItemName = vm.Name; - TaskManager.PackageId = vm.PackageId; + res = TaskManager.StartResultTask("VPS", "INSERT_DVD_DISK", vm.Id, vm.Name, vm.PackageId); try { @@ -2246,12 +2228,7 @@ namespace WebsitePanel.EnterpriseServer #endregion // start task - res = TaskManager.StartResultTask("VPS", "EJECT_DVD_DISK"); - - // log item info - TaskManager.ItemId = vm.Id; - TaskManager.ItemName = vm.Name; - TaskManager.PackageId = vm.PackageId; + res = TaskManager.StartResultTask("VPS", "EJECT_DVD_DISK", vm.Id, vm.Name, vm.PackageId); try { @@ -2326,12 +2303,7 @@ namespace WebsitePanel.EnterpriseServer #endregion // start task - res = TaskManager.StartResultTask("VPS", "TAKE_SNAPSHOT"); - - // log item info - TaskManager.ItemId = vm.Id; - TaskManager.ItemName = vm.Name; - TaskManager.PackageId = vm.PackageId; + res = TaskManager.StartResultTask("VPS", "TAKE_SNAPSHOT", vm.Id, vm.Name, vm.PackageId); try { @@ -2401,12 +2373,7 @@ namespace WebsitePanel.EnterpriseServer #endregion // start task - res = TaskManager.StartResultTask("VPS", "APPLY_SNAPSHOT"); - - // log item info - TaskManager.ItemId = vm.Id; - TaskManager.ItemName = vm.Name; - TaskManager.PackageId = vm.PackageId; + res = TaskManager.StartResultTask("VPS", "APPLY_SNAPSHOT", vm.Id, vm.Name, vm.PackageId); try { @@ -2472,12 +2439,7 @@ namespace WebsitePanel.EnterpriseServer #endregion // start task - res = TaskManager.StartResultTask("VPS", "RENAME_SNAPSHOT"); - - // log item info - TaskManager.ItemId = vm.Id; - TaskManager.ItemName = vm.Name; - TaskManager.PackageId = vm.PackageId; + res = TaskManager.StartResultTask("VPS", "RENAME_SNAPSHOT", vm.Id, vm.Name, vm.PackageId); try { @@ -2526,12 +2488,7 @@ namespace WebsitePanel.EnterpriseServer #endregion // start task - res = TaskManager.StartResultTask("VPS", "DELETE_SNAPSHOT"); - - // log item info - TaskManager.ItemId = vm.Id; - TaskManager.ItemName = vm.Name; - TaskManager.PackageId = vm.PackageId; + res = TaskManager.StartResultTask("VPS", "DELETE_SNAPSHOT", vm.Id, vm.Name, vm.PackageId); try { @@ -2587,12 +2544,7 @@ namespace WebsitePanel.EnterpriseServer #endregion // start task - res = TaskManager.StartResultTask("VPS", "DELETE_SNAPSHOT_SUBTREE"); - - // log item info - TaskManager.ItemId = vm.Id; - TaskManager.ItemName = vm.Name; - TaskManager.PackageId = vm.PackageId; + res = TaskManager.StartResultTask("VPS", "DELETE_SNAPSHOT_SUBTREE", vm.Id, vm.Name, vm.PackageId); try { @@ -2776,12 +2728,7 @@ namespace WebsitePanel.EnterpriseServer #endregion // start task - res = TaskManager.StartResultTask("VPS", "ADD_EXTERNAL_IP"); - - // log item info - TaskManager.ItemId = vm.Id; - TaskManager.ItemName = vm.Name; - TaskManager.PackageId = vm.PackageId; + res = TaskManager.StartResultTask("VPS", "ADD_EXTERNAL_IP", vm.Id, vm.Name, vm.PackageId); try { @@ -2841,12 +2788,7 @@ namespace WebsitePanel.EnterpriseServer #endregion // start task - res = TaskManager.StartResultTask("VPS", "SET_PRIMARY_EXTERNAL_IP"); - - // log item info - TaskManager.ItemId = vm.Id; - TaskManager.ItemName = vm.Name; - TaskManager.PackageId = vm.PackageId; + res = TaskManager.StartResultTask("VPS", "SET_PRIMARY_EXTERNAL_IP", vm.Id, vm.Name, vm.PackageId); try { @@ -2893,12 +2835,7 @@ namespace WebsitePanel.EnterpriseServer #endregion // start task - res = TaskManager.StartResultTask("VPS", "DELETE_EXTERNAL_IP"); - - // log item info - TaskManager.ItemId = vm.Id; - TaskManager.ItemName = vm.Name; - TaskManager.PackageId = vm.PackageId; + res = TaskManager.StartResultTask("VPS", "DELETE_EXTERNAL_IP", vm.Id, vm.Name, vm.PackageId); try { @@ -3025,12 +2962,7 @@ namespace WebsitePanel.EnterpriseServer #endregion // start task - res = TaskManager.StartResultTask("VPS", "ADD_PRIVATE_IP"); - - // log item info - TaskManager.ItemId = vm.Id; - TaskManager.ItemName = vm.Name; - TaskManager.PackageId = vm.PackageId; + res = TaskManager.StartResultTask("VPS", "ADD_PRIVATE_IP", vm.Id, vm.Name, vm.PackageId); try { @@ -3148,12 +3080,7 @@ namespace WebsitePanel.EnterpriseServer #endregion // start task - res = TaskManager.StartResultTask("VPS", "SET_PRIMARY_PRIVATE_IP"); - - // log item info - TaskManager.ItemId = vm.Id; - TaskManager.ItemName = vm.Name; - TaskManager.PackageId = vm.PackageId; + res = TaskManager.StartResultTask("VPS", "SET_PRIMARY_PRIVATE_IP", vm.Id, vm.Name, vm.PackageId); try { @@ -3200,12 +3127,7 @@ namespace WebsitePanel.EnterpriseServer #endregion // start task - res = TaskManager.StartResultTask("VPS", "DELETE_PRIVATE_IP"); - - // log item info - TaskManager.ItemId = vm.Id; - TaskManager.ItemName = vm.Name; - TaskManager.PackageId = vm.PackageId; + res = TaskManager.StartResultTask("VPS", "DELETE_PRIVATE_IP", vm.Id, vm.Name, vm.PackageId); try { @@ -3368,12 +3290,7 @@ namespace WebsitePanel.EnterpriseServer #endregion // start task - res = TaskManager.StartResultTask("VPS", "DELETE"); - - // log item info - TaskManager.ItemId = vm.Id; - TaskManager.ItemName = vm.Name; - TaskManager.PackageId = vm.PackageId; + res = TaskManager.StartResultTask("VPS", "DELETE", vm.Id, vm.Name, vm.PackageId); try { @@ -3538,11 +3455,7 @@ namespace WebsitePanel.EnterpriseServer #endregion // start task - res = TaskManager.StartResultTask("VPS", "SEND_SUMMARY_LETTER"); - - TaskManager.ItemId = vm.Id; - TaskManager.ItemName = vm.Name; - TaskManager.PackageId = vm.PackageId; + res = TaskManager.StartResultTask("VPS", "SEND_SUMMARY_LETTER", vm.Id, vm.Name, vm.PackageId); try { diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/VirtualizationForPrivateCloud/CreateAsyncVMfromVM.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/VirtualizationForPrivateCloud/CreateAsyncVMfromVM.cs similarity index 100% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/VirtualizationForPrivateCloud/CreateAsyncVMfromVM.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/VirtualizationForPrivateCloud/CreateAsyncVMfromVM.cs diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/VirtualizationForPrivateCloud/CreateServerAsyncWorkerForPrivateCloud.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/VirtualizationForPrivateCloud/CreateServerAsyncWorkerForPrivateCloud.cs similarity index 100% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/VirtualizationForPrivateCloud/CreateServerAsyncWorkerForPrivateCloud.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/VirtualizationForPrivateCloud/CreateServerAsyncWorkerForPrivateCloud.cs diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/VirtualizationForPrivateCloud/VirtualizationServerControllerForPrivateCloud.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/VirtualizationForPrivateCloud/VirtualizationServerControllerForPrivateCloud.cs similarity index 95% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/VirtualizationForPrivateCloud/VirtualizationServerControllerForPrivateCloud.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/VirtualizationForPrivateCloud/VirtualizationServerControllerForPrivateCloud.cs index d1df6e1e..7ec47d27 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/VirtualizationForPrivateCloud/VirtualizationServerControllerForPrivateCloud.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/VirtualizationForPrivateCloud/VirtualizationServerControllerForPrivateCloud.cs @@ -276,9 +276,7 @@ namespace WebsitePanel.EnterpriseServer Guid taksId = Guid.NewGuid(); - res = TaskManager.StartResultTask("VPSForPC", "CREATE", taksId); - TaskManager.ItemName = vmName; - TaskManager.PackageId = packageId; + res = TaskManager.StartResultTask("VPSForPC", "CREATE", taksId, vmName, packageId); string templateName = vmTemplate.Name; @@ -344,9 +342,7 @@ namespace WebsitePanel.EnterpriseServer IntResult res = new IntResult(); //Create Task - res = TaskManager.StartResultTask("VPSForPC", "CREATE"); - TaskManager.PackageId = packageId; - TaskManager.ItemName = vmName; + res = TaskManager.StartResultTask("VPSForPC", "CREATE", vmName, packageId); // meta item VMInfo vmInfo = null; @@ -515,6 +511,7 @@ namespace WebsitePanel.EnterpriseServer { vmInfo.VmId = PackageController.AddPackageItem(vmInfo); vmInfo.Id = vmInfo.VmId; + TaskManager.ItemId = vmInfo.VmId; } catch (Exception ex) @@ -568,10 +565,7 @@ namespace WebsitePanel.EnterpriseServer { Guid taksId = Guid.NewGuid(); - ResultObject taskInfo = TaskManager.StartResultTask("VPSForPC", "CREATE", taksId); - TaskManager.ItemId = vm.Id; - TaskManager.ItemName = vm.Name; - TaskManager.PackageId = vm.PackageId; + ResultObject taskInfo = TaskManager.StartResultTask("VPSForPC", "CREATE", taksId, vm.Id, vm.Name, vm.PackageId); vm.CurrentTaskId = taksId.ToString("N"); @@ -1674,12 +1668,7 @@ namespace WebsitePanel.EnterpriseServer #endregion // start task - res = TaskManager.StartResultTask("VPS", "UPDATE_HOSTNAME"); - - // log item info - TaskManager.ItemId = vm.Id; - TaskManager.ItemName = vm.Name; - TaskManager.PackageId = vm.PackageId; + res = TaskManager.StartResultTask("VPS", "UPDATE_HOSTNAME", vm.Id, vm.Name, vm.PackageId); try { @@ -1814,9 +1803,13 @@ namespace WebsitePanel.EnterpriseServer return res; } - TaskManager.ItemId = machine.Id; - TaskManager.ItemName = machine.Name; - TaskManager.PackageId = machine.PackageId; + BackgroundTask topTask = TaskManager.TopTask; + topTask.ItemId = machine.Id; + topTask.ItemName = machine.Name; + topTask.PackageId = machine.PackageId; + + TaskController.UpdateTask(topTask); + TaskManager.WriteParameter("New state", state); // load proxy @@ -1927,12 +1920,7 @@ namespace WebsitePanel.EnterpriseServer #endregion // start task - res = TaskManager.StartResultTask("VPS", "CHANGE_ADMIN_PASSWORD"); - - // log item info - TaskManager.ItemId = vm.Id; - TaskManager.ItemName = vm.Name; - TaskManager.PackageId = vm.PackageId; + res = TaskManager.StartResultTask("VPS", "CHANGE_ADMIN_PASSWORD", vm.Id, vm.Name, vm.PackageId); try { @@ -2029,12 +2017,7 @@ namespace WebsitePanel.EnterpriseServer #endregion // start task - res = TaskManager.StartResultTask("VPS", "UPDATE_CONFIGURATION"); - - // log item info - TaskManager.ItemId = vm.Id; - TaskManager.ItemName = vm.Name; - TaskManager.PackageId = vm.PackageId; + res = TaskManager.StartResultTask("VPS", "UPDATE_CONFIGURATION", vm.Id, vm.Name, vm.PackageId); try { @@ -2222,12 +2205,7 @@ namespace WebsitePanel.EnterpriseServer #endregion // start task - res = TaskManager.StartResultTask("VPS", "INSERT_DVD_DISK"); - - // log item info - TaskManager.ItemId = vm.Id; - TaskManager.ItemName = vm.Name; - TaskManager.PackageId = vm.PackageId; + res = TaskManager.StartResultTask("VPS", "INSERT_DVD_DISK", vm.Id, vm.Name, vm.PackageId); try { @@ -2283,12 +2261,7 @@ namespace WebsitePanel.EnterpriseServer #endregion // start task - res = TaskManager.StartResultTask("VPS", "EJECT_DVD_DISK"); - - // log item info - TaskManager.ItemId = vm.Id; - TaskManager.ItemName = vm.Name; - TaskManager.PackageId = vm.PackageId; + res = TaskManager.StartResultTask("VPS", "EJECT_DVD_DISK", vm.Id, vm.Name, vm.PackageId); try { @@ -2363,12 +2336,7 @@ namespace WebsitePanel.EnterpriseServer #endregion // start task - res = TaskManager.StartResultTask("VPS", "TAKE_SNAPSHOT"); - - // log item info - TaskManager.ItemId = vm.Id; - TaskManager.ItemName = vm.Name; - TaskManager.PackageId = vm.PackageId; + res = TaskManager.StartResultTask("VPS", "TAKE_SNAPSHOT", vm.Id, vm.Name, vm.PackageId); try { @@ -2438,12 +2406,7 @@ namespace WebsitePanel.EnterpriseServer #endregion // start task - res = TaskManager.StartResultTask("VPS", "APPLY_SNAPSHOT"); - - // log item info - TaskManager.ItemId = vm.Id; - TaskManager.ItemName = vm.Name; - TaskManager.PackageId = vm.PackageId; + res = TaskManager.StartResultTask("VPS", "APPLY_SNAPSHOT", vm.Id, vm.Name, vm.PackageId); try { @@ -2514,12 +2477,7 @@ namespace WebsitePanel.EnterpriseServer #endregion // start task - res = TaskManager.StartResultTask("VPS", "RENAME_SNAPSHOT"); - - // log item info - TaskManager.ItemId = vm.Id; - TaskManager.ItemName = vm.Name; - TaskManager.PackageId = vm.PackageId; + res = TaskManager.StartResultTask("VPS", "RENAME_SNAPSHOT", vm.Id, vm.Name, vm.PackageId); try { @@ -2568,12 +2526,7 @@ namespace WebsitePanel.EnterpriseServer #endregion // start task - res = TaskManager.StartResultTask("VPS", "DELETE_SNAPSHOT"); - - // log item info - TaskManager.ItemId = vm.Id; - TaskManager.ItemName = vm.Name; - TaskManager.PackageId = vm.PackageId; + res = TaskManager.StartResultTask("VPS", "DELETE_SNAPSHOT", vm.Id, vm.Name, vm.PackageId); try { @@ -2629,12 +2582,7 @@ namespace WebsitePanel.EnterpriseServer #endregion // start task - res = TaskManager.StartResultTask("VPS", "DELETE_SNAPSHOT_SUBTREE"); - - // log item info - TaskManager.ItemId = vm.Id; - TaskManager.ItemName = vm.Name; - TaskManager.PackageId = vm.PackageId; + res = TaskManager.StartResultTask("VPS", "DELETE_SNAPSHOT_SUBTREE", vm.Id, vm.Name, vm.PackageId); try { @@ -2825,12 +2773,7 @@ namespace WebsitePanel.EnterpriseServer #endregion // start task - res = TaskManager.StartResultTask("VPS", "ADD_EXTERNAL_IP"); - - // log item info - TaskManager.ItemId = vm.Id; - TaskManager.ItemName = vm.Name; - TaskManager.PackageId = vm.PackageId; + res = TaskManager.StartResultTask("VPS", "ADD_EXTERNAL_IP", vm.Id, vm.Name, vm.PackageId); try { @@ -2890,12 +2833,7 @@ namespace WebsitePanel.EnterpriseServer #endregion // start task - res = TaskManager.StartResultTask("VPS", "SET_PRIMARY_EXTERNAL_IP"); - - // log item info - TaskManager.ItemId = vm.Id; - TaskManager.ItemName = vm.Name; - TaskManager.PackageId = vm.PackageId; + res = TaskManager.StartResultTask("VPS", "SET_PRIMARY_EXTERNAL_IP", vm.Id, vm.Name, vm.PackageId); try { @@ -2942,12 +2880,7 @@ namespace WebsitePanel.EnterpriseServer #endregion // start task - res = TaskManager.StartResultTask("VPS", "DELETE_EXTERNAL_IP"); - - // log item info - TaskManager.ItemId = vm.Id; - TaskManager.ItemName = vm.Name; - TaskManager.PackageId = vm.PackageId; + res = TaskManager.StartResultTask("VPS", "DELETE_EXTERNAL_IP", vm.Id, vm.Name, vm.PackageId); try { @@ -3062,12 +2995,7 @@ namespace WebsitePanel.EnterpriseServer #endregion // start task - res = TaskManager.StartResultTask("VPS", "ADD_PRIVATE_IP"); - - // log item info - TaskManager.ItemId = vm.Id; - TaskManager.ItemName = vm.Name; - TaskManager.PackageId = vm.PackageId; + res = TaskManager.StartResultTask("VPS", "ADD_PRIVATE_IP", vm.Id, vm.Name, vm.PackageId); try { @@ -3182,12 +3110,7 @@ namespace WebsitePanel.EnterpriseServer #endregion // start task - res = TaskManager.StartResultTask("VPS", "SET_PRIMARY_PRIVATE_IP"); - - // log item info - TaskManager.ItemId = vm.Id; - TaskManager.ItemName = vm.Name; - TaskManager.PackageId = vm.PackageId; + res = TaskManager.StartResultTask("VPS", "SET_PRIMARY_PRIVATE_IP", vm.Id, vm.Name, vm.PackageId); try { @@ -3234,12 +3157,7 @@ namespace WebsitePanel.EnterpriseServer #endregion // start task - res = TaskManager.StartResultTask("VPS", "DELETE_PRIVATE_IP"); - - // log item info - TaskManager.ItemId = vm.Id; - TaskManager.ItemName = vm.Name; - TaskManager.PackageId = vm.PackageId; + res = TaskManager.StartResultTask("VPS", "DELETE_PRIVATE_IP", vm.Id, vm.Name, vm.PackageId); try { @@ -3384,12 +3302,7 @@ namespace WebsitePanel.EnterpriseServer #endregion // start task - res = TaskManager.StartResultTask("VPSForPC", "DELETE"); - - // log item info - TaskManager.ItemId = vm.Id; - TaskManager.ItemName = vm.Name; - TaskManager.PackageId = vm.PackageId; + res = TaskManager.StartResultTask("VPSForPC", "DELETE", vm.Id, vm.Name, vm.PackageId); try { @@ -3547,11 +3460,7 @@ namespace WebsitePanel.EnterpriseServer #endregion // start task - res = TaskManager.StartResultTask("VPS", "SEND_SUMMARY_LETTER"); - - TaskManager.ItemId = vm.Id; - TaskManager.ItemName = vm.Name; - TaskManager.PackageId = vm.PackageId; + res = TaskManager.StartResultTask("VPS", "SEND_SUMMARY_LETTER", vm.Id, vm.Name, vm.PackageId); try { diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/WebAppGallery/WebAppGalleryController.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/WebAppGallery/WebAppGalleryController.cs similarity index 100% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/WebAppGallery/WebAppGalleryController.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/WebAppGallery/WebAppGalleryController.cs diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/WebServers/WebServerController.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/WebServers/WebServerController.cs similarity index 96% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/WebServers/WebServerController.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/WebServers/WebServerController.cs index c57912a5..24f91021 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/WebServers/WebServerController.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/WebServers/WebServerController.cs @@ -496,8 +496,7 @@ namespace WebsitePanel.EnterpriseServer return BusinessErrorCodes.ERROR_WEB_SITE_PACKAGE_ITEM_NOT_FOUND; // place log record - TaskManager.StartTask("WEB_SITE", "UPDATE", siteItem.Name); - TaskManager.ItemId = site.Id; + TaskManager.StartTask("WEB_SITE", "UPDATE", siteItem.Name, site.Id); try { @@ -559,8 +558,8 @@ namespace WebsitePanel.EnterpriseServer if (packageCheck < 0) return packageCheck; // place log record - TaskManager.StartTask("WEB_SITE", "CHANGE_STATE", siteItem.Name); - TaskManager.ItemId = siteItemId; + TaskManager.StartTask("WEB_SITE", "CHANGE_STATE", siteItem.Name, siteItemId); + TaskManager.WriteParameter("New state", state); try @@ -582,7 +581,6 @@ namespace WebsitePanel.EnterpriseServer TaskManager.CompleteTask(); } } - // AppPool public static int ChangeAppPoolState(int siteItemId, AppPoolState state) { @@ -664,8 +662,6 @@ namespace WebsitePanel.EnterpriseServer return state; } - - public static int DeleteWebSite(int siteItemId, bool deleteWebsiteDirectory) { // check account @@ -678,8 +674,7 @@ namespace WebsitePanel.EnterpriseServer return BusinessErrorCodes.ERROR_WEB_SITE_PACKAGE_ITEM_NOT_FOUND; // place log record - TaskManager.StartTask("WEB_SITE", "DELETE", siteItem.Name); - TaskManager.ItemId = siteItemId; + TaskManager.StartTask("WEB_SITE", "DELETE", siteItem.Name, siteItemId); // delete web site try @@ -793,8 +788,7 @@ namespace WebsitePanel.EnterpriseServer } // place log record - TaskManager.StartTask("WEB_SITE", "SWITCH_TO_DEDICATED_IP", siteItem.Name); - TaskManager.ItemId = siteItemId; + TaskManager.StartTask("WEB_SITE", "SWITCH_TO_DEDICATED_IP", siteItem.Name, siteItemId); try { @@ -969,8 +963,7 @@ namespace WebsitePanel.EnterpriseServer // place log record - TaskManager.StartTask("WEB_SITE", "SWITCH_TO_SHARED_IP", siteItem.Name); - TaskManager.ItemId = siteItemId; + TaskManager.StartTask("WEB_SITE", "SWITCH_TO_SHARED_IP", siteItem.Name, siteItemId); try { @@ -1306,8 +1299,8 @@ namespace WebsitePanel.EnterpriseServer IPAddressInfo ip = ServerController.GetIPAddress(siteItem.SiteIPAddressId); // place log record - TaskManager.StartTask("WEB_SITE", "ADD_POINTER", siteItem.Name); - TaskManager.ItemId = siteItemId; + TaskManager.StartTask("WEB_SITE", "ADD_POINTER", siteItem.Name, siteItemId); + TaskManager.WriteParameter("Domain pointer", domain.DomainName); TaskManager.WriteParameter("Host name", hostName); TaskManager.WriteParameter("updateWebSite", updateWebSite.ToString()); @@ -1508,8 +1501,8 @@ namespace WebsitePanel.EnterpriseServer IPAddressInfo ip = ServerController.GetIPAddress(siteItem.SiteIPAddressId); // place log record - TaskManager.StartTask("WEB_SITE", "DELETE_POINTER", siteItem.Name); - TaskManager.ItemId = siteItemId; + TaskManager.StartTask("WEB_SITE", "DELETE_POINTER", siteItem.Name, siteItemId); + TaskManager.WriteParameter("Domain pointer", domain.DomainName); TaskManager.WriteParameter("updateWebSite", updateWebSite.ToString()); @@ -1670,8 +1663,8 @@ namespace WebsitePanel.EnterpriseServer if (packageCheck < 0) return packageCheck; // place log record - TaskManager.StartTask("WEB_SITE", "ADD_VDIR", vdirName); - TaskManager.ItemId = siteItemId; + TaskManager.StartTask("WEB_SITE", "ADD_VDIR", vdirName, siteItemId); + TaskManager.WriteParameter("Web site", siteItem.Name); try @@ -1724,8 +1717,8 @@ namespace WebsitePanel.EnterpriseServer return BusinessErrorCodes.ERROR_WEB_SITE_PACKAGE_ITEM_NOT_FOUND; // place log record - TaskManager.StartTask("WEB_SITE", "UPDATE_VDIR", vdir.Name); - TaskManager.ItemId = siteItemId; + TaskManager.StartTask("WEB_SITE", "UPDATE_VDIR", vdir.Name, siteItemId); + TaskManager.WriteParameter("Web site", siteItem.Name); try @@ -1763,8 +1756,8 @@ namespace WebsitePanel.EnterpriseServer // place log record // place log record - TaskManager.StartTask("WEB_SITE", "DELETE_VDIR", vdirName); - TaskManager.ItemId = siteItemId; + TaskManager.StartTask("WEB_SITE", "DELETE_VDIR", vdirName, siteItemId); + TaskManager.WriteParameter("Web site", siteItem.Name); try @@ -1804,8 +1797,8 @@ namespace WebsitePanel.EnterpriseServer if (packageCheck < 0) return packageCheck; // place log record - TaskManager.StartTask("WEB_SITE", "INSTALL_FP", siteItem.Name); - TaskManager.ItemId = siteItemId; + TaskManager.StartTask("WEB_SITE", "INSTALL_FP", siteItem.Name, siteItemId); + TaskManager.WriteParameter("FrontPage username", username); try @@ -1857,8 +1850,8 @@ namespace WebsitePanel.EnterpriseServer return BusinessErrorCodes.ERROR_WEB_SITE_PACKAGE_ITEM_NOT_FOUND; // place log record - TaskManager.StartTask("WEB_SITE", "UNINSTALL_FP", siteItem.Name); - TaskManager.ItemId = siteItemId; + TaskManager.StartTask("WEB_SITE", "UNINSTALL_FP", siteItem.Name, siteItemId); + TaskManager.WriteParameter("FrontPage username", siteItem.FrontPageAccount); try @@ -1898,8 +1891,8 @@ namespace WebsitePanel.EnterpriseServer return BusinessErrorCodes.ERROR_WEB_SITE_PACKAGE_ITEM_NOT_FOUND; // place log record - TaskManager.StartTask("WEB_SITE", "CHANGE_FP_PASSWORD", siteItem.Name); - TaskManager.ItemId = siteItemId; + TaskManager.StartTask("WEB_SITE", "CHANGE_FP_PASSWORD", siteItem.Name, siteItemId); + TaskManager.WriteParameter("FrontPage username", siteItem.FrontPageAccount); try @@ -1941,8 +1934,7 @@ namespace WebsitePanel.EnterpriseServer return BusinessErrorCodes.ERROR_WEB_SITE_PACKAGE_ITEM_NOT_FOUND; // place log record - TaskManager.StartTask("WEB_SITE", "INSTALL_SECURED_FOLDERS", siteItem.Name); - TaskManager.ItemId = siteItemId; + TaskManager.StartTask("WEB_SITE", "INSTALL_SECURED_FOLDERS", siteItem.Name, siteItemId); try { @@ -1975,8 +1967,7 @@ namespace WebsitePanel.EnterpriseServer return BusinessErrorCodes.ERROR_WEB_SITE_PACKAGE_ITEM_NOT_FOUND; // place log record - TaskManager.StartTask("WEB_SITE", "UNINSTALL_SECURED_FOLDERS", siteItem.Name); - TaskManager.ItemId = siteItemId; + TaskManager.StartTask("WEB_SITE", "UNINSTALL_SECURED_FOLDERS", siteItem.Name, siteItemId); try { @@ -2030,8 +2021,8 @@ namespace WebsitePanel.EnterpriseServer folder.Path = FilesController.CorrectRelativePath(folder.Path); // place log record - TaskManager.StartTask("WEB_SITE", "UPDATE_SECURED_FOLDER", siteItem.Name); - TaskManager.ItemId = siteItemId; + TaskManager.StartTask("WEB_SITE", "UPDATE_SECURED_FOLDER", siteItem.Name, siteItemId); + TaskManager.WriteParameter("Folder", folder.Path); try @@ -2060,8 +2051,8 @@ namespace WebsitePanel.EnterpriseServer return BusinessErrorCodes.ERROR_WEB_SITE_PACKAGE_ITEM_NOT_FOUND; // place log record - TaskManager.StartTask("WEB_SITE", "DELETE_SECURED_FOLDER", siteItem.Name); - TaskManager.ItemId = siteItemId; + TaskManager.StartTask("WEB_SITE", "DELETE_SECURED_FOLDER", siteItem.Name, siteItemId); + TaskManager.WriteParameter("Folder", folderPath); try @@ -2116,8 +2107,8 @@ namespace WebsitePanel.EnterpriseServer return BusinessErrorCodes.ERROR_WEB_SITE_PACKAGE_ITEM_NOT_FOUND; // place log record - TaskManager.StartTask("WEB_SITE", "UPDATE_SECURED_USER", siteItem.Name); - TaskManager.ItemId = siteItemId; + TaskManager.StartTask("WEB_SITE", "UPDATE_SECURED_USER", siteItem.Name, siteItemId); + TaskManager.WriteParameter("User", user.Name); try @@ -2146,8 +2137,8 @@ namespace WebsitePanel.EnterpriseServer return BusinessErrorCodes.ERROR_WEB_SITE_PACKAGE_ITEM_NOT_FOUND; // place log record - TaskManager.StartTask("WEB_SITE", "DELETE_SECURED_USER", siteItem.Name); - TaskManager.ItemId = siteItemId; + TaskManager.StartTask("WEB_SITE", "DELETE_SECURED_USER", siteItem.Name, siteItemId); + TaskManager.WriteParameter("User", userName); try @@ -2202,8 +2193,8 @@ namespace WebsitePanel.EnterpriseServer return BusinessErrorCodes.ERROR_WEB_SITE_PACKAGE_ITEM_NOT_FOUND; // place log record - TaskManager.StartTask("WEB_SITE", "UPDATE_SECURED_GROUP", siteItem.Name); - TaskManager.ItemId = siteItemId; + TaskManager.StartTask("WEB_SITE", "UPDATE_SECURED_GROUP", siteItem.Name, siteItemId); + TaskManager.WriteParameter("Group", group.Name); try @@ -2232,8 +2223,8 @@ namespace WebsitePanel.EnterpriseServer return BusinessErrorCodes.ERROR_WEB_SITE_PACKAGE_ITEM_NOT_FOUND; // place log record - TaskManager.StartTask("WEB_SITE", "DELETE_SECURED_GROUP", siteItem.Name); - TaskManager.ItemId = siteItemId; + TaskManager.StartTask("WEB_SITE", "DELETE_SECURED_GROUP", siteItem.Name, siteItemId); + TaskManager.WriteParameter("Group", groupName); try @@ -2397,9 +2388,12 @@ namespace WebsitePanel.EnterpriseServer dir.Name = sslDomain + "/" + vdirName; dir.PackageId = packageId; dir.ServiceId = serviceId; - TaskManager.ItemId = PackageController.AddPackageItem(dir); - return TaskManager.ItemId; + int itemId = PackageController.AddPackageItem(dir); + + TaskManager.ItemId = itemId; + + return itemId; } catch (Exception ex) { @@ -2423,8 +2417,7 @@ namespace WebsitePanel.EnterpriseServer return 0; // place log record - TaskManager.StartTask("WEB_SITE", "UPDATE_SSL_FOLDER", origVdir.Name); - TaskManager.ItemId = vdir.Id; + TaskManager.StartTask("WEB_SITE", "UPDATE_SSL_FOLDER", origVdir.Name, vdir.Id); try { @@ -2471,8 +2464,7 @@ namespace WebsitePanel.EnterpriseServer return 0; // place log record - TaskManager.StartTask("WEB_SITE", "DELETE_SSL_FOLDER", origVdir.Name); - TaskManager.ItemId = itemId; + TaskManager.StartTask("WEB_SITE", "DELETE_SSL_FOLDER", origVdir.Name, itemId); try { @@ -2975,8 +2967,7 @@ namespace WebsitePanel.EnterpriseServer return BusinessErrorCodes.ERROR_WEB_SITE_PACKAGE_ITEM_NOT_FOUND; // place log record - TaskManager.StartTask("WEB_SITE", "ENABLE_HELICON_APE", siteItem.Name); - TaskManager.ItemId = siteItemId; + TaskManager.StartTask("WEB_SITE", "ENABLE_HELICON_APE", siteItem.Name, siteItemId); try { @@ -3010,8 +3001,7 @@ namespace WebsitePanel.EnterpriseServer return BusinessErrorCodes.ERROR_WEB_SITE_PACKAGE_ITEM_NOT_FOUND; // place log record - TaskManager.StartTask("WEB_SITE", "DISABLE_HELICON_APE", siteItem.Name); - TaskManager.ItemId = siteItemId; + TaskManager.StartTask("WEB_SITE", "DISABLE_HELICON_APE", siteItem.Name, siteItemId); try { @@ -3153,8 +3143,8 @@ namespace WebsitePanel.EnterpriseServer folder.Path = FilesController.CorrectRelativePath(folder.Path); // place log record - TaskManager.StartTask("WEB_SITE", "UPDATE_HELICON_APE_FOLDER", siteItem.Name); - TaskManager.ItemId = siteItemId; + TaskManager.StartTask("WEB_SITE", "UPDATE_HELICON_APE_FOLDER", siteItem.Name, siteItemId); + TaskManager.WriteParameter("Folder", folder.Path); try @@ -3209,8 +3199,8 @@ namespace WebsitePanel.EnterpriseServer return BusinessErrorCodes.ERROR_WEB_SITE_PACKAGE_ITEM_NOT_FOUND; // place log record - TaskManager.StartTask("WEB_SITE", "DELETE_HELICON_APE_FOLDER", siteItem.Name); - TaskManager.ItemId = siteItemId; + TaskManager.StartTask("WEB_SITE", "DELETE_HELICON_APE_FOLDER", siteItem.Name, siteItemId); + TaskManager.WriteParameter("Folder", folderPath); try @@ -3266,8 +3256,8 @@ namespace WebsitePanel.EnterpriseServer return BusinessErrorCodes.ERROR_WEB_SITE_PACKAGE_ITEM_NOT_FOUND; // place log record - TaskManager.StartTask("WEB_SITE", "UPDATE_HELICON_APE_USER", siteItem.Name); - TaskManager.ItemId = siteItemId; + TaskManager.StartTask("WEB_SITE", "UPDATE_HELICON_APE_USER", siteItem.Name, siteItemId); + TaskManager.WriteParameter("User", user.Name); try @@ -3296,8 +3286,8 @@ namespace WebsitePanel.EnterpriseServer return BusinessErrorCodes.ERROR_WEB_SITE_PACKAGE_ITEM_NOT_FOUND; // place log record - TaskManager.StartTask("WEB_SITE", "DELETE_HELICON_APE_USER", siteItem.Name); - TaskManager.ItemId = siteItemId; + TaskManager.StartTask("WEB_SITE", "DELETE_HELICON_APE_USER", siteItem.Name, siteItemId); + TaskManager.WriteParameter("User", userName); try @@ -3352,8 +3342,8 @@ namespace WebsitePanel.EnterpriseServer return BusinessErrorCodes.ERROR_WEB_SITE_PACKAGE_ITEM_NOT_FOUND; // place log record - TaskManager.StartTask("WEB_SITE", "UPDATE_HELICON_APE_GROUP", siteItem.Name); - TaskManager.ItemId = siteItemId; + TaskManager.StartTask("WEB_SITE", "UPDATE_HELICON_APE_GROUP", siteItem.Name, siteItemId); + TaskManager.WriteParameter("Group", group.Name); try @@ -3382,8 +3372,8 @@ namespace WebsitePanel.EnterpriseServer return BusinessErrorCodes.ERROR_WEB_SITE_PACKAGE_ITEM_NOT_FOUND; // place log record - TaskManager.StartTask("WEB_SITE", "DELETE_HELICON_APE_GROUP", siteItem.Name); - TaskManager.ItemId = siteItemId; + TaskManager.StartTask("WEB_SITE", "DELETE_HELICON_APE_GROUP", siteItem.Name, siteItemId); + TaskManager.WriteParameter("Group", groupName); try diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/WebsitePanel.EnterpriseServer.Code.csproj b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/WebsitePanel.EnterpriseServer.Code.csproj new file mode 100644 index 00000000..1923fd2e --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/WebsitePanel.EnterpriseServer.Code.csproj @@ -0,0 +1,196 @@ + + + + Debug + AnyCPU + 8.0.30703 + 2.0 + {60E39314-659C-4FAD-AB91-D0D08E223578} + Library + Properties + WebsitePanel.EnterpriseServer.Code + WebsitePanel.EnterpriseServer.Code + v4.0 + 512 + + + true + full + false + ..\..\Bin\ + DEBUG;TRACE + prompt + 4 + AnyCPU + + + pdbonly + true + ..\..\Bin\ + TRACE + prompt + 4 + + + + ..\..\Lib\Ionic.Zip.Reduced.dll + + + ..\..\Bin\Microsoft.Web.Services3.dll + + + + + + + + + + + + + + + + False + ..\..\Bin\WebsitePanel.EnterpriseServer.Base.dll + + + ..\..\Bin\WebsitePanel.Providers.Base.dll + + + ..\..\Bin\WebsitePanel.Server.Client.dll + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {53D22D35-4013-415F-BA09-F67A0DBBB0C1} + WebsitePanel.Common.Utils + + + {387FA0EF-3927-45FF-8F8F-BCCD735540C6} + WebsitePanel.Templates + + + {7112B144-C5EE-43C2-9441-569D75D13CB9} + WebsitePanel.Whois + + + + + \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Wizards/UserCreationWizard.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Wizards/UserCreationWizard.cs similarity index 100% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Wizards/UserCreationWizard.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Wizards/UserCreationWizard.cs diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Wizards/WebApplicationsInstaller.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Wizards/WebApplicationsInstaller.cs similarity index 97% rename from WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Wizards/WebApplicationsInstaller.cs rename to WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Wizards/WebApplicationsInstaller.cs index 8ae1f11b..aa40c3dd 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Wizards/WebApplicationsInstaller.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Wizards/WebApplicationsInstaller.cs @@ -91,17 +91,21 @@ namespace WebsitePanel.EnterpriseServer public int InstallWebApplication(InstallationInfo inst) { // place log record - TaskManager.StartTask("APP_INSTALLER", "INSTALL_APPLICATION"); + TaskManager.StartTask("APP_INSTALLER", "INSTALL_APPLICATION", inst.PackageId); + TaskManager.WriteParameter("Virtual directory", inst.VirtualDir); TaskManager.WriteParameter("Database group", inst.DatabaseGroup); - TaskManager.ItemId = inst.PackageId; - + try { // get application info app = GetApplication(inst.PackageId, inst.ApplicationId); - TaskManager.ItemName = app.Name; + BackgroundTask topTask = TaskManager.TopTask; + + topTask.ItemName = app.Name; + + TaskController.UpdateTask(topTask); // check web site for existance WebSite webSite = WebServerController.GetWebSite(inst.WebSiteId); diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.sln b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.sln index 36ca6285..5996e6ba 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.sln +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.sln @@ -1,5 +1,5 @@ Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2010 +# Visual Studio 2012 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{C57D3F9F-7BA0-4D38-A159-B6EDA5C19B13}" ProjectSection(SolutionItems) = preProject ..\..\LICENSE.txt = ..\..\LICENSE.txt @@ -10,6 +10,11 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution EndProjectSection EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebsitePanel.EnterpriseServer", "WebsitePanel.EnterpriseServer\WebsitePanel.EnterpriseServer.csproj", "{59C7623A-5181-48A5-880A-C9B82B48F589}" + ProjectSection(ProjectDependencies) = postProject + {C09CE910-F16B-48A1-B2CC-C99B8C1CF775} = {C09CE910-F16B-48A1-B2CC-C99B8C1CF775} + {60E39314-659C-4FAD-AB91-D0D08E223578} = {60E39314-659C-4FAD-AB91-D0D08E223578} + {4B344644-A570-477E-ADCC-F2B267D6C038} = {4B344644-A570-477E-ADCC-F2B267D6C038} + EndProjectSection EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebsitePanel.EnterpriseServer.Base", "WebsitePanel.EnterpriseServer.Base\WebsitePanel.EnterpriseServer.Base.csproj", "{C09CE910-F16B-48A1-B2CC-C99B8C1CF775}" EndProject @@ -21,12 +26,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebsitePanel.Plugins.Author EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebsitePanel.Plugins.PayPalPro", "WebsitePanel.Gateways.PayPal\WebsitePanel.Plugins.PayPalPro.csproj", "{D695D58C-99F7-409E-B3D8-C1B97A8E748A}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebsitePanel.Products.DomainName", "WebsitePanel.Products.DomainName\WebsitePanel.Products.DomainName.csproj", "{FFE9BFD3-AAB8-4703-AF8F-A41F0D878DB8}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebsitePanel.Products.HostingAddon", "WebsitePanel.Products.HostingAddon\WebsitePanel.Products.HostingAddon.csproj", "{338F816B-BEB4-4F18-9EA1-2EFD35DBA65B}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebsitePanel.Products.HostingPlan", "WebsitePanel.Products.HostingPlan\WebsitePanel.Products.HostingPlan.csproj", "{65FEDD1B-379C-413D-84D8-20E6C29C645D}" -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebsitePanel.Plugins.Enom", "WebsitePanel.Registrars.Enom\WebsitePanel.Plugins.Enom.csproj", "{39A6F585-4A27-4AAA-A43F-858FC32ADF98}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebsitePanel.Common.Utils", "WebsitePanel.Common.Utils\WebsitePanel.Common.Utils.csproj", "{53D22D35-4013-415F-BA09-F67A0DBBB0C1}" @@ -41,70 +40,173 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebsitePanel.Plugins.PayPal EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebsitePanel.Templates", "WebsitePanel.Templates\WebsitePanel.Templates.csproj", "{387FA0EF-3927-45FF-8F8F-BCCD735540C6}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebsitePanel.EnterpriseServer.Code", "WebsitePanel.EnterpriseServer.Code\WebsitePanel.EnterpriseServer.Code.csproj", "{60E39314-659C-4FAD-AB91-D0D08E223578}" + ProjectSection(ProjectDependencies) = postProject + {C09CE910-F16B-48A1-B2CC-C99B8C1CF775} = {C09CE910-F16B-48A1-B2CC-C99B8C1CF775} + EndProjectSection +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebsitePanel.SchedulerService", "WebsitePanel.SchedulerService\WebsitePanel.SchedulerService.csproj", "{5B823520-0450-44A9-AC86-9658B41DFA7C}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU + Debug|Mixed Platforms = Debug|Mixed Platforms + Debug|x86 = Debug|x86 Release|Any CPU = Release|Any CPU + Release|Mixed Platforms = Release|Mixed Platforms + Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {59C7623A-5181-48A5-880A-C9B82B48F589}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {59C7623A-5181-48A5-880A-C9B82B48F589}.Debug|Any CPU.Build.0 = Debug|Any CPU + {59C7623A-5181-48A5-880A-C9B82B48F589}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {59C7623A-5181-48A5-880A-C9B82B48F589}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {59C7623A-5181-48A5-880A-C9B82B48F589}.Debug|x86.ActiveCfg = Debug|Any CPU {59C7623A-5181-48A5-880A-C9B82B48F589}.Release|Any CPU.ActiveCfg = Release|Any CPU {59C7623A-5181-48A5-880A-C9B82B48F589}.Release|Any CPU.Build.0 = Release|Any CPU + {59C7623A-5181-48A5-880A-C9B82B48F589}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {59C7623A-5181-48A5-880A-C9B82B48F589}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {59C7623A-5181-48A5-880A-C9B82B48F589}.Release|x86.ActiveCfg = Release|Any CPU {C09CE910-F16B-48A1-B2CC-C99B8C1CF775}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {C09CE910-F16B-48A1-B2CC-C99B8C1CF775}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C09CE910-F16B-48A1-B2CC-C99B8C1CF775}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {C09CE910-F16B-48A1-B2CC-C99B8C1CF775}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {C09CE910-F16B-48A1-B2CC-C99B8C1CF775}.Debug|x86.ActiveCfg = Debug|Any CPU {C09CE910-F16B-48A1-B2CC-C99B8C1CF775}.Release|Any CPU.ActiveCfg = Release|Any CPU {C09CE910-F16B-48A1-B2CC-C99B8C1CF775}.Release|Any CPU.Build.0 = Release|Any CPU + {C09CE910-F16B-48A1-B2CC-C99B8C1CF775}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {C09CE910-F16B-48A1-B2CC-C99B8C1CF775}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {C09CE910-F16B-48A1-B2CC-C99B8C1CF775}.Release|x86.ActiveCfg = Release|Any CPU {4B344644-A570-477E-ADCC-F2B267D6C038}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {4B344644-A570-477E-ADCC-F2B267D6C038}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4B344644-A570-477E-ADCC-F2B267D6C038}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {4B344644-A570-477E-ADCC-F2B267D6C038}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {4B344644-A570-477E-ADCC-F2B267D6C038}.Debug|x86.ActiveCfg = Debug|Any CPU {4B344644-A570-477E-ADCC-F2B267D6C038}.Release|Any CPU.ActiveCfg = Release|Any CPU {4B344644-A570-477E-ADCC-F2B267D6C038}.Release|Any CPU.Build.0 = Release|Any CPU + {4B344644-A570-477E-ADCC-F2B267D6C038}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {4B344644-A570-477E-ADCC-F2B267D6C038}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {4B344644-A570-477E-ADCC-F2B267D6C038}.Release|x86.ActiveCfg = Release|Any CPU {1222B073-8757-4163-9D1A-1A1EAE697DD3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1222B073-8757-4163-9D1A-1A1EAE697DD3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1222B073-8757-4163-9D1A-1A1EAE697DD3}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {1222B073-8757-4163-9D1A-1A1EAE697DD3}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {1222B073-8757-4163-9D1A-1A1EAE697DD3}.Debug|x86.ActiveCfg = Debug|Any CPU {1222B073-8757-4163-9D1A-1A1EAE697DD3}.Release|Any CPU.ActiveCfg = Release|Any CPU {1222B073-8757-4163-9D1A-1A1EAE697DD3}.Release|Any CPU.Build.0 = Release|Any CPU + {1222B073-8757-4163-9D1A-1A1EAE697DD3}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {1222B073-8757-4163-9D1A-1A1EAE697DD3}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {1222B073-8757-4163-9D1A-1A1EAE697DD3}.Release|x86.ActiveCfg = Release|Any CPU {DB852295-2A86-44AB-8CF8-A73FEAF15368}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {DB852295-2A86-44AB-8CF8-A73FEAF15368}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DB852295-2A86-44AB-8CF8-A73FEAF15368}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {DB852295-2A86-44AB-8CF8-A73FEAF15368}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {DB852295-2A86-44AB-8CF8-A73FEAF15368}.Debug|x86.ActiveCfg = Debug|Any CPU {DB852295-2A86-44AB-8CF8-A73FEAF15368}.Release|Any CPU.ActiveCfg = Release|Any CPU {DB852295-2A86-44AB-8CF8-A73FEAF15368}.Release|Any CPU.Build.0 = Release|Any CPU + {DB852295-2A86-44AB-8CF8-A73FEAF15368}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {DB852295-2A86-44AB-8CF8-A73FEAF15368}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {DB852295-2A86-44AB-8CF8-A73FEAF15368}.Release|x86.ActiveCfg = Release|Any CPU {D695D58C-99F7-409E-B3D8-C1B97A8E748A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D695D58C-99F7-409E-B3D8-C1B97A8E748A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D695D58C-99F7-409E-B3D8-C1B97A8E748A}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {D695D58C-99F7-409E-B3D8-C1B97A8E748A}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {D695D58C-99F7-409E-B3D8-C1B97A8E748A}.Debug|x86.ActiveCfg = Debug|Any CPU {D695D58C-99F7-409E-B3D8-C1B97A8E748A}.Release|Any CPU.ActiveCfg = Release|Any CPU {D695D58C-99F7-409E-B3D8-C1B97A8E748A}.Release|Any CPU.Build.0 = Release|Any CPU - {FFE9BFD3-AAB8-4703-AF8F-A41F0D878DB8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {FFE9BFD3-AAB8-4703-AF8F-A41F0D878DB8}.Release|Any CPU.ActiveCfg = Release|Any CPU - {338F816B-BEB4-4F18-9EA1-2EFD35DBA65B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {338F816B-BEB4-4F18-9EA1-2EFD35DBA65B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {65FEDD1B-379C-413D-84D8-20E6C29C645D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {65FEDD1B-379C-413D-84D8-20E6C29C645D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D695D58C-99F7-409E-B3D8-C1B97A8E748A}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {D695D58C-99F7-409E-B3D8-C1B97A8E748A}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {D695D58C-99F7-409E-B3D8-C1B97A8E748A}.Release|x86.ActiveCfg = Release|Any CPU {39A6F585-4A27-4AAA-A43F-858FC32ADF98}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {39A6F585-4A27-4AAA-A43F-858FC32ADF98}.Debug|Any CPU.Build.0 = Debug|Any CPU + {39A6F585-4A27-4AAA-A43F-858FC32ADF98}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {39A6F585-4A27-4AAA-A43F-858FC32ADF98}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {39A6F585-4A27-4AAA-A43F-858FC32ADF98}.Debug|x86.ActiveCfg = Debug|Any CPU {39A6F585-4A27-4AAA-A43F-858FC32ADF98}.Release|Any CPU.ActiveCfg = Release|Any CPU {39A6F585-4A27-4AAA-A43F-858FC32ADF98}.Release|Any CPU.Build.0 = Release|Any CPU + {39A6F585-4A27-4AAA-A43F-858FC32ADF98}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {39A6F585-4A27-4AAA-A43F-858FC32ADF98}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {39A6F585-4A27-4AAA-A43F-858FC32ADF98}.Release|x86.ActiveCfg = Release|Any CPU {53D22D35-4013-415F-BA09-F67A0DBBB0C1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {53D22D35-4013-415F-BA09-F67A0DBBB0C1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {53D22D35-4013-415F-BA09-F67A0DBBB0C1}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {53D22D35-4013-415F-BA09-F67A0DBBB0C1}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {53D22D35-4013-415F-BA09-F67A0DBBB0C1}.Debug|x86.ActiveCfg = Debug|Any CPU {53D22D35-4013-415F-BA09-F67A0DBBB0C1}.Release|Any CPU.ActiveCfg = Release|Any CPU {53D22D35-4013-415F-BA09-F67A0DBBB0C1}.Release|Any CPU.Build.0 = Release|Any CPU + {53D22D35-4013-415F-BA09-F67A0DBBB0C1}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {53D22D35-4013-415F-BA09-F67A0DBBB0C1}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {53D22D35-4013-415F-BA09-F67A0DBBB0C1}.Release|x86.ActiveCfg = Release|Any CPU {01D3213A-B615-47D2-99F0-005CF05CE920}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {01D3213A-B615-47D2-99F0-005CF05CE920}.Debug|Any CPU.Build.0 = Debug|Any CPU + {01D3213A-B615-47D2-99F0-005CF05CE920}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {01D3213A-B615-47D2-99F0-005CF05CE920}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {01D3213A-B615-47D2-99F0-005CF05CE920}.Debug|x86.ActiveCfg = Debug|Any CPU {01D3213A-B615-47D2-99F0-005CF05CE920}.Release|Any CPU.ActiveCfg = Release|Any CPU {01D3213A-B615-47D2-99F0-005CF05CE920}.Release|Any CPU.Build.0 = Release|Any CPU + {01D3213A-B615-47D2-99F0-005CF05CE920}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {01D3213A-B615-47D2-99F0-005CF05CE920}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {01D3213A-B615-47D2-99F0-005CF05CE920}.Release|x86.ActiveCfg = Release|Any CPU {1FED69FB-68EB-46A8-9B9C-B08760AD4514}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1FED69FB-68EB-46A8-9B9C-B08760AD4514}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1FED69FB-68EB-46A8-9B9C-B08760AD4514}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {1FED69FB-68EB-46A8-9B9C-B08760AD4514}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {1FED69FB-68EB-46A8-9B9C-B08760AD4514}.Debug|x86.ActiveCfg = Debug|Any CPU {1FED69FB-68EB-46A8-9B9C-B08760AD4514}.Release|Any CPU.ActiveCfg = Release|Any CPU {1FED69FB-68EB-46A8-9B9C-B08760AD4514}.Release|Any CPU.Build.0 = Release|Any CPU + {1FED69FB-68EB-46A8-9B9C-B08760AD4514}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {1FED69FB-68EB-46A8-9B9C-B08760AD4514}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {1FED69FB-68EB-46A8-9B9C-B08760AD4514}.Release|x86.ActiveCfg = Release|Any CPU {7112B144-C5EE-43C2-9441-569D75D13CB9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {7112B144-C5EE-43C2-9441-569D75D13CB9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7112B144-C5EE-43C2-9441-569D75D13CB9}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {7112B144-C5EE-43C2-9441-569D75D13CB9}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {7112B144-C5EE-43C2-9441-569D75D13CB9}.Debug|x86.ActiveCfg = Debug|Any CPU {7112B144-C5EE-43C2-9441-569D75D13CB9}.Release|Any CPU.ActiveCfg = Release|Any CPU {7112B144-C5EE-43C2-9441-569D75D13CB9}.Release|Any CPU.Build.0 = Release|Any CPU + {7112B144-C5EE-43C2-9441-569D75D13CB9}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {7112B144-C5EE-43C2-9441-569D75D13CB9}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {7112B144-C5EE-43C2-9441-569D75D13CB9}.Release|x86.ActiveCfg = Release|Any CPU {9247B024-F931-4506-8ECD-27E862C0EA1D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9247B024-F931-4506-8ECD-27E862C0EA1D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9247B024-F931-4506-8ECD-27E862C0EA1D}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {9247B024-F931-4506-8ECD-27E862C0EA1D}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {9247B024-F931-4506-8ECD-27E862C0EA1D}.Debug|x86.ActiveCfg = Debug|Any CPU {9247B024-F931-4506-8ECD-27E862C0EA1D}.Release|Any CPU.ActiveCfg = Release|Any CPU {9247B024-F931-4506-8ECD-27E862C0EA1D}.Release|Any CPU.Build.0 = Release|Any CPU + {9247B024-F931-4506-8ECD-27E862C0EA1D}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {9247B024-F931-4506-8ECD-27E862C0EA1D}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {9247B024-F931-4506-8ECD-27E862C0EA1D}.Release|x86.ActiveCfg = Release|Any CPU {387FA0EF-3927-45FF-8F8F-BCCD735540C6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {387FA0EF-3927-45FF-8F8F-BCCD735540C6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {387FA0EF-3927-45FF-8F8F-BCCD735540C6}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {387FA0EF-3927-45FF-8F8F-BCCD735540C6}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {387FA0EF-3927-45FF-8F8F-BCCD735540C6}.Debug|x86.ActiveCfg = Debug|Any CPU {387FA0EF-3927-45FF-8F8F-BCCD735540C6}.Release|Any CPU.ActiveCfg = Release|Any CPU {387FA0EF-3927-45FF-8F8F-BCCD735540C6}.Release|Any CPU.Build.0 = Release|Any CPU + {387FA0EF-3927-45FF-8F8F-BCCD735540C6}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {387FA0EF-3927-45FF-8F8F-BCCD735540C6}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {387FA0EF-3927-45FF-8F8F-BCCD735540C6}.Release|x86.ActiveCfg = Release|Any CPU + {60E39314-659C-4FAD-AB91-D0D08E223578}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {60E39314-659C-4FAD-AB91-D0D08E223578}.Debug|Any CPU.Build.0 = Debug|Any CPU + {60E39314-659C-4FAD-AB91-D0D08E223578}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {60E39314-659C-4FAD-AB91-D0D08E223578}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {60E39314-659C-4FAD-AB91-D0D08E223578}.Debug|x86.ActiveCfg = Debug|Any CPU + {60E39314-659C-4FAD-AB91-D0D08E223578}.Release|Any CPU.ActiveCfg = Release|Any CPU + {60E39314-659C-4FAD-AB91-D0D08E223578}.Release|Any CPU.Build.0 = Release|Any CPU + {60E39314-659C-4FAD-AB91-D0D08E223578}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {60E39314-659C-4FAD-AB91-D0D08E223578}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {60E39314-659C-4FAD-AB91-D0D08E223578}.Release|x86.ActiveCfg = Release|Any CPU + {5B823520-0450-44A9-AC86-9658B41DFA7C}.Debug|Any CPU.ActiveCfg = Debug|x86 + {5B823520-0450-44A9-AC86-9658B41DFA7C}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {5B823520-0450-44A9-AC86-9658B41DFA7C}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {5B823520-0450-44A9-AC86-9658B41DFA7C}.Debug|x86.ActiveCfg = Debug|x86 + {5B823520-0450-44A9-AC86-9658B41DFA7C}.Debug|x86.Build.0 = Debug|x86 + {5B823520-0450-44A9-AC86-9658B41DFA7C}.Release|Any CPU.ActiveCfg = Release|x86 + {5B823520-0450-44A9-AC86-9658B41DFA7C}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {5B823520-0450-44A9-AC86-9658B41DFA7C}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {5B823520-0450-44A9-AC86-9658B41DFA7C}.Release|x86.ActiveCfg = Release|x86 + {5B823520-0450-44A9-AC86-9658B41DFA7C}.Release|x86.Build.0 = Release|x86 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Common/ObjectUtils.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Common/ObjectUtils.cs deleted file mode 100644 index 1a705eac..00000000 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Common/ObjectUtils.cs +++ /dev/null @@ -1,659 +0,0 @@ -// Copyright (c) 2012, Outercurve Foundation. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without modification, -// are permitted provided that the following conditions are met: -// -// - Redistributions of source code must retain the above copyright notice, this -// list of conditions and the following disclaimer. -// -// - Redistributions in binary form must reproduce the above copyright notice, -// this list of conditions and the following disclaimer in the documentation -// and/or other materials provided with the distribution. -// -// - Neither the name of the Outercurve Foundation nor the names of its -// contributors may be used to endorse or promote products derived from this -// software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR -// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -using System; -using System.Reflection; -using System.Data; -using System.Collections; -using System.Collections.Generic; - -using WebsitePanel.Providers; - -namespace WebsitePanel.EnterpriseServer -{ - /// - /// Summary description for ObjectUtils. - /// - public class ObjectUtils - { - public static DT ConvertObject(ST so) - { - Dictionary sProps = GetTypePropertiesHash(typeof(ST)); - Dictionary dProps = GetTypePropertiesHash(typeof(DT)); - - DT dobj = (DT)Activator.CreateInstance(typeof(DT)); - - // copy properties - foreach (string propName in sProps.Keys) - { - if (dProps.ContainsKey(propName) && sProps[propName].Name != "Item") - { - if (sProps[propName].CanRead) - { - object val = sProps[propName].GetValue(so, null); - if (dProps[propName] != null) - { - if (val != null && dProps[propName].CanWrite) - { - dProps[propName].SetValue(dobj, val, null); - } - } - } - } - } - return dobj; - } - - private static Hashtable typeProperties = new Hashtable(); - - public static Hashtable GetObjectProperties(object obj, bool persistentOnly) - { - Hashtable hash = new Hashtable(); - - Type type = obj.GetType(); - PropertyInfo[] props = type.GetProperties(BindingFlags.Instance - | BindingFlags.Public); - foreach (PropertyInfo prop in props) - { - // check for persistent attribute - object[] attrs = prop.GetCustomAttributes(typeof(PersistentAttribute), false); - if (!persistentOnly || (persistentOnly && attrs.Length > 0)) - { - object val = prop.GetValue(obj, null); - string s = ""; - if (val != null) - { - if (prop.PropertyType == typeof(string[])) - s = String.Join(";", (string[])val); - else if (prop.PropertyType == typeof(int[])) - { - int[] ivals = (int[])val; - string[] svals = new string[ivals.Length]; - for (int i = 0; i < svals.Length; i++) - svals[i] = ivals[i].ToString(); - s = String.Join(";", svals); - } - else - s = val.ToString(); - } - - // add property to hash - hash.Add(prop.Name, s); - } - } - - return hash; - } - - public static void FillCollectionFromDataSet(List list, DataSet ds) - { - if(ds.Tables.Count == 0) - return; - - FillCollectionFromDataView(list, ds.Tables[0].DefaultView); - } - - public static void FillCollectionFromDataView(List list, DataView dv) - { - Type type = typeof(T); - - PropertyInfo[] props = GetTypeProperties(type); - - foreach(DataRowView dr in dv) - { - // create an instance - T obj = (T)Activator.CreateInstance(type); - list.Add(obj); - - // fill properties - for(int i = 0; i < props.Length; i++) - { - string propName = props[i].Name; - if(dv.Table.Columns[propName] == null) - continue; - - object propVal = dr[propName]; - if(propVal == DBNull.Value) - props[i].SetValue(obj, GetNull(props[i].PropertyType), null); - else - { - try - { - // try implicit type conversion - props[i].SetValue(obj, propVal, null); - } - catch - { - // convert to string and then set property value - try - { - string strVal = propVal.ToString(); - props[i].SetValue(obj, Cast(strVal, props[i].PropertyType), null); - } - catch - { - // skip property init - } - } - } - } // for properties - } // for rows - } - - public static List CreateListFromDataReader(IDataReader reader) - { - List list = new List(); - FillCollectionFromDataReader(list, reader); - return list; - } - - public static List CreateListFromDataSet(DataSet ds) - { - List list = new List(); - FillCollectionFromDataSet(list, ds); - return list; - } - - public static void FillCollectionFromDataReader(List list, IDataReader reader) - { - Type type = typeof(T); - - try - { - // get type properties - PropertyInfo[] props = GetTypeProperties(type); - - // iterate through reader - while(reader.Read()) - { - T obj = (T)Activator.CreateInstance(type); - list.Add(obj); - - // set properties - for(int i = 0; i < props.Length; i++) - { - string propName = props[i].Name; - - try - { - - object propVal = reader[propName]; - if(propVal == DBNull.Value) - props[i].SetValue(obj, GetNull(props[i].PropertyType), null); - else - { - try - { - // try implicit type conversion - props[i].SetValue(obj, propVal, null); - } - catch - { - // convert to string and then set property value - try - { - string strVal = propVal.ToString(); - props[i].SetValue(obj, Cast(strVal, props[i].PropertyType), null); - } - catch - { - // skip property init - } - } - } - } - catch{} // just skip - } // for properties - } - } - finally - { - reader.Close(); - } - } - - public static T FillObjectFromDataView(DataView dv) - { - Type type = typeof(T); - T obj = default(T); - - // get type properties - PropertyInfo[] props = GetTypeProperties(type); - - // iterate through reader - foreach(DataRowView dr in dv) - { - obj = (T)Activator.CreateInstance(type); - - // set properties - for(int i = 0; i < props.Length; i++) - { - string propName = props[i].Name; - - try - { - // verify if there is such a column - if (!dr.Row.Table.Columns.Contains(propName.ToLower())) - { - // if not, we move to another property - // because this one we cannot set - continue; - } - - object propVal = dr[propName]; - if(propVal == DBNull.Value) - props[i].SetValue(obj, GetNull(props[i].PropertyType), null); - else - { - try - { - string strVal = propVal.ToString(); - - //convert to DateTime - if (props[i].PropertyType.UnderlyingSystemType.FullName == typeof(DateTime).FullName) - { - DateTime date = DateTime.MinValue; - if (DateTime.TryParse(strVal, out date)) - { - props[i].SetValue(obj, date, null); - } - } - else - { - //Convert generic - props[i].SetValue(obj, Cast(strVal, props[i].PropertyType), null); - } - } - catch - { - // skip property init - } - } - } - catch{} // just skip - } // for properties - } - - return obj; - } - - public static T FillObjectFromDataReader(IDataReader reader) - { - Type type = typeof(T); - - T obj = default(T); - - try - { - // get type properties - PropertyInfo[] props = GetTypeProperties(type); - - // iterate through reader - while(reader.Read()) - { - obj = (T)Activator.CreateInstance(type); - - // set properties - for(int i = 0; i < props.Length; i++) - { - string propName = props[i].Name; - - try - { - if (!IsColumnExists(propName, reader.GetSchemaTable())) - { - continue; - } - object propVal = reader[propName]; - - if(propVal == DBNull.Value) - props[i].SetValue(obj, GetNull(props[i].PropertyType), null); - else - { - try - { - //try string first - if (props[i].PropertyType.UnderlyingSystemType.FullName == typeof(String).FullName) - { - props[i].SetValue(obj, propVal.ToString(), null); - } - else - { - // then, try implicit type conversion - props[i].SetValue(obj, propVal, null); - } - } - catch - { - // convert to string and then set property value - try - { - string strVal = propVal.ToString(); - props[i].SetValue(obj, Cast(strVal, props[i].PropertyType), null); - } - catch - { - // skip property init - } - } - } - } - catch{} // just skip - } // for properties - } - } - finally - { - reader.Close(); - } - - return obj; - } - - private static Hashtable propertiesCache = new Hashtable(); - - public static object CreateObjectFromDataview(Type type, DataView dv, - string nameColumn, string valueColumn, bool persistentOnly) - { - // create hash of properties from datareader - Hashtable propValues = new Hashtable(); - foreach (DataRowView dr in dv) - { - if (propValues[dr[nameColumn]] == null && !propValues.ContainsKey(dr[nameColumn])) - propValues.Add(dr[nameColumn], dr[valueColumn]); - } - - return CreateObjectFromHash(type, propValues, persistentOnly); - } - - public static object CreateObjectFromDataReader(Type type, IDataReader reader, - string nameColumn, string valueColumn, bool persistentOnly) - { - // create hash of properties from datareader - Hashtable propValues = new Hashtable(); - while (reader.Read()) - { - if (propValues[reader[nameColumn]] == null) - propValues.Add(reader[nameColumn], reader[valueColumn]); - } - reader.Close(); - - return CreateObjectFromHash(type, propValues, persistentOnly); - } - - public static object CreateObjectFromHash(Type type, Hashtable propValues, bool persistentOnly) - { - // create object - object obj = Activator.CreateInstance(type); - - CreateObjectFromHash(obj, propValues, persistentOnly); - - return obj; - } - - public static void CopyPersistentPropertiesFromSource(T source, T target) - where T : ServiceProviderItem - { - // - var typeSource = source.GetType(); - var typeTarget = target.GetType(); - // get all property infos - Hashtable props = null; - if (propertiesCache[typeSource.Name] != null) - { - // load properties from cache - props = (Hashtable)propertiesCache[typeSource.Name]; - } - else - { - // create properties cache - props = new Hashtable(); - // - PropertyInfo[] objProps = typeSource.GetProperties(BindingFlags.Instance - //| BindingFlags.DeclaredOnly - | BindingFlags.Public); - foreach (PropertyInfo prop in objProps) - { - // check for persistent attribute - object[] attrs = prop.GetCustomAttributes(typeof(PersistentAttribute), false); - // Persistent only - if (attrs.Length > 0) - { - // add property to hash - props.Add(prop.Name, prop); - } - } - // add to cache - propertiesCache.Add(typeSource.Name, props); - } - - // Copy the data - foreach (PropertyInfo propertyInfo in props.Values) - { - propertyInfo.SetValue(target, propertyInfo.GetValue(source, null), null); - } - } - - public static void CreateObjectFromHash(object obj, Hashtable propValues, bool persistentOnly) - { - Type type = obj.GetType(); - - // get all property infos - Hashtable props = null; - if (propertiesCache[type.Name] != null) - { - // load properties from cache - props = (Hashtable)propertiesCache[type.Name]; - } - else - { - // create properties cache - props = new Hashtable(); - PropertyInfo[] objProps = type.GetProperties(BindingFlags.Instance - //| BindingFlags.DeclaredOnly - | BindingFlags.Public); - foreach (PropertyInfo prop in objProps) - { - // check for persistent attribute - object[] attrs = prop.GetCustomAttributes(typeof(PersistentAttribute), false); - if (!persistentOnly || (persistentOnly && attrs.Length > 0) && !props.ContainsKey(prop.Name)) - { - // add property to hash - props.Add(prop.Name, prop); - } - } - - // add to cache - propertiesCache.Add(type.Name, props); - } - - // fill properties - foreach (string propName in propValues.Keys) - { - // try to locate specified property - if (props[propName] != null) - { - // set property - // we support: - // String - // Int32 - // Boolean - // Float - PropertyInfo prop = (PropertyInfo)props[propName]; - string val = propValues[propName].ToString(); - if (prop.PropertyType == typeof(String)) - prop.SetValue(obj, val, null); - else if (prop.PropertyType == typeof(Int32)) - prop.SetValue(obj, Int32.Parse(val), null); - else - if (prop.PropertyType == typeof(long)) - prop.SetValue(obj, long.Parse(val), null); - else - if (prop.PropertyType == typeof(Boolean)) - prop.SetValue(obj, Boolean.Parse(val), null); - else if (prop.PropertyType == typeof(Single)) - prop.SetValue(obj, Single.Parse(val), null); - else if (prop.PropertyType.IsEnum) - prop.SetValue(obj, Enum.Parse(prop.PropertyType, val, true), null); - else - if (prop.PropertyType == typeof(Guid)) - prop.SetValue(obj, new Guid(val), null); - else - if (prop.PropertyType == typeof(string[])) - { - if (val == "") - prop.SetValue(obj, new string[0], null); - else - prop.SetValue(obj, val.Split(';'), null); - } - else if (prop.PropertyType == typeof(int[])) - { - string[] svals = val.Split(';'); - int[] ivals = new int[svals.Length]; - - for (int i = 0; i < svals.Length; i++) - ivals[i] = Int32.Parse(svals[i]); - - if (val == "") - ivals = new int[0]; - - prop.SetValue(obj, ivals, null); - } - } - } - } - - private static Dictionary GetTypePropertiesHash(Type type) - { - Dictionary hash = new Dictionary(); - PropertyInfo[] props = GetTypeProperties(type); - foreach (PropertyInfo prop in props) - hash.Add(prop.Name, prop); - return hash; - } - - private static PropertyInfo[] GetTypeProperties(Type type) - { - string typeName = type.AssemblyQualifiedName; - if(typeProperties[typeName] != null) - return (PropertyInfo[])typeProperties[typeName]; - - PropertyInfo[] props = type.GetProperties(BindingFlags.Instance | BindingFlags.Public); - typeProperties[typeName] = props; - return props; - } - - public static object GetNull(Type type) - { - if(type == typeof(string)) - return null; - if(type == typeof(Int32)) - return 0; - if(type == typeof(Int64)) - return 0; - if(type == typeof(Boolean)) - return false; - if(type == typeof(Decimal)) - return 0M; - else - return null; - } - - public static object Cast(string val, Type type) - { - if(type == typeof(string)) - return val; - if(type == typeof(Int32)) - return Int32.Parse(val); - if(type == typeof(Int64)) - return Int64.Parse(val); - if(type == typeof(Boolean)) - return Boolean.Parse(val); - if(type == typeof(Decimal)) - return Decimal.Parse(val); - if(type == typeof(string[]) && val != null) - { - return val.Split(';'); - } - if (type.IsEnum) - return Enum.Parse(type, val, true); - - if (type == typeof(int[]) && val != null) - { - string[] sarr = val.Split(';'); - int[] iarr = new int[sarr.Length]; - for (int i = 0; i < sarr.Length; i++) - iarr[i] = Int32.Parse(sarr[i]); - return iarr; - } - else - return val; - } - - public static string GetTypeFullName(Type type) - { - return type.FullName + ", " + type.Assembly.GetName().Name; - } - - - #region Helper Functions - - /// - /// This function is used to determine whether IDataReader contains a Column. - /// - /// Name of the column. - /// The schema that decribes result-set contains. - /// True, when required column exists in the . Otherwise, false. - /// - /// The followin example shows how to look for the "Role" column in the . - /// - /// IDataReader reader = .... - /// if (!IsColumnExists("Role", reader.GetSchemaTable()) - /// { - /// continue; - /// } - /// - /// object roleValue = reader["Role"]; - /// - /// - static bool IsColumnExists(string columnName, DataTable schemaTable) - { - foreach (DataRow row in schemaTable.Rows) - { - if (String.Compare(row[0].ToString(), columnName, StringComparison.OrdinalIgnoreCase) == 0) - { - return true; - } - } - - return false; - } - - #endregion - } -} diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Tasks/TaskManager.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Tasks/TaskManager.cs deleted file mode 100644 index f69cb478..00000000 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Tasks/TaskManager.cs +++ /dev/null @@ -1,649 +0,0 @@ -// Copyright (c) 2012, Outercurve Foundation. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without modification, -// are permitted provided that the following conditions are met: -// -// - Redistributions of source code must retain the above copyright notice, this -// list of conditions and the following disclaimer. -// -// - Redistributions in binary form must reproduce the above copyright notice, -// this list of conditions and the following disclaimer in the documentation -// and/or other materials provided with the distribution. -// -// - Neither the name of the Outercurve Foundation nor the names of its -// contributors may be used to endorse or promote products derived from this -// software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR -// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -using System; -using System.IO; -using System.Threading; -using System.Collections; -using System.Collections.Generic; -using System.Text; -using System.Web; -using System.Web.Caching; -using System.Xml; -using System.Reflection; -using WebsitePanel.Providers.Common; - -namespace WebsitePanel.EnterpriseServer -{ - public class TaskManager - { - private static Hashtable tasks = Hashtable.Synchronized(new Hashtable()); - private static Hashtable eventHandlers = null; - - // purge timer, used for killing old tasks from the hash - static Timer purgeTimer = new Timer(new TimerCallback(PurgeCompletedTasks), - null, - 60000, // start from 1 minute - 60000); // invoke each minute - - private static BackgroundTask RootTask - { - get { return TasksStack.Count > 0 ? TasksStack[0] : null; } - } - - private static BackgroundTask TopTask - { - get { return TasksStack.Count > 0 ? TasksStack[TasksStack.Count - 1] : null; } - } - - private static List TasksStack - { - get - { - List stack = (List)Thread.GetData(Thread.GetNamedDataSlot("BackgroundTasksStack")); - if (stack == null) - { - stack = new List(); - Thread.SetData(Thread.GetNamedDataSlot("BackgroundTasksStack"), stack); - } - return stack; - } - } - - public static void StartTask(string source, string taskName) - { - StartTask(null, source, taskName, null); - } - - public static void StartTask(string source, string taskName, object itemName) - { - StartTask(null, source, taskName, itemName); - } - - public static void StartTask(string taskId, string source, string taskName, object itemName) - { - // create new task object - BackgroundTask task = new BackgroundTask(); - task.TaskId = String.IsNullOrEmpty(taskId) ? Guid.NewGuid().ToString("N") : taskId; - task.UserId = SecurityContext.User.UserId; - task.EffectiveUserId = SecurityContext.User.IsPeer ? SecurityContext.User.OwnerId : task.UserId; - task.StartDate = DateTime.Now; - task.Source = source; - task.TaskName = taskName; - task.ItemName = itemName != null ? itemName.ToString() : ""; - task.Severity = 0; //info - task.TaskThread = Thread.CurrentThread; - - // new "parent" task? - if (TasksStack.Count == 0) - { - // register task globally - tasks[task.TaskId] = task; - } - else - { - // child task - // add log record to the root task - BackgroundTaskLogRecord logRecord = new BackgroundTaskLogRecord(); - logRecord.InnerTaskStart = true; - logRecord.Text = source + "_" + taskName; - logRecord.TextParameters = new string[] { itemName != null ? itemName.ToString() : "" }; - logRecord.TextIdent = TasksStack.Count - 1; - RootTask.LogRecords.Add(logRecord); - - // change log records destination - // for nested task - task.LogRecords = RootTask.LogRecords; - } - - // call event handler - CallTaskEventHandler(task, false); - - // push task on the stack - TasksStack.Add(task); - } - - public static void WriteParameter(string parameterName, object parameterValue) - { - string val = parameterValue != null ? parameterValue.ToString() : ""; - WriteLogRecord(0, parameterName + ": " + val, null, null); - } - - public static void Write(string text, params string[] textParameters) - { - // INFO - WriteLogRecord(0, text, null, textParameters); - } - - public static void WriteWarning(string text, params string[] textParameters) - { - // WARNING - WriteLogRecord(1, text, null, textParameters); - } - - public static Exception WriteError(Exception ex) - { - // ERROR - WriteLogRecord(2, ex.Message, ex.StackTrace); - return new Exception((TopTask != null) ? String.Format("Error executing '{0}' task on '{1}' {2}", - TopTask.TaskName, TopTask.ItemName, TopTask.Source) : String.Format("Error executing task"), ex); - } - - public static void WriteError(Exception ex, string text, params string[] textParameters) - { - // ERROR - string[] prms = new string[] { ex.Message }; - if (textParameters != null && textParameters.Length > 0) - { - prms = new string[textParameters.Length + 1]; - Array.Copy(textParameters, 0, prms, 1, textParameters.Length); - prms[0] = ex.Message; - } - - WriteLogRecord(2, text, ex.Message + "\n" + ex.StackTrace, prms); - } - - public static void WriteError(string text, params string[] textParameters) - { - // ERROR - WriteLogRecord(2, text, null, textParameters); - } - - private static void WriteLogRecord(int severity, string text, string stackTrace, params string[] textParameters) - { - BackgroundTaskLogRecord logRecord = new BackgroundTaskLogRecord(); - logRecord.Severity = severity; - logRecord.Text = text; - logRecord.TextParameters = textParameters; - logRecord.TextIdent = TasksStack.Count - 1; - logRecord.ExceptionStackTrace = stackTrace; - if (RootTask != null) - { - RootTask.LogRecords.Add(logRecord); - RootTask.LastLogRecord = logRecord; - - // change entire task severity - if (severity > RootTask.Severity) - RootTask.Severity = severity; - } - } - - public static void CompleteTask() - { - if (TasksStack.Count == 0) - return; - - // call event handler - CallTaskEventHandler(TopTask, true); - - // finish task - TopTask.FinishDate = DateTime.Now; - TopTask.Completed = true; - - // write task execution result to database - if (TasksStack.Count == 1) // single task - { - // unregister task globally - // tasks.Remove(TopTask.TaskId); - - // write to database - string itemName = TopTask.ItemName != null ? TopTask.ItemName.ToString() : null; - string executionLog = FormatExecutionLog(TopTask); - UserInfo user = UserController.GetUserInternally(TopTask.UserId); - string username = user != null ? user.Username : null; - - AuditLog.AddAuditLogRecord(TopTask.TaskId, TopTask.Severity, TopTask.UserId, - username, TopTask.PackageId, TopTask.ItemId, - itemName, TopTask.StartDate, TopTask.FinishDate, TopTask.Source, - TopTask.TaskName, executionLog); - } - - // remove task from the stack - TasksStack.RemoveAt(TasksStack.Count - 1); - } - - static string FormatExecutionLog(BackgroundTask task) - { - StringWriter sw = new StringWriter(); - XmlWriter writer = new XmlTextWriter(sw); - - writer.WriteStartElement("log"); - - // parameters - writer.WriteStartElement("parameters"); - foreach (string name in task.Parameters.Keys) - { - string val = task.Parameters[name] != null ? task.Parameters[name].ToString() : ""; - writer.WriteStartElement("parameter"); - writer.WriteAttributeString("name", name); - writer.WriteString(val); - writer.WriteEndElement(); - } - writer.WriteEndElement(); // parameters - - // records - writer.WriteStartElement("records"); - foreach (BackgroundTaskLogRecord record in task.LogRecords) - { - writer.WriteStartElement("record"); - writer.WriteAttributeString("severity", record.Severity.ToString()); - writer.WriteAttributeString("date", record.Date.ToString(System.Globalization.CultureInfo.InvariantCulture)); - writer.WriteAttributeString("ident", record.TextIdent.ToString()); - - // text - writer.WriteElementString("text", record.Text); - - // text parameters - if (record.TextParameters != null && record.TextParameters.Length > 0) - { - writer.WriteStartElement("textParameters"); - foreach (string prm in record.TextParameters) - { - writer.WriteElementString("value", prm); - } - writer.WriteEndElement(); // textParameters - } - - // stack trace - writer.WriteElementString("stackTrace", record.ExceptionStackTrace); - writer.WriteEndElement(); - } - writer.WriteEndElement(); - writer.WriteEndElement(); - - return sw.ToString(); - } - - static void PurgeCompletedTasks(object obj) - { - // remove completed tasks - List completedTasks = new List(); - foreach (BackgroundTask task in tasks.Values) - { - if (task.MaximumExecutionTime != -1 - && ((TimeSpan)(DateTime.Now - task.StartDate)).TotalSeconds > task.MaximumExecutionTime) - { - // terminate task - try - { - task.TaskThread.Abort(); - } - catch - { - // nope - } - - // add to the list - completedTasks.Add(task.TaskId); - } - - if ((task.FinishDate != DateTime.MinValue - && ((TimeSpan)(DateTime.Now - task.FinishDate)).TotalMinutes > 2)) - { - // add to the list - completedTasks.Add(task.TaskId); - } - } - - // remove tasks - foreach (string taskId in completedTasks) - tasks.Remove(taskId); - } - - public static int PackageId - { - get { return TopTask.PackageId; } - set { TopTask.PackageId = value; } - } - - public static int ItemId - { - get { return TopTask.ItemId; } - set { TopTask.ItemId = value; } - } - - public static string ItemName - { - get { return TopTask.ItemName; } - set { TopTask.ItemName = value; } - } - - public static string TaskName - { - get { return TopTask.TaskName; } - } - - public static string TaskSource - { - get { return TopTask.Source; } - } - - public static int IndicatorMaximum - { - get { return TopTask.IndicatorMaximum; } - set { TopTask.IndicatorMaximum = value; } - } - - public static int IndicatorCurrent - { - get { return TopTask.IndicatorCurrent; } - set { TopTask.IndicatorCurrent = value; } - } - - public static int MaximumExecutionTime - { - get { return TopTask.MaximumExecutionTime; } - set { TopTask.MaximumExecutionTime = value; } - } - - public static int ScheduleId - { - get { return TopTask.ScheduleId; } - set { TopTask.ScheduleId = value; } - } - - public static bool HasErrors - { - get { return (TopTask.Severity == 2); } - } - - public static BackgroundTask GetTask(string taskId) - { - BackgroundTask task = (BackgroundTask)tasks[taskId]; - if (task == null) - return null; - - task.LastLogRecords.Clear(); - return task; - } - - public static BackgroundTask GetTaskWithLogRecords(string taskId, DateTime startLogTime) - { - BackgroundTask task = GetTask(taskId); - if (task == null) - return null; - - // fill log records - foreach (BackgroundTaskLogRecord record in task.LogRecords) - { - if (record.Date >= startLogTime) - task.LastLogRecords.Add(record); - } - - return task; - } - - public static Dictionary GetScheduledTasks() - { - Dictionary scheduledTasks = new Dictionary(); - try - { - foreach (BackgroundTask task in tasks.Values) - { - if (task.ScheduleId > 0 - && !task.Completed - && !scheduledTasks.ContainsKey(task.ScheduleId)) - scheduledTasks.Add(task.ScheduleId, task); - } - } - catch (Exception) - { - } - return scheduledTasks; - } - - public static void SetTaskNotifyOnComplete(string taskId) - { - BackgroundTask task = (BackgroundTask)tasks[taskId]; - if (task == null) - return; - - task.NotifyOnComplete = true; - } - - public static void StopTask(string taskId) - { - BackgroundTask task = (BackgroundTask)tasks[taskId]; - if (task == null) - return; - - try - { - task.TaskThread.Abort(); - } - catch - { - // nope - } - - // remove it from stack - tasks.Remove(taskId); - } - - public static Hashtable TaskParameters - { - get { return TopTask.Parameters; } - } - - internal static int GetTasksNumber() - { - return tasks.Count; - } - - internal static List GetUserTasks(int userId) - { - List list = new List(); - - // try to get user first - UserInfo user = UserController.GetUser(userId); - if (user == null) - return list; // prohibited user - - // get user tasks - foreach (BackgroundTask task in tasks.Values) - { - if(task.EffectiveUserId == userId && !task.Completed) - list.Add(task); - } - return list; - } - - internal static List GetUserCompletedTasks(int userId) - { - // get user tasks - List list = GetUserTasks(userId); - - // extract completed only - List completedTasks = new List(); - foreach (BackgroundTask task in list) - { - if (task.Completed && task.NotifyOnComplete) - { - // add to the list - completedTasks.Add(task); - - // remove from hash - tasks.Remove(task.TaskId); - } - } - return completedTasks; - } - - #region Private Helpers - private static void CallTaskEventHandler(BackgroundTask task, bool onComplete) - { - string[] taskHandlers = GetTaskEventHandlers(task.Source, task.TaskName); - if (taskHandlers != null) - { - foreach(string taskHandler in taskHandlers) - { - try - { - Type handlerType = Type.GetType(taskHandler); - TaskEventHandler handler = (TaskEventHandler)Activator.CreateInstance(handlerType); - - if (handler != null) - { - if (onComplete) - handler.OnComplete(); - else - handler.OnStart(); - } - } - catch (Exception ex) - { - WriteError(ex, "Error executing task event handler: {0}", ex.Message); - } - } - } - } - - private static string[] GetTaskEventHandlers(string source, string taskName) - { - // load configuration - string appRoot = AppDomain.CurrentDomain.BaseDirectory; - string path = Path.Combine(appRoot, "TaskEventHandlers.config"); - - if (eventHandlers == null) - { - eventHandlers = Hashtable.Synchronized(new Hashtable()); - - // load from XML - if (File.Exists(path)) - { - List xmlConfigs = new List(); - xmlConfigs.Add(new XmlDocument()); - xmlConfigs[0].Load(path); - // Lookup for external references first - XmlNodeList xmlReferences = xmlConfigs[0].SelectNodes("//reference"); - foreach (XmlElement xmlReference in xmlReferences) - { - string referencePath = Path.Combine(appRoot, xmlReference.GetAttribute("src")); - if (File.Exists(referencePath)) - { - XmlDocument xmldoc = new XmlDocument(); - xmldoc.Load(referencePath); - xmlConfigs.Add(xmldoc); - } - } - - // parse XML - foreach (XmlDocument xml in xmlConfigs) - { - XmlNodeList xmlHandlers = xml.SelectNodes("//handler"); - foreach (XmlNode xmlHandler in xmlHandlers) - { - string keyName = xmlHandler.ParentNode.Attributes["source"].Value - + xmlHandler.ParentNode.Attributes["name"].Value; - - // get handlers collection - List taskHandlers = (List)eventHandlers[keyName]; - if (taskHandlers == null) - { - taskHandlers = new List(); - eventHandlers[keyName] = taskHandlers; - } - - string handlerType = xmlHandler.Attributes["type"].Value; - taskHandlers.Add(handlerType); - } - } - } - } - - string fullTaskName = source + taskName; - List handlersList = (List)eventHandlers[fullTaskName]; - return handlersList == null ? null : handlersList.ToArray(); - } - #endregion - - - #region ResultTasks - - public static void CompleteResultTask(ResultObject res, string errorCode, Exception ex, string errorMessage) - { - if (res != null) - { - res.IsSuccess = false; - - if (!string.IsNullOrEmpty(errorCode)) - res.ErrorCodes.Add(errorCode); - } - - if (ex != null) - TaskManager.WriteError(ex); - - if (!string.IsNullOrEmpty(errorMessage)) - TaskManager.WriteError(errorMessage); - - //LogRecord. - CompleteTask(); - - - } - - public static void CompleteResultTask(ResultObject res, string errorCode, Exception ex) - { - CompleteResultTask(res, errorCode, ex, null); - } - - public static void CompleteResultTask(ResultObject res, string errorCode) - { - CompleteResultTask(res, errorCode, null, null); - } - - public static void CompleteResultTask(ResultObject res) - { - CompleteResultTask(res, null); - } - - public static void CompleteResultTask() - { - CompleteResultTask(null); - } - - public static T StartResultTask(string source, string taskName, Guid taskId) where T : ResultObject, new() - { - StartTask(taskId.ToString(), source, taskName, null); - T res = new T(); - res.IsSuccess = true; - return res; - } - - public static T StartResultTask(string source, string taskName) where T : ResultObject, new() - { - StartTask(source, taskName); - T res = new T(); - res.IsSuccess = true; - return res; - } - - - #endregion - } -} diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Global.asax.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Global.asax.cs index 64282fa2..f864aaf3 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Global.asax.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Global.asax.cs @@ -46,12 +46,6 @@ namespace WebsitePanel.EnterpriseServer protected void Application_Start(object sender, EventArgs e) { - if (ConfigurationManager.AppSettings["WebsitePanel.DistableScheduler"] != null) - if (Boolean.Parse(ConfigurationManager.AppSettings["WebsitePanel.DistableScheduler"]) == false) - { - if (Scheduler.nextSchedule == null) - Scheduler.Start(); - } } protected void Application_End(object sender, EventArgs e) diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Web.config b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Web.config index d5f08cc5..7a73a914 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Web.config +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Web.config @@ -5,7 +5,7 @@ - + @@ -50,7 +50,7 @@ - + diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/WebsitePanel.EnterpriseServer.csproj b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/WebsitePanel.EnterpriseServer.csproj index 98a5db62..605e542d 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/WebsitePanel.EnterpriseServer.csproj +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/WebsitePanel.EnterpriseServer.csproj @@ -47,14 +47,8 @@ 618 - - False - ..\..\Lib\Ionic.Zip.Reduced.dll - - - False - ..\..\Lib\Microsoft.Web.Services3.dll - True + + ..\..\Bin\Microsoft.Web.Services3.dll @@ -73,8 +67,13 @@ - - False + + ..\..\Bin\WebsitePanel.EnterpriseServer.Base.dll + + + ..\..\Bin\WebsitePanel.EnterpriseServer.Code.dll + + ..\..\Bin\WebsitePanel.Providers.Base.dll @@ -122,131 +121,6 @@ VersionInfo.cs - - - - - - - Code - - - - - - - - - - - - - - - - - - - - - - Code - - - - - - - - - Code - - - - - - - Code - - - Code - - - - - - - - - - - - - - - - - - - - - - - Code - - - - Code - - - Code - - - - Code - - - - - Code - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - esHeliconZoo.asmx Component @@ -395,24 +269,6 @@ - - - {53D22D35-4013-415F-BA09-F67A0DBBB0C1} - WebsitePanel.Common.Utils - - - {C09CE910-F16B-48A1-B2CC-C99B8C1CF775} - WebsitePanel.EnterpriseServer.Base - - - {387FA0EF-3927-45FF-8F8F-BCCD735540C6} - WebsitePanel.Templates - - - {7112B144-C5EE-43C2-9441-569D75D13CB9} - WebsitePanel.Whois - - @@ -424,7 +280,6 @@ - 10.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/WsePolicyCache.Config b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/WsePolicyCache.Config index 9e3b5477..a57b49a4 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/WsePolicyCache.Config +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/WsePolicyCache.Config @@ -1,6 +1,6 @@ - + diff --git a/WebsitePanel/Sources/WebsitePanel.SchedulerService/Program.cs b/WebsitePanel/Sources/WebsitePanel.SchedulerService/Program.cs new file mode 100644 index 00000000..7c991ea1 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.SchedulerService/Program.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.ServiceProcess; +using System.Text; + +namespace WebsitePanel.SchedulerService +{ + static class Program + { + /// + /// The main entry point for the application. + /// + static void Main() + { + ServiceBase[] ServicesToRun; + ServicesToRun = new ServiceBase[] + { + new SchedulerService() + }; + ServiceBase.Run(ServicesToRun); + } + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.SchedulerService/Properties/AssemblyInfo.cs b/WebsitePanel/Sources/WebsitePanel.SchedulerService/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..7f591157 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.SchedulerService/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("WebsitePanel.SchedulerService")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("OM-3")] +[assembly: AssemblyProduct("WebsitePanel.SchedulerService")] +[assembly: AssemblyCopyright("Copyright © OM-3 2013")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("f552691a-f316-4030-aa74-25cb23ad1791")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/WebsitePanel/Sources/WebsitePanel.SchedulerService/SchedulerService.Designer.cs b/WebsitePanel/Sources/WebsitePanel.SchedulerService/SchedulerService.Designer.cs new file mode 100644 index 00000000..edc238f6 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.SchedulerService/SchedulerService.Designer.cs @@ -0,0 +1,37 @@ +namespace WebsitePanel.SchedulerService +{ + partial class SchedulerService + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + components = new System.ComponentModel.Container(); + this.ServiceName = "WebsitePanel.SchedulerService"; + } + + #endregion + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.SchedulerService/SchedulerService.cs b/WebsitePanel/Sources/WebsitePanel.SchedulerService/SchedulerService.cs new file mode 100644 index 00000000..d5407d1c --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.SchedulerService/SchedulerService.cs @@ -0,0 +1,42 @@ +using System.ServiceProcess; +using System.Threading; +using WebsitePanel.EnterpriseServer; + +namespace WebsitePanel.SchedulerService +{ + public partial class SchedulerService : ServiceBase + { + private Timer _Timer; + private static bool _isRuninng; + #region Construcor + + public SchedulerService() + { + InitializeComponent(); + + _Timer = new Timer(Process, null, 5000, 5000); + _isRuninng = false; + } + + #endregion + + #region Methods + + protected override void OnStart(string[] args) + { + } + + protected static void Process(object callback) + { + //check running service + if (_isRuninng) + return; + + _isRuninng = true; + Scheduler.Start(); + _isRuninng = false; + } + + #endregion + } +} \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.SchedulerService/SchedulerServiceInstaller.cs b/WebsitePanel/Sources/WebsitePanel.SchedulerService/SchedulerServiceInstaller.cs new file mode 100644 index 00000000..3bbafcff --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.SchedulerService/SchedulerServiceInstaller.cs @@ -0,0 +1,28 @@ +using System.ComponentModel; +using System.Configuration.Install; +using System.ServiceProcess; + +namespace WebsitePanel.SchedulerService +{ + [RunInstaller(true)] + public class SchedulerServiceInstaller : Installer + { + #region Constructor + + public SchedulerServiceInstaller() + { + var processInstaller = new ServiceProcessInstaller(); + var serviceInstaller = new ServiceInstaller(); + + processInstaller.Account = ServiceAccount.LocalSystem; + serviceInstaller.DisplayName = "WebsitePanel Scheduler"; + serviceInstaller.StartType = ServiceStartMode.Automatic; + serviceInstaller.ServiceName = "WebsitePanel Scheduler"; + + Installers.Add(processInstaller); + Installers.Add(serviceInstaller); + } + + #endregion + } +} \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.SchedulerService/WebsitePanel.SchedulerService.csproj b/WebsitePanel/Sources/WebsitePanel.SchedulerService/WebsitePanel.SchedulerService.csproj new file mode 100644 index 00000000..a1501bfa --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.SchedulerService/WebsitePanel.SchedulerService.csproj @@ -0,0 +1,96 @@ + + + + Debug + x86 + 8.0.30703 + 2.0 + {5B823520-0450-44A9-AC86-9658B41DFA7C} + WinExe + Properties + WebsitePanel.SchedulerService + WebsitePanel.SchedulerService + v4.0 + + + 512 + + + x86 + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + x86 + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + true + bin\ + DEBUG;TRACE + full + AnyCPU + prompt + MinimumRecommendedRules.ruleset + + + bin\ + TRACE + true + pdbonly + AnyCPU + prompt + MinimumRecommendedRules.ruleset + + + + + + + + + + + + + + + + + Component + + + SchedulerService.cs + + + Component + + + + + {60E39314-659C-4FAD-AB91-D0D08E223578} + WebsitePanel.EnterpriseServer.Code + + + + + + + + \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.SchedulerService/app.config b/WebsitePanel/Sources/WebsitePanel.SchedulerService/app.config new file mode 100644 index 00000000..f4df3fb3 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.SchedulerService/app.config @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Schedules.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Schedules.ascx index 7e6c19f5..9c718a88 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Schedules.ascx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Schedules.ascx @@ -5,6 +5,8 @@ <%@ Register Src="UserControls/Quota.ascx" TagName="Quota" TagPrefix="uc4" %> <%@ Import Namespace="WebsitePanel.Portal" %> + +
@@ -15,6 +17,12 @@
+ + + + + + - \ No newline at end of file + + + + \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Schedules.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Schedules.ascx.designer.cs index 93e0d3c0..f7cffb9e 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Schedules.ascx.designer.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Schedules.ascx.designer.cs @@ -1,31 +1,3 @@ -// Copyright (c) 2012, Outercurve Foundation. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without modification, -// are permitted provided that the following conditions are met: -// -// - Redistributions of source code must retain the above copyright notice, this -// list of conditions and the following disclaimer. -// -// - Redistributions in binary form must reproduce the above copyright notice, -// this list of conditions and the following disclaimer in the documentation -// and/or other materials provided with the distribution. -// -// - Neither the name of the Outercurve Foundation nor the names of its -// contributors may be used to endorse or promote products derived from this -// software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR -// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - //------------------------------------------------------------------------------ // // This code was generated by a tool. @@ -40,6 +12,15 @@ namespace WebsitePanel.Portal { public partial class Schedules { + /// + /// tasksTimer control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.Timer tasksTimer; + /// /// btnAddItem control. /// @@ -67,6 +48,15 @@ namespace WebsitePanel.Portal { /// protected global::WebsitePanel.Portal.SearchBox searchBox; + /// + /// schedulesUpdatePanel control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.UpdatePanel schedulesUpdatePanel; + /// /// gvSchedules control. /// diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Scripts/AjaxUtils.js b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Scripts/AjaxUtils.js index f54b1aec..182477c9 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Scripts/AjaxUtils.js +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Scripts/AjaxUtils.js @@ -134,45 +134,47 @@ function ReloadProgressImage() function GetTaskProgress() { - requestSimpleService = WebsitePanel.Portal.TaskManager.GetTask( + requestSimpleService = WebsitePanel.Portal.TaskManager.GetTaskWithLogRecords( _taskId, //params + new Date(1, 2, 3, 4), OnGetTaskProgressComplete, //Complete event OnGetTaskProgressTimeout //Timeout event ); } -function OnGetTaskProgressComplete(task) +function OnGetTaskProgressComplete(task) { - if(task.LastLogRecord != null) - { - $get('objProgressDialogStep').innerHTML = task.LastLogRecord.Text; - } - - // set progress indicator - if(task.IndicatorMaximum > 0) - $get("objProgressDialogProgressBar").style.width = task.IndicatorCurrent / task.IndicatorMaximum * 100 + "%"; - - if(task.Completed) - { - // switch buttons + if (task == null || task.Completed) { + // switch buttons $get("objProgressDialogCommandButtons").style.display = "none"; $get("objProgressDialogCloseButton").style.display = "block"; - + // stop timer StopTimer(); - + // hide image indicator $get("imgAjaxIndicator").style.display = "none"; - + // show success message $get('objProgressDialogStep').innerHTML = _completeMessage; - } - else - { - $find('ModalPopupProperties')._layout(); - //alert(result); - window.setTimeout(GetTaskProgress, 1000); + + $get("objProgressDialogProgressBar").style.width = 100 + "%"; + + return; } + + if (task.Logs != null) { + $get('objProgressDialogStep').innerHTML = task.Logs.length > 0 ? task.Logs[task.Logs.length - 1].Text : ""; + } + + // set progress indicator + if (task.IndicatorMaximum > 0) + $get("objProgressDialogProgressBar").style.width = task.IndicatorCurrent / task.IndicatorMaximum * 100 + "%"; + + + $find('ModalPopupProperties')._layout(); + //alert(result); + window.setTimeout(GetTaskProgress, 1000); } function OnGetTaskProgressTimeout(result) diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Tasks.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Tasks.ascx.designer.cs index 4bc94460..b4454382 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Tasks.ascx.designer.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Tasks.ascx.designer.cs @@ -1,19 +1,51 @@ //------------------------------------------------------------------------------ // // This code was generated by a tool. -// Runtime Version:2.0.50727.42 // // Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. +// the code is regenerated. // //------------------------------------------------------------------------------ namespace WebsitePanel.Portal { + public partial class Tasks { - protected System.Web.UI.Timer tasksTimer; - protected System.Web.UI.UpdatePanel tasksUpdatePanel; - protected System.Web.UI.WebControls.GridView gvTasks; - protected System.Web.UI.WebControls.ObjectDataSource odsTasks; + + /// + /// tasksTimer control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.Timer tasksTimer; + + /// + /// tasksUpdatePanel control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.UpdatePanel tasksUpdatePanel; + + /// + /// gvTasks control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.GridView gvTasks; + + /// + /// odsTasks control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.ObjectDataSource odsTasks; } } diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/TasksTaskDetails.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/TasksTaskDetails.ascx.cs index 7f3ee84a..35287472 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/TasksTaskDetails.ascx.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/TasksTaskDetails.ascx.cs @@ -63,7 +63,7 @@ namespace WebsitePanel.Portal litTitle.Text = String.Format("{0} "{1}"", GetAuditLogTaskName(task.Source, task.TaskName), task.ItemName); - litStep.Text = LocalizeActivityText(task.LastLogRecord.Text); + litStep.Text = LocalizeActivityText(task.GetLogs().Count > 0 ? task.GetLogs()[0].Text : String.Empty); litStartTime.Text = task.StartDate.ToString(); // progress @@ -77,18 +77,19 @@ namespace WebsitePanel.Portal // execution log StringBuilder log = new StringBuilder(); - task.LastLogRecords.Reverse(); - if (task.LastLogRecords.Count > 0) - ViewState["lastLogDate"] = task.LastLogRecords[0].Date.AddTicks(1); + if (task.GetLogs().Count > 0) + ViewState["lastLogDate"] = task.GetLogs()[0].Date.AddTicks(1); - foreach (BackgroundTaskLogRecord logRecord in task.LastLogRecords) + + + foreach (BackgroundTaskLogRecord logRecord in task.GetLogs()) { log.Append("[").Append(GetDurationText(task.StartDate, logRecord.Date)).Append("] "); log.Append(GetLogLineIdent(logRecord.TextIdent)); log.Append(LocalizeActivityText(logRecord.Text)); log.Append("
"); } - litLog.Text = log.ToString() + litLog.Text; + litLog.Text = log.ToString();//+ litLog.Text; if(task.Completed) btnStop.Visible = false; diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS/UserControls/ServerTabs.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS/UserControls/ServerTabs.ascx.cs index 19e861d7..30b8f974 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS/UserControls/ServerTabs.ascx.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS/UserControls/ServerTabs.ascx.cs @@ -176,7 +176,7 @@ namespace WebsitePanel.Portal.VPS.UserControls litElapsed.Text = new TimeSpan(d.Hours, d.Minutes, d.Seconds).ToString(); // bind records - repRecords.DataSource = task.LastLogRecords; + repRecords.DataSource = task.GetLogs(); repRecords.DataBind(); } @@ -213,7 +213,7 @@ namespace WebsitePanel.Portal.VPS.UserControls // gauge gauge.Visible = false; - if (e.Item.ItemIndex == task.LastLogRecords.Count - 1) + if (e.Item.ItemIndex == task.GetLogs().Count - 1) { gauge.Visible = true; gauge.Total = task.IndicatorMaximum; diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPSForPC/UserControls/ServerTabs.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPSForPC/UserControls/ServerTabs.ascx.cs index 4b265375..14cc380e 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPSForPC/UserControls/ServerTabs.ascx.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPSForPC/UserControls/ServerTabs.ascx.cs @@ -183,7 +183,7 @@ namespace WebsitePanel.Portal.VPSForPC.UserControls litElapsed.Text = new TimeSpan(d.Hours, d.Minutes, d.Seconds).ToString(); // bind records - repRecords.DataSource = task.LastLogRecords; + repRecords.DataSource = task.GetLogs(); repRecords.DataBind(); } @@ -228,7 +228,7 @@ namespace WebsitePanel.Portal.VPSForPC.UserControls // gauge gauge.Visible = false; - if (e.Item.ItemIndex == task.LastLogRecords.Count - 1) + if (e.Item.ItemIndex == task.GetLogs().Count - 1) { gauge.Visible = true; gauge.Total = task.IndicatorMaximum; diff --git a/WebsitePanel/build.xml b/WebsitePanel/build.xml index 9178c818..82ecea07 100644 --- a/WebsitePanel/build.xml +++ b/WebsitePanel/build.xml @@ -29,20 +29,22 @@ $(TrunkFolder)\Sources\WebsitePanel.WebPortal $(TrunkFolder)\Sources\WebsitePanel.Server $(TrunkFolder)\Sources\WebsitePanel.EnterpriseServer + $(TrunkFolder)\Sources\WebsitePanel.SchedulerService $(TrunkFolder)\Sources\Tools\WebsitePanel.Import.CsvBulk\bin\$(BuildConfiguration) $(RootFolder)\WebsitePanel.HyperV.Utils\Sources\WebsitePanel.HyperV.Utils\bin\$(BuildConfiguration) - $(RootFolder)\WebsitePanel.VmConfig\Sources\WebsitePanel.VmConfig\bin\$(BuildConfiguration) - $(TrunkFolder)\Sources\Tools\WebsitePanel.Import.Enterprise\bin\$(BuildConfiguration) + $(RootFolder)\WebsitePanel.VmConfig\Sources\WebsitePanel.VmConfig\bin\$(BuildConfiguration) + $(TrunkFolder)\Sources\Tools\WebsitePanel.Import.Enterprise\bin\$(BuildConfiguration) $(TrunkFolder)\Sources\Tools\WebsitePanel.AWStats.Viewer $(TrunkFolder)\Sources\Tools\WSPTransportAgent $(BuildFolder)\Server $(BuildFolder)\EnterpriseServer + $(BuildFolder)\SchedulerService $(BuildFolder)\Portal $(BuildFolder)\Import.CsvBulk $(BuildFolder)\HyperVUtils $(BuildFolder)\VMConfig - $(BuildFolder)\Import.Enterprise + $(BuildFolder)\Import.Enterprise $(BuildFolder)\AWStats.Viewer $(BuildFolder)\WSPTransportAgent $(BuildFolder)\LocalizationToolkit @@ -58,11 +60,11 @@
- - - - http://www.websitepanel.net/files/$(Version)/WebsitePanelInstaller-$(Version)-webpi.msi - + + + + http://www.websitepanel.net/files/$(Version)/WebsitePanelInstaller-$(Version)-webpi.msi + @@ -84,17 +86,18 @@ - + + - - + + @@ -104,9 +107,10 @@ + - - + + @@ -160,7 +164,25 @@ - + + + + + + + + + + + + + + + + + + + @@ -179,7 +201,7 @@ - + @@ -303,6 +325,17 @@ TaskParameter="TargetOutputs" ItemName="WebsitePanelInstallerMsi" /> + + + + + + + + + @@ -315,14 +348,15 @@ $(DeployFolder)\Install $(InstallFolder)\Server $(InstallFolder)\EnterpriseServer + $(InstallFolder)\SchedulerServive $(InstallFolder)\Portal $(InstallFolder)\StandaloneServerSetup $(DeployFolder)\Tools $(ToolsFolder)\Import.CsvBulk - $(ToolsFolder)\HyperVUtils - $(ToolsFolder)\VMconfig + $(ToolsFolder)\HyperVUtils + $(ToolsFolder)\VMconfig $(ToolsFolder)\Import.Enterprise $(ToolsFolder)\AWStats.Viewer $(ToolsFolder)\WSPTransportAgent @@ -361,8 +395,8 @@ - - + +