Index: CCTrayExtensions/CCTrayExtensions.csproj =================================================================== --- CCTrayExtensions/CCTrayExtensions.csproj (revision 0) +++ CCTrayExtensions/CCTrayExtensions.csproj (revision 0) @@ -0,0 +1,94 @@ + + + + Debug + AnyCPU + 9.0.21022 + 2.0 + {A92A4CC1-836E-4BE2-8601-FF6B2497389B} + Library + Properties + ThoughtWorks.CruiseControl.CCTrayExtensions + CCTrayExtensions + v3.5 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + 3.5 + + + + 3.0 + + + 3.0 + + + + 3.5 + + + 3.5 + + + + + + + + + Form + + + WcfConfigurationWindow.cs + + + + + + + + + + {C8043AD9-0F30-4366-A263-E2FC0D6A57A9} + CCTrayLib + + + {E820CF3B-8C5A-4002-BC16-B7818D3D54A8} + Remote + + + + + WcfConfigurationWindow.cs + Designer + + + + + \ No newline at end of file Index: CCTrayExtensions/Properties/AssemblyInfo.cs =================================================================== --- CCTrayExtensions/Properties/AssemblyInfo.cs (revision 0) +++ CCTrayExtensions/Properties/AssemblyInfo.cs (revision 0) @@ -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("CCTrayExtensions")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("CCTrayExtensions")] +[assembly: AssemblyCopyright("Copyright © 2008")] +[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("17d3b77d-8e13-4500-89b2-7a08ea00ab27")] + +// 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")] Index: CCTrayExtensions/TransportBinding.cs =================================================================== --- CCTrayExtensions/TransportBinding.cs (revision 0) +++ CCTrayExtensions/TransportBinding.cs (revision 0) @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ThoughtWorks.CruiseControl.CCTrayExtensions +{ + public enum TransportBinding + { + BasicHttp, + WSHttp, + NetTcp, + NamedPipes, + } +} Index: CCTrayExtensions/WcfClient.cs =================================================================== --- CCTrayExtensions/WcfClient.cs (revision 0) +++ CCTrayExtensions/WcfClient.cs (revision 0) @@ -0,0 +1,1364 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50727.1434 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace ThoughtWorks.CruiseControl.WcfClient +{ + using System.Runtime.Serialization; + + + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "3.0.0.0")] + [System.Runtime.Serialization.DataContractAttribute(Name="Snapshot", Namespace="http://ccnet.thoughtworks.com/1/5/wcf")] + internal partial class Snapshot : object, System.Runtime.Serialization.IExtensibleDataObject + { + + private System.Runtime.Serialization.ExtensionDataObject extensionDataField; + + private ThoughtWorks.CruiseControl.WcfClient.Project[] ProjectsField; + + private ThoughtWorks.CruiseControl.WcfClient.Queue[] QueuesField; + + private string ServerVersionField; + + public System.Runtime.Serialization.ExtensionDataObject ExtensionData + { + get + { + return this.extensionDataField; + } + set + { + this.extensionDataField = value; + } + } + + [System.Runtime.Serialization.DataMemberAttribute()] + internal ThoughtWorks.CruiseControl.WcfClient.Project[] Projects + { + get + { + return this.ProjectsField; + } + set + { + this.ProjectsField = value; + } + } + + [System.Runtime.Serialization.DataMemberAttribute()] + internal ThoughtWorks.CruiseControl.WcfClient.Queue[] Queues + { + get + { + return this.QueuesField; + } + set + { + this.QueuesField = value; + } + } + + [System.Runtime.Serialization.DataMemberAttribute()] + internal string ServerVersion + { + get + { + return this.ServerVersionField; + } + set + { + this.ServerVersionField = value; + } + } + } + + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "3.0.0.0")] + [System.Runtime.Serialization.DataContractAttribute(Name="Project", Namespace="http://ccnet.thoughtworks.com/1/5/wcf")] + internal partial class Project : object, System.Runtime.Serialization.IExtensibleDataObject + { + + private System.Runtime.Serialization.ExtensionDataObject extensionDataField; + + private string ActivityField; + + private string BuildStageField; + + private string BuildStatusField; + + private string CategoryField; + + private string LastBuildLabelField; + + private System.DateTime LastBuildTimeField; + + private string LastSuccessfulBuildLabelField; + + private string NameField; + + private System.DateTime NextBuildTimeField; + + private string ProjectStatusField; + + private string WebUrlField; + + public System.Runtime.Serialization.ExtensionDataObject ExtensionData + { + get + { + return this.extensionDataField; + } + set + { + this.extensionDataField = value; + } + } + + [System.Runtime.Serialization.DataMemberAttribute()] + internal string Activity + { + get + { + return this.ActivityField; + } + set + { + this.ActivityField = value; + } + } + + [System.Runtime.Serialization.DataMemberAttribute()] + internal string BuildStage + { + get + { + return this.BuildStageField; + } + set + { + this.BuildStageField = value; + } + } + + [System.Runtime.Serialization.DataMemberAttribute()] + internal string BuildStatus + { + get + { + return this.BuildStatusField; + } + set + { + this.BuildStatusField = value; + } + } + + [System.Runtime.Serialization.DataMemberAttribute()] + internal string Category + { + get + { + return this.CategoryField; + } + set + { + this.CategoryField = value; + } + } + + [System.Runtime.Serialization.DataMemberAttribute()] + internal string LastBuildLabel + { + get + { + return this.LastBuildLabelField; + } + set + { + this.LastBuildLabelField = value; + } + } + + [System.Runtime.Serialization.DataMemberAttribute()] + internal System.DateTime LastBuildTime + { + get + { + return this.LastBuildTimeField; + } + set + { + this.LastBuildTimeField = value; + } + } + + [System.Runtime.Serialization.DataMemberAttribute()] + internal string LastSuccessfulBuildLabel + { + get + { + return this.LastSuccessfulBuildLabelField; + } + set + { + this.LastSuccessfulBuildLabelField = value; + } + } + + [System.Runtime.Serialization.DataMemberAttribute()] + internal string Name + { + get + { + return this.NameField; + } + set + { + this.NameField = value; + } + } + + [System.Runtime.Serialization.DataMemberAttribute()] + internal System.DateTime NextBuildTime + { + get + { + return this.NextBuildTimeField; + } + set + { + this.NextBuildTimeField = value; + } + } + + [System.Runtime.Serialization.DataMemberAttribute()] + internal string ProjectStatus + { + get + { + return this.ProjectStatusField; + } + set + { + this.ProjectStatusField = value; + } + } + + [System.Runtime.Serialization.DataMemberAttribute()] + internal string WebUrl + { + get + { + return this.WebUrlField; + } + set + { + this.WebUrlField = value; + } + } + } + + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "3.0.0.0")] + [System.Runtime.Serialization.DataContractAttribute(Name="Queue", Namespace="http://ccnet.thoughtworks.com/1/5/wcf")] + internal partial class Queue : object, System.Runtime.Serialization.IExtensibleDataObject + { + + private System.Runtime.Serialization.ExtensionDataObject extensionDataField; + + private string NameField; + + private ThoughtWorks.CruiseControl.WcfClient.QueueRequest[] RequestsField; + + public System.Runtime.Serialization.ExtensionDataObject ExtensionData + { + get + { + return this.extensionDataField; + } + set + { + this.extensionDataField = value; + } + } + + [System.Runtime.Serialization.DataMemberAttribute()] + internal string Name + { + get + { + return this.NameField; + } + set + { + this.NameField = value; + } + } + + [System.Runtime.Serialization.DataMemberAttribute()] + internal ThoughtWorks.CruiseControl.WcfClient.QueueRequest[] Requests + { + get + { + return this.RequestsField; + } + set + { + this.RequestsField = value; + } + } + } + + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "3.0.0.0")] + [System.Runtime.Serialization.DataContractAttribute(Name="QueueRequest", Namespace="http://ccnet.thoughtworks.com/1/5/wcf")] + internal partial class QueueRequest : object, System.Runtime.Serialization.IExtensibleDataObject + { + + private System.Runtime.Serialization.ExtensionDataObject extensionDataField; + + private string ActivityField; + + private string ProjectNameField; + + private System.DateTime RequestTimeField; + + public System.Runtime.Serialization.ExtensionDataObject ExtensionData + { + get + { + return this.extensionDataField; + } + set + { + this.extensionDataField = value; + } + } + + [System.Runtime.Serialization.DataMemberAttribute()] + internal string Activity + { + get + { + return this.ActivityField; + } + set + { + this.ActivityField = value; + } + } + + [System.Runtime.Serialization.DataMemberAttribute()] + internal string ProjectName + { + get + { + return this.ProjectNameField; + } + set + { + this.ProjectNameField = value; + } + } + + [System.Runtime.Serialization.DataMemberAttribute()] + internal System.DateTime RequestTime + { + get + { + return this.RequestTimeField; + } + set + { + this.RequestTimeField = value; + } + } + } + + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "3.0.0.0")] + [System.Runtime.Serialization.DataContractAttribute(Name="ServerFault", Namespace="http://ccnet.thoughtworks.com/1/5/wcf")] + internal partial class ServerFault : object, System.Runtime.Serialization.IExtensibleDataObject + { + + private System.Runtime.Serialization.ExtensionDataObject extensionDataField; + + private string OperationField; + + private string ReasonField; + + public System.Runtime.Serialization.ExtensionDataObject ExtensionData + { + get + { + return this.extensionDataField; + } + set + { + this.extensionDataField = value; + } + } + + [System.Runtime.Serialization.DataMemberAttribute()] + internal string Operation + { + get + { + return this.OperationField; + } + set + { + this.OperationField = value; + } + } + + [System.Runtime.Serialization.DataMemberAttribute()] + internal string Reason + { + get + { + return this.ReasonField; + } + set + { + this.ReasonField = value; + } + } + } + + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")] + [System.ServiceModel.ServiceContractAttribute(Namespace="http://ccnet.thoughtworks.com/1/5/wcf", ConfigurationName="ThoughtWorks.CruiseControl.WcfClient.ICruiseControlContract")] + internal interface ICruiseControlContract + { + + [System.ServiceModel.OperationContractAttribute(Action="http://ccnet.thoughtworks.com/1/5/wcf/ICruiseControlContract/RetrieveVersion", ReplyAction="http://ccnet.thoughtworks.com/1/5/wcf/ICruiseControlContract/RetrieveVersionRespo" + + "nse")] + string RetrieveVersion(); + + [System.ServiceModel.OperationContractAttribute(AsyncPattern=true, Action="http://ccnet.thoughtworks.com/1/5/wcf/ICruiseControlContract/RetrieveVersion", ReplyAction="http://ccnet.thoughtworks.com/1/5/wcf/ICruiseControlContract/RetrieveVersionRespo" + + "nse")] + System.IAsyncResult BeginRetrieveVersion(System.AsyncCallback callback, object asyncState); + + string EndRetrieveVersion(System.IAsyncResult result); + + [System.ServiceModel.OperationContractAttribute(Action="http://ccnet.thoughtworks.com/1/5/wcf/ICruiseControlContract/RetrieveSnapshot", ReplyAction="http://ccnet.thoughtworks.com/1/5/wcf/ICruiseControlContract/RetrieveSnapshotResp" + + "onse")] + ThoughtWorks.CruiseControl.WcfClient.Snapshot RetrieveSnapshot(); + + [System.ServiceModel.OperationContractAttribute(AsyncPattern=true, Action="http://ccnet.thoughtworks.com/1/5/wcf/ICruiseControlContract/RetrieveSnapshot", ReplyAction="http://ccnet.thoughtworks.com/1/5/wcf/ICruiseControlContract/RetrieveSnapshotResp" + + "onse")] + System.IAsyncResult BeginRetrieveSnapshot(System.AsyncCallback callback, object asyncState); + + ThoughtWorks.CruiseControl.WcfClient.Snapshot EndRetrieveSnapshot(System.IAsyncResult result); + + [System.ServiceModel.OperationContractAttribute(Action="http://ccnet.thoughtworks.com/1/5/wcf/ICruiseControlContract/RetrieveProjects", ReplyAction="http://ccnet.thoughtworks.com/1/5/wcf/ICruiseControlContract/RetrieveProjectsResp" + + "onse")] + ThoughtWorks.CruiseControl.WcfClient.Project[] RetrieveProjects(); + + [System.ServiceModel.OperationContractAttribute(AsyncPattern=true, Action="http://ccnet.thoughtworks.com/1/5/wcf/ICruiseControlContract/RetrieveProjects", ReplyAction="http://ccnet.thoughtworks.com/1/5/wcf/ICruiseControlContract/RetrieveProjectsResp" + + "onse")] + System.IAsyncResult BeginRetrieveProjects(System.AsyncCallback callback, object asyncState); + + ThoughtWorks.CruiseControl.WcfClient.Project[] EndRetrieveProjects(System.IAsyncResult result); + + [System.ServiceModel.OperationContractAttribute(Action="http://ccnet.thoughtworks.com/1/5/wcf/ICruiseControlContract/RetrieveProject", ReplyAction="http://ccnet.thoughtworks.com/1/5/wcf/ICruiseControlContract/RetrieveProjectRespo" + + "nse")] + [System.ServiceModel.FaultContractAttribute(typeof(ThoughtWorks.CruiseControl.WcfClient.ServerFault), Action="http://ccnet.thoughtworks.com/1/5/wcf/ICruiseControlContract/RetrieveProjectServe" + + "rFaultFault", Name="ServerFault")] + ThoughtWorks.CruiseControl.WcfClient.Project RetrieveProject(string projectName); + + [System.ServiceModel.OperationContractAttribute(AsyncPattern=true, Action="http://ccnet.thoughtworks.com/1/5/wcf/ICruiseControlContract/RetrieveProject", ReplyAction="http://ccnet.thoughtworks.com/1/5/wcf/ICruiseControlContract/RetrieveProjectRespo" + + "nse")] + System.IAsyncResult BeginRetrieveProject(string projectName, System.AsyncCallback callback, object asyncState); + + ThoughtWorks.CruiseControl.WcfClient.Project EndRetrieveProject(System.IAsyncResult result); + + [System.ServiceModel.OperationContractAttribute(Action="http://ccnet.thoughtworks.com/1/5/wcf/ICruiseControlContract/ForceBuild", ReplyAction="http://ccnet.thoughtworks.com/1/5/wcf/ICruiseControlContract/ForceBuildResponse")] + [System.ServiceModel.FaultContractAttribute(typeof(ThoughtWorks.CruiseControl.WcfClient.ServerFault), Action="http://ccnet.thoughtworks.com/1/5/wcf/ICruiseControlContract/ForceBuildServerFaul" + + "tFault", Name="ServerFault")] + void ForceBuild(string projectName); + + [System.ServiceModel.OperationContractAttribute(AsyncPattern=true, Action="http://ccnet.thoughtworks.com/1/5/wcf/ICruiseControlContract/ForceBuild", ReplyAction="http://ccnet.thoughtworks.com/1/5/wcf/ICruiseControlContract/ForceBuildResponse")] + System.IAsyncResult BeginForceBuild(string projectName, System.AsyncCallback callback, object asyncState); + + void EndForceBuild(System.IAsyncResult result); + + [System.ServiceModel.OperationContractAttribute(Action="http://ccnet.thoughtworks.com/1/5/wcf/ICruiseControlContract/StartProject", ReplyAction="http://ccnet.thoughtworks.com/1/5/wcf/ICruiseControlContract/StartProjectResponse" + + "")] + [System.ServiceModel.FaultContractAttribute(typeof(ThoughtWorks.CruiseControl.WcfClient.ServerFault), Action="http://ccnet.thoughtworks.com/1/5/wcf/ICruiseControlContract/StartProjectServerFa" + + "ultFault", Name="ServerFault")] + void StartProject(string projectName); + + [System.ServiceModel.OperationContractAttribute(AsyncPattern=true, Action="http://ccnet.thoughtworks.com/1/5/wcf/ICruiseControlContract/StartProject", ReplyAction="http://ccnet.thoughtworks.com/1/5/wcf/ICruiseControlContract/StartProjectResponse" + + "")] + System.IAsyncResult BeginStartProject(string projectName, System.AsyncCallback callback, object asyncState); + + void EndStartProject(System.IAsyncResult result); + + [System.ServiceModel.OperationContractAttribute(Action="http://ccnet.thoughtworks.com/1/5/wcf/ICruiseControlContract/StopProject", ReplyAction="http://ccnet.thoughtworks.com/1/5/wcf/ICruiseControlContract/StopProjectResponse")] + [System.ServiceModel.FaultContractAttribute(typeof(ThoughtWorks.CruiseControl.WcfClient.ServerFault), Action="http://ccnet.thoughtworks.com/1/5/wcf/ICruiseControlContract/StopProjectServerFau" + + "ltFault", Name="ServerFault")] + void StopProject(string projectName); + + [System.ServiceModel.OperationContractAttribute(AsyncPattern=true, Action="http://ccnet.thoughtworks.com/1/5/wcf/ICruiseControlContract/StopProject", ReplyAction="http://ccnet.thoughtworks.com/1/5/wcf/ICruiseControlContract/StopProjectResponse")] + System.IAsyncResult BeginStopProject(string projectName, System.AsyncCallback callback, object asyncState); + + void EndStopProject(System.IAsyncResult result); + + [System.ServiceModel.OperationContractAttribute(Action="http://ccnet.thoughtworks.com/1/5/wcf/ICruiseControlContract/AbortBuild", ReplyAction="http://ccnet.thoughtworks.com/1/5/wcf/ICruiseControlContract/AbortBuildResponse")] + [System.ServiceModel.FaultContractAttribute(typeof(ThoughtWorks.CruiseControl.WcfClient.ServerFault), Action="http://ccnet.thoughtworks.com/1/5/wcf/ICruiseControlContract/AbortBuildServerFaul" + + "tFault", Name="ServerFault")] + void AbortBuild(string projectName); + + [System.ServiceModel.OperationContractAttribute(AsyncPattern=true, Action="http://ccnet.thoughtworks.com/1/5/wcf/ICruiseControlContract/AbortBuild", ReplyAction="http://ccnet.thoughtworks.com/1/5/wcf/ICruiseControlContract/AbortBuildResponse")] + System.IAsyncResult BeginAbortBuild(string projectName, System.AsyncCallback callback, object asyncState); + + void EndAbortBuild(System.IAsyncResult result); + + [System.ServiceModel.OperationContractAttribute(Action="http://ccnet.thoughtworks.com/1/5/wcf/ICruiseControlContract/CancelPendingRequest" + + "", ReplyAction="http://ccnet.thoughtworks.com/1/5/wcf/ICruiseControlContract/CancelPendingRequest" + + "Response")] + [System.ServiceModel.FaultContractAttribute(typeof(ThoughtWorks.CruiseControl.WcfClient.ServerFault), Action="http://ccnet.thoughtworks.com/1/5/wcf/ICruiseControlContract/CancelPendingRequest" + + "ServerFaultFault", Name="ServerFault")] + void CancelPendingRequest(string projectName); + + [System.ServiceModel.OperationContractAttribute(AsyncPattern=true, Action="http://ccnet.thoughtworks.com/1/5/wcf/ICruiseControlContract/CancelPendingRequest" + + "", ReplyAction="http://ccnet.thoughtworks.com/1/5/wcf/ICruiseControlContract/CancelPendingRequest" + + "Response")] + System.IAsyncResult BeginCancelPendingRequest(string projectName, System.AsyncCallback callback, object asyncState); + + void EndCancelPendingRequest(System.IAsyncResult result); + + [System.ServiceModel.OperationContractAttribute(Action="http://ccnet.thoughtworks.com/1/5/wcf/ICruiseControlContract/FixBuild", ReplyAction="http://ccnet.thoughtworks.com/1/5/wcf/ICruiseControlContract/FixBuildResponse")] + [System.ServiceModel.FaultContractAttribute(typeof(ThoughtWorks.CruiseControl.WcfClient.ServerFault), Action="http://ccnet.thoughtworks.com/1/5/wcf/ICruiseControlContract/FixBuildServerFaultF" + + "ault", Name="ServerFault")] + void FixBuild(string projectName); + + [System.ServiceModel.OperationContractAttribute(AsyncPattern=true, Action="http://ccnet.thoughtworks.com/1/5/wcf/ICruiseControlContract/FixBuild", ReplyAction="http://ccnet.thoughtworks.com/1/5/wcf/ICruiseControlContract/FixBuildResponse")] + System.IAsyncResult BeginFixBuild(string projectName, System.AsyncCallback callback, object asyncState); + + void EndFixBuild(System.IAsyncResult result); + } + + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")] + internal interface ICruiseControlContractChannel : ThoughtWorks.CruiseControl.WcfClient.ICruiseControlContract, System.ServiceModel.IClientChannel + { + } + + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")] + internal partial class RetrieveVersionCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs + { + + private object[] results; + + public RetrieveVersionCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) + { + this.results = results; + } + + public string Result + { + get + { + base.RaiseExceptionIfNecessary(); + return ((string)(this.results[0])); + } + } + } + + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")] + internal partial class RetrieveSnapshotCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs + { + + private object[] results; + + public RetrieveSnapshotCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) + { + this.results = results; + } + + public ThoughtWorks.CruiseControl.WcfClient.Snapshot Result + { + get + { + base.RaiseExceptionIfNecessary(); + return ((ThoughtWorks.CruiseControl.WcfClient.Snapshot)(this.results[0])); + } + } + } + + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")] + internal partial class RetrieveProjectsCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs + { + + private object[] results; + + public RetrieveProjectsCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) + { + this.results = results; + } + + public ThoughtWorks.CruiseControl.WcfClient.Project[] Result + { + get + { + base.RaiseExceptionIfNecessary(); + return ((ThoughtWorks.CruiseControl.WcfClient.Project[])(this.results[0])); + } + } + } + + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")] + internal partial class RetrieveProjectCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs + { + + private object[] results; + + public RetrieveProjectCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) + { + this.results = results; + } + + public ThoughtWorks.CruiseControl.WcfClient.Project Result + { + get + { + base.RaiseExceptionIfNecessary(); + return ((ThoughtWorks.CruiseControl.WcfClient.Project)(this.results[0])); + } + } + } + + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")] + internal partial class CruiseControlContractClient : System.ServiceModel.ClientBase, ThoughtWorks.CruiseControl.WcfClient.ICruiseControlContract + { + + private BeginOperationDelegate onBeginRetrieveVersionDelegate; + + private EndOperationDelegate onEndRetrieveVersionDelegate; + + private System.Threading.SendOrPostCallback onRetrieveVersionCompletedDelegate; + + private BeginOperationDelegate onBeginRetrieveSnapshotDelegate; + + private EndOperationDelegate onEndRetrieveSnapshotDelegate; + + private System.Threading.SendOrPostCallback onRetrieveSnapshotCompletedDelegate; + + private BeginOperationDelegate onBeginRetrieveProjectsDelegate; + + private EndOperationDelegate onEndRetrieveProjectsDelegate; + + private System.Threading.SendOrPostCallback onRetrieveProjectsCompletedDelegate; + + private BeginOperationDelegate onBeginRetrieveProjectDelegate; + + private EndOperationDelegate onEndRetrieveProjectDelegate; + + private System.Threading.SendOrPostCallback onRetrieveProjectCompletedDelegate; + + private BeginOperationDelegate onBeginForceBuildDelegate; + + private EndOperationDelegate onEndForceBuildDelegate; + + private System.Threading.SendOrPostCallback onForceBuildCompletedDelegate; + + private BeginOperationDelegate onBeginStartProjectDelegate; + + private EndOperationDelegate onEndStartProjectDelegate; + + private System.Threading.SendOrPostCallback onStartProjectCompletedDelegate; + + private BeginOperationDelegate onBeginStopProjectDelegate; + + private EndOperationDelegate onEndStopProjectDelegate; + + private System.Threading.SendOrPostCallback onStopProjectCompletedDelegate; + + private BeginOperationDelegate onBeginAbortBuildDelegate; + + private EndOperationDelegate onEndAbortBuildDelegate; + + private System.Threading.SendOrPostCallback onAbortBuildCompletedDelegate; + + private BeginOperationDelegate onBeginCancelPendingRequestDelegate; + + private EndOperationDelegate onEndCancelPendingRequestDelegate; + + private System.Threading.SendOrPostCallback onCancelPendingRequestCompletedDelegate; + + private BeginOperationDelegate onBeginFixBuildDelegate; + + private EndOperationDelegate onEndFixBuildDelegate; + + private System.Threading.SendOrPostCallback onFixBuildCompletedDelegate; + + public CruiseControlContractClient() + { + } + + public CruiseControlContractClient(string endpointConfigurationName) : + base(endpointConfigurationName) + { + } + + public CruiseControlContractClient(string endpointConfigurationName, string remoteAddress) : + base(endpointConfigurationName, remoteAddress) + { + } + + public CruiseControlContractClient(string endpointConfigurationName, System.ServiceModel.EndpointAddress remoteAddress) : + base(endpointConfigurationName, remoteAddress) + { + } + + public CruiseControlContractClient(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress) : + base(binding, remoteAddress) + { + } + + public event System.EventHandler RetrieveVersionCompleted; + + public event System.EventHandler RetrieveSnapshotCompleted; + + public event System.EventHandler RetrieveProjectsCompleted; + + public event System.EventHandler RetrieveProjectCompleted; + + public event System.EventHandler ForceBuildCompleted; + + public event System.EventHandler StartProjectCompleted; + + public event System.EventHandler StopProjectCompleted; + + public event System.EventHandler AbortBuildCompleted; + + public event System.EventHandler CancelPendingRequestCompleted; + + public event System.EventHandler FixBuildCompleted; + + public string RetrieveVersion() + { + return base.Channel.RetrieveVersion(); + } + + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + public System.IAsyncResult BeginRetrieveVersion(System.AsyncCallback callback, object asyncState) + { + return base.Channel.BeginRetrieveVersion(callback, asyncState); + } + + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + public string EndRetrieveVersion(System.IAsyncResult result) + { + return base.Channel.EndRetrieveVersion(result); + } + + private System.IAsyncResult OnBeginRetrieveVersion(object[] inValues, System.AsyncCallback callback, object asyncState) + { + return this.BeginRetrieveVersion(callback, asyncState); + } + + private object[] OnEndRetrieveVersion(System.IAsyncResult result) + { + string retVal = this.EndRetrieveVersion(result); + return new object[] { + retVal}; + } + + private void OnRetrieveVersionCompleted(object state) + { + if ((this.RetrieveVersionCompleted != null)) + { + InvokeAsyncCompletedEventArgs e = ((InvokeAsyncCompletedEventArgs)(state)); + this.RetrieveVersionCompleted(this, new RetrieveVersionCompletedEventArgs(e.Results, e.Error, e.Cancelled, e.UserState)); + } + } + + public void RetrieveVersionAsync() + { + this.RetrieveVersionAsync(null); + } + + public void RetrieveVersionAsync(object userState) + { + if ((this.onBeginRetrieveVersionDelegate == null)) + { + this.onBeginRetrieveVersionDelegate = new BeginOperationDelegate(this.OnBeginRetrieveVersion); + } + if ((this.onEndRetrieveVersionDelegate == null)) + { + this.onEndRetrieveVersionDelegate = new EndOperationDelegate(this.OnEndRetrieveVersion); + } + if ((this.onRetrieveVersionCompletedDelegate == null)) + { + this.onRetrieveVersionCompletedDelegate = new System.Threading.SendOrPostCallback(this.OnRetrieveVersionCompleted); + } + base.InvokeAsync(this.onBeginRetrieveVersionDelegate, null, this.onEndRetrieveVersionDelegate, this.onRetrieveVersionCompletedDelegate, userState); + } + + public ThoughtWorks.CruiseControl.WcfClient.Snapshot RetrieveSnapshot() + { + return base.Channel.RetrieveSnapshot(); + } + + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + public System.IAsyncResult BeginRetrieveSnapshot(System.AsyncCallback callback, object asyncState) + { + return base.Channel.BeginRetrieveSnapshot(callback, asyncState); + } + + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + public ThoughtWorks.CruiseControl.WcfClient.Snapshot EndRetrieveSnapshot(System.IAsyncResult result) + { + return base.Channel.EndRetrieveSnapshot(result); + } + + private System.IAsyncResult OnBeginRetrieveSnapshot(object[] inValues, System.AsyncCallback callback, object asyncState) + { + return this.BeginRetrieveSnapshot(callback, asyncState); + } + + private object[] OnEndRetrieveSnapshot(System.IAsyncResult result) + { + ThoughtWorks.CruiseControl.WcfClient.Snapshot retVal = this.EndRetrieveSnapshot(result); + return new object[] { + retVal}; + } + + private void OnRetrieveSnapshotCompleted(object state) + { + if ((this.RetrieveSnapshotCompleted != null)) + { + InvokeAsyncCompletedEventArgs e = ((InvokeAsyncCompletedEventArgs)(state)); + this.RetrieveSnapshotCompleted(this, new RetrieveSnapshotCompletedEventArgs(e.Results, e.Error, e.Cancelled, e.UserState)); + } + } + + public void RetrieveSnapshotAsync() + { + this.RetrieveSnapshotAsync(null); + } + + public void RetrieveSnapshotAsync(object userState) + { + if ((this.onBeginRetrieveSnapshotDelegate == null)) + { + this.onBeginRetrieveSnapshotDelegate = new BeginOperationDelegate(this.OnBeginRetrieveSnapshot); + } + if ((this.onEndRetrieveSnapshotDelegate == null)) + { + this.onEndRetrieveSnapshotDelegate = new EndOperationDelegate(this.OnEndRetrieveSnapshot); + } + if ((this.onRetrieveSnapshotCompletedDelegate == null)) + { + this.onRetrieveSnapshotCompletedDelegate = new System.Threading.SendOrPostCallback(this.OnRetrieveSnapshotCompleted); + } + base.InvokeAsync(this.onBeginRetrieveSnapshotDelegate, null, this.onEndRetrieveSnapshotDelegate, this.onRetrieveSnapshotCompletedDelegate, userState); + } + + public ThoughtWorks.CruiseControl.WcfClient.Project[] RetrieveProjects() + { + return base.Channel.RetrieveProjects(); + } + + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + public System.IAsyncResult BeginRetrieveProjects(System.AsyncCallback callback, object asyncState) + { + return base.Channel.BeginRetrieveProjects(callback, asyncState); + } + + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + public ThoughtWorks.CruiseControl.WcfClient.Project[] EndRetrieveProjects(System.IAsyncResult result) + { + return base.Channel.EndRetrieveProjects(result); + } + + private System.IAsyncResult OnBeginRetrieveProjects(object[] inValues, System.AsyncCallback callback, object asyncState) + { + return this.BeginRetrieveProjects(callback, asyncState); + } + + private object[] OnEndRetrieveProjects(System.IAsyncResult result) + { + ThoughtWorks.CruiseControl.WcfClient.Project[] retVal = this.EndRetrieveProjects(result); + return new object[] { + retVal}; + } + + private void OnRetrieveProjectsCompleted(object state) + { + if ((this.RetrieveProjectsCompleted != null)) + { + InvokeAsyncCompletedEventArgs e = ((InvokeAsyncCompletedEventArgs)(state)); + this.RetrieveProjectsCompleted(this, new RetrieveProjectsCompletedEventArgs(e.Results, e.Error, e.Cancelled, e.UserState)); + } + } + + public void RetrieveProjectsAsync() + { + this.RetrieveProjectsAsync(null); + } + + public void RetrieveProjectsAsync(object userState) + { + if ((this.onBeginRetrieveProjectsDelegate == null)) + { + this.onBeginRetrieveProjectsDelegate = new BeginOperationDelegate(this.OnBeginRetrieveProjects); + } + if ((this.onEndRetrieveProjectsDelegate == null)) + { + this.onEndRetrieveProjectsDelegate = new EndOperationDelegate(this.OnEndRetrieveProjects); + } + if ((this.onRetrieveProjectsCompletedDelegate == null)) + { + this.onRetrieveProjectsCompletedDelegate = new System.Threading.SendOrPostCallback(this.OnRetrieveProjectsCompleted); + } + base.InvokeAsync(this.onBeginRetrieveProjectsDelegate, null, this.onEndRetrieveProjectsDelegate, this.onRetrieveProjectsCompletedDelegate, userState); + } + + public ThoughtWorks.CruiseControl.WcfClient.Project RetrieveProject(string projectName) + { + return base.Channel.RetrieveProject(projectName); + } + + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + public System.IAsyncResult BeginRetrieveProject(string projectName, System.AsyncCallback callback, object asyncState) + { + return base.Channel.BeginRetrieveProject(projectName, callback, asyncState); + } + + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + public ThoughtWorks.CruiseControl.WcfClient.Project EndRetrieveProject(System.IAsyncResult result) + { + return base.Channel.EndRetrieveProject(result); + } + + private System.IAsyncResult OnBeginRetrieveProject(object[] inValues, System.AsyncCallback callback, object asyncState) + { + string projectName = ((string)(inValues[0])); + return this.BeginRetrieveProject(projectName, callback, asyncState); + } + + private object[] OnEndRetrieveProject(System.IAsyncResult result) + { + ThoughtWorks.CruiseControl.WcfClient.Project retVal = this.EndRetrieveProject(result); + return new object[] { + retVal}; + } + + private void OnRetrieveProjectCompleted(object state) + { + if ((this.RetrieveProjectCompleted != null)) + { + InvokeAsyncCompletedEventArgs e = ((InvokeAsyncCompletedEventArgs)(state)); + this.RetrieveProjectCompleted(this, new RetrieveProjectCompletedEventArgs(e.Results, e.Error, e.Cancelled, e.UserState)); + } + } + + public void RetrieveProjectAsync(string projectName) + { + this.RetrieveProjectAsync(projectName, null); + } + + public void RetrieveProjectAsync(string projectName, object userState) + { + if ((this.onBeginRetrieveProjectDelegate == null)) + { + this.onBeginRetrieveProjectDelegate = new BeginOperationDelegate(this.OnBeginRetrieveProject); + } + if ((this.onEndRetrieveProjectDelegate == null)) + { + this.onEndRetrieveProjectDelegate = new EndOperationDelegate(this.OnEndRetrieveProject); + } + if ((this.onRetrieveProjectCompletedDelegate == null)) + { + this.onRetrieveProjectCompletedDelegate = new System.Threading.SendOrPostCallback(this.OnRetrieveProjectCompleted); + } + base.InvokeAsync(this.onBeginRetrieveProjectDelegate, new object[] { + projectName}, this.onEndRetrieveProjectDelegate, this.onRetrieveProjectCompletedDelegate, userState); + } + + public void ForceBuild(string projectName) + { + base.Channel.ForceBuild(projectName); + } + + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + public System.IAsyncResult BeginForceBuild(string projectName, System.AsyncCallback callback, object asyncState) + { + return base.Channel.BeginForceBuild(projectName, callback, asyncState); + } + + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + public void EndForceBuild(System.IAsyncResult result) + { + base.Channel.EndForceBuild(result); + } + + private System.IAsyncResult OnBeginForceBuild(object[] inValues, System.AsyncCallback callback, object asyncState) + { + string projectName = ((string)(inValues[0])); + return this.BeginForceBuild(projectName, callback, asyncState); + } + + private object[] OnEndForceBuild(System.IAsyncResult result) + { + this.EndForceBuild(result); + return null; + } + + private void OnForceBuildCompleted(object state) + { + if ((this.ForceBuildCompleted != null)) + { + InvokeAsyncCompletedEventArgs e = ((InvokeAsyncCompletedEventArgs)(state)); + this.ForceBuildCompleted(this, new System.ComponentModel.AsyncCompletedEventArgs(e.Error, e.Cancelled, e.UserState)); + } + } + + public void ForceBuildAsync(string projectName) + { + this.ForceBuildAsync(projectName, null); + } + + public void ForceBuildAsync(string projectName, object userState) + { + if ((this.onBeginForceBuildDelegate == null)) + { + this.onBeginForceBuildDelegate = new BeginOperationDelegate(this.OnBeginForceBuild); + } + if ((this.onEndForceBuildDelegate == null)) + { + this.onEndForceBuildDelegate = new EndOperationDelegate(this.OnEndForceBuild); + } + if ((this.onForceBuildCompletedDelegate == null)) + { + this.onForceBuildCompletedDelegate = new System.Threading.SendOrPostCallback(this.OnForceBuildCompleted); + } + base.InvokeAsync(this.onBeginForceBuildDelegate, new object[] { + projectName}, this.onEndForceBuildDelegate, this.onForceBuildCompletedDelegate, userState); + } + + public void StartProject(string projectName) + { + base.Channel.StartProject(projectName); + } + + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + public System.IAsyncResult BeginStartProject(string projectName, System.AsyncCallback callback, object asyncState) + { + return base.Channel.BeginStartProject(projectName, callback, asyncState); + } + + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + public void EndStartProject(System.IAsyncResult result) + { + base.Channel.EndStartProject(result); + } + + private System.IAsyncResult OnBeginStartProject(object[] inValues, System.AsyncCallback callback, object asyncState) + { + string projectName = ((string)(inValues[0])); + return this.BeginStartProject(projectName, callback, asyncState); + } + + private object[] OnEndStartProject(System.IAsyncResult result) + { + this.EndStartProject(result); + return null; + } + + private void OnStartProjectCompleted(object state) + { + if ((this.StartProjectCompleted != null)) + { + InvokeAsyncCompletedEventArgs e = ((InvokeAsyncCompletedEventArgs)(state)); + this.StartProjectCompleted(this, new System.ComponentModel.AsyncCompletedEventArgs(e.Error, e.Cancelled, e.UserState)); + } + } + + public void StartProjectAsync(string projectName) + { + this.StartProjectAsync(projectName, null); + } + + public void StartProjectAsync(string projectName, object userState) + { + if ((this.onBeginStartProjectDelegate == null)) + { + this.onBeginStartProjectDelegate = new BeginOperationDelegate(this.OnBeginStartProject); + } + if ((this.onEndStartProjectDelegate == null)) + { + this.onEndStartProjectDelegate = new EndOperationDelegate(this.OnEndStartProject); + } + if ((this.onStartProjectCompletedDelegate == null)) + { + this.onStartProjectCompletedDelegate = new System.Threading.SendOrPostCallback(this.OnStartProjectCompleted); + } + base.InvokeAsync(this.onBeginStartProjectDelegate, new object[] { + projectName}, this.onEndStartProjectDelegate, this.onStartProjectCompletedDelegate, userState); + } + + public void StopProject(string projectName) + { + base.Channel.StopProject(projectName); + } + + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + public System.IAsyncResult BeginStopProject(string projectName, System.AsyncCallback callback, object asyncState) + { + return base.Channel.BeginStopProject(projectName, callback, asyncState); + } + + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + public void EndStopProject(System.IAsyncResult result) + { + base.Channel.EndStopProject(result); + } + + private System.IAsyncResult OnBeginStopProject(object[] inValues, System.AsyncCallback callback, object asyncState) + { + string projectName = ((string)(inValues[0])); + return this.BeginStopProject(projectName, callback, asyncState); + } + + private object[] OnEndStopProject(System.IAsyncResult result) + { + this.EndStopProject(result); + return null; + } + + private void OnStopProjectCompleted(object state) + { + if ((this.StopProjectCompleted != null)) + { + InvokeAsyncCompletedEventArgs e = ((InvokeAsyncCompletedEventArgs)(state)); + this.StopProjectCompleted(this, new System.ComponentModel.AsyncCompletedEventArgs(e.Error, e.Cancelled, e.UserState)); + } + } + + public void StopProjectAsync(string projectName) + { + this.StopProjectAsync(projectName, null); + } + + public void StopProjectAsync(string projectName, object userState) + { + if ((this.onBeginStopProjectDelegate == null)) + { + this.onBeginStopProjectDelegate = new BeginOperationDelegate(this.OnBeginStopProject); + } + if ((this.onEndStopProjectDelegate == null)) + { + this.onEndStopProjectDelegate = new EndOperationDelegate(this.OnEndStopProject); + } + if ((this.onStopProjectCompletedDelegate == null)) + { + this.onStopProjectCompletedDelegate = new System.Threading.SendOrPostCallback(this.OnStopProjectCompleted); + } + base.InvokeAsync(this.onBeginStopProjectDelegate, new object[] { + projectName}, this.onEndStopProjectDelegate, this.onStopProjectCompletedDelegate, userState); + } + + public void AbortBuild(string projectName) + { + base.Channel.AbortBuild(projectName); + } + + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + public System.IAsyncResult BeginAbortBuild(string projectName, System.AsyncCallback callback, object asyncState) + { + return base.Channel.BeginAbortBuild(projectName, callback, asyncState); + } + + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + public void EndAbortBuild(System.IAsyncResult result) + { + base.Channel.EndAbortBuild(result); + } + + private System.IAsyncResult OnBeginAbortBuild(object[] inValues, System.AsyncCallback callback, object asyncState) + { + string projectName = ((string)(inValues[0])); + return this.BeginAbortBuild(projectName, callback, asyncState); + } + + private object[] OnEndAbortBuild(System.IAsyncResult result) + { + this.EndAbortBuild(result); + return null; + } + + private void OnAbortBuildCompleted(object state) + { + if ((this.AbortBuildCompleted != null)) + { + InvokeAsyncCompletedEventArgs e = ((InvokeAsyncCompletedEventArgs)(state)); + this.AbortBuildCompleted(this, new System.ComponentModel.AsyncCompletedEventArgs(e.Error, e.Cancelled, e.UserState)); + } + } + + public void AbortBuildAsync(string projectName) + { + this.AbortBuildAsync(projectName, null); + } + + public void AbortBuildAsync(string projectName, object userState) + { + if ((this.onBeginAbortBuildDelegate == null)) + { + this.onBeginAbortBuildDelegate = new BeginOperationDelegate(this.OnBeginAbortBuild); + } + if ((this.onEndAbortBuildDelegate == null)) + { + this.onEndAbortBuildDelegate = new EndOperationDelegate(this.OnEndAbortBuild); + } + if ((this.onAbortBuildCompletedDelegate == null)) + { + this.onAbortBuildCompletedDelegate = new System.Threading.SendOrPostCallback(this.OnAbortBuildCompleted); + } + base.InvokeAsync(this.onBeginAbortBuildDelegate, new object[] { + projectName}, this.onEndAbortBuildDelegate, this.onAbortBuildCompletedDelegate, userState); + } + + public void CancelPendingRequest(string projectName) + { + base.Channel.CancelPendingRequest(projectName); + } + + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + public System.IAsyncResult BeginCancelPendingRequest(string projectName, System.AsyncCallback callback, object asyncState) + { + return base.Channel.BeginCancelPendingRequest(projectName, callback, asyncState); + } + + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + public void EndCancelPendingRequest(System.IAsyncResult result) + { + base.Channel.EndCancelPendingRequest(result); + } + + private System.IAsyncResult OnBeginCancelPendingRequest(object[] inValues, System.AsyncCallback callback, object asyncState) + { + string projectName = ((string)(inValues[0])); + return this.BeginCancelPendingRequest(projectName, callback, asyncState); + } + + private object[] OnEndCancelPendingRequest(System.IAsyncResult result) + { + this.EndCancelPendingRequest(result); + return null; + } + + private void OnCancelPendingRequestCompleted(object state) + { + if ((this.CancelPendingRequestCompleted != null)) + { + InvokeAsyncCompletedEventArgs e = ((InvokeAsyncCompletedEventArgs)(state)); + this.CancelPendingRequestCompleted(this, new System.ComponentModel.AsyncCompletedEventArgs(e.Error, e.Cancelled, e.UserState)); + } + } + + public void CancelPendingRequestAsync(string projectName) + { + this.CancelPendingRequestAsync(projectName, null); + } + + public void CancelPendingRequestAsync(string projectName, object userState) + { + if ((this.onBeginCancelPendingRequestDelegate == null)) + { + this.onBeginCancelPendingRequestDelegate = new BeginOperationDelegate(this.OnBeginCancelPendingRequest); + } + if ((this.onEndCancelPendingRequestDelegate == null)) + { + this.onEndCancelPendingRequestDelegate = new EndOperationDelegate(this.OnEndCancelPendingRequest); + } + if ((this.onCancelPendingRequestCompletedDelegate == null)) + { + this.onCancelPendingRequestCompletedDelegate = new System.Threading.SendOrPostCallback(this.OnCancelPendingRequestCompleted); + } + base.InvokeAsync(this.onBeginCancelPendingRequestDelegate, new object[] { + projectName}, this.onEndCancelPendingRequestDelegate, this.onCancelPendingRequestCompletedDelegate, userState); + } + + public void FixBuild(string projectName) + { + base.Channel.FixBuild(projectName); + } + + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + public System.IAsyncResult BeginFixBuild(string projectName, System.AsyncCallback callback, object asyncState) + { + return base.Channel.BeginFixBuild(projectName, callback, asyncState); + } + + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + public void EndFixBuild(System.IAsyncResult result) + { + base.Channel.EndFixBuild(result); + } + + private System.IAsyncResult OnBeginFixBuild(object[] inValues, System.AsyncCallback callback, object asyncState) + { + string projectName = ((string)(inValues[0])); + return this.BeginFixBuild(projectName, callback, asyncState); + } + + private object[] OnEndFixBuild(System.IAsyncResult result) + { + this.EndFixBuild(result); + return null; + } + + private void OnFixBuildCompleted(object state) + { + if ((this.FixBuildCompleted != null)) + { + InvokeAsyncCompletedEventArgs e = ((InvokeAsyncCompletedEventArgs)(state)); + this.FixBuildCompleted(this, new System.ComponentModel.AsyncCompletedEventArgs(e.Error, e.Cancelled, e.UserState)); + } + } + + public void FixBuildAsync(string projectName) + { + this.FixBuildAsync(projectName, null); + } + + public void FixBuildAsync(string projectName, object userState) + { + if ((this.onBeginFixBuildDelegate == null)) + { + this.onBeginFixBuildDelegate = new BeginOperationDelegate(this.OnBeginFixBuild); + } + if ((this.onEndFixBuildDelegate == null)) + { + this.onEndFixBuildDelegate = new EndOperationDelegate(this.OnEndFixBuild); + } + if ((this.onFixBuildCompletedDelegate == null)) + { + this.onFixBuildCompletedDelegate = new System.Threading.SendOrPostCallback(this.OnFixBuildCompleted); + } + base.InvokeAsync(this.onBeginFixBuildDelegate, new object[] { + projectName}, this.onEndFixBuildDelegate, this.onFixBuildCompletedDelegate, userState); + } + } +} Index: CCTrayExtensions/WcfConfigurationWindow.cs =================================================================== --- CCTrayExtensions/WcfConfigurationWindow.cs (revision 0) +++ CCTrayExtensions/WcfConfigurationWindow.cs (revision 0) @@ -0,0 +1,36 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Forms; + +namespace ThoughtWorks.CruiseControl.CCTrayExtensions +{ + public partial class WcfConfigurationWindow : Form + { + private WcfExtension _extension; + + public WcfConfigurationWindow(WcfExtension extension) + { + InitializeComponent(); + this._extension = extension; + + cmbBinding.Items.AddRange((from binding in Enum.GetNames(typeof(TransportBinding)) + orderby binding + select binding).ToArray()); + cmbBinding.SelectedItem = _extension.Binding.ToString(); + txtEndpoint.Text = _extension.Url; + } + + private void btnOk_Click(object sender, EventArgs e) + { + this.DialogResult = DialogResult.OK; + _extension.Url = txtEndpoint.Text; + _extension.Binding = (TransportBinding)Enum.Parse(typeof(TransportBinding), cmbBinding.SelectedItem.ToString()); + this.Close(); + } + } +} Index: CCTrayExtensions/WcfConfigurationWindow.Designer.cs =================================================================== --- CCTrayExtensions/WcfConfigurationWindow.Designer.cs (revision 0) +++ CCTrayExtensions/WcfConfigurationWindow.Designer.cs (revision 0) @@ -0,0 +1,127 @@ +namespace ThoughtWorks.CruiseControl.CCTrayExtensions +{ + partial class WcfConfigurationWindow + { + /// + /// 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 Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(WcfConfigurationWindow)); + this.label1 = new System.Windows.Forms.Label(); + this.cmbBinding = new System.Windows.Forms.ComboBox(); + this.label2 = new System.Windows.Forms.Label(); + this.txtEndpoint = new System.Windows.Forms.TextBox(); + this.btnOk = new System.Windows.Forms.Button(); + this.btnCancel = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(12, 15); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(45, 13); + this.label1.TabIndex = 0; + this.label1.Text = "&Binding:"; + // + // cmbBinding + // + this.cmbBinding.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbBinding.FormattingEnabled = true; + this.cmbBinding.Location = new System.Drawing.Point(70, 15); + this.cmbBinding.Name = "cmbBinding"; + this.cmbBinding.Size = new System.Drawing.Size(251, 21); + this.cmbBinding.TabIndex = 1; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(12, 42); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(52, 13); + this.label2.TabIndex = 2; + this.label2.Text = "&Endpoint:"; + // + // txtEndpoint + // + this.txtEndpoint.Location = new System.Drawing.Point(70, 39); + this.txtEndpoint.Name = "txtEndpoint"; + this.txtEndpoint.Size = new System.Drawing.Size(230, 20); + this.txtEndpoint.TabIndex = 3; + // + // btnOk + // + this.btnOk.Location = new System.Drawing.Point(246, 65); + this.btnOk.Name = "btnOk"; + this.btnOk.Size = new System.Drawing.Size(75, 23); + this.btnOk.TabIndex = 4; + this.btnOk.Text = "&Ok"; + this.btnOk.UseVisualStyleBackColor = true; + this.btnOk.Click += new System.EventHandler(this.btnOk_Click); + // + // btnCancel + // + this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.btnCancel.Location = new System.Drawing.Point(165, 65); + this.btnCancel.Name = "btnCancel"; + this.btnCancel.Size = new System.Drawing.Size(75, 23); + this.btnCancel.TabIndex = 5; + this.btnCancel.Text = "&Cancel"; + this.btnCancel.UseVisualStyleBackColor = true; + // + // WcfConfigurationWindow + // + this.AcceptButton = this.btnOk; + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.btnCancel; + this.ClientSize = new System.Drawing.Size(333, 99); + this.ControlBox = false; + this.Controls.Add(this.btnCancel); + this.Controls.Add(this.btnOk); + this.Controls.Add(this.txtEndpoint); + this.Controls.Add(this.label2); + this.Controls.Add(this.cmbBinding); + this.Controls.Add(this.label1); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow; + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.Name = "WcfConfigurationWindow"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "WCF Extension Configuration"; + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Label label1; + private System.Windows.Forms.ComboBox cmbBinding; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.TextBox txtEndpoint; + private System.Windows.Forms.Button btnOk; + private System.Windows.Forms.Button btnCancel; + } +} \ No newline at end of file Index: CCTrayExtensions/WcfConfigurationWindow.resx =================================================================== --- CCTrayExtensions/WcfConfigurationWindow.resx (revision 0) +++ CCTrayExtensions/WcfConfigurationWindow.resx (revision 0) @@ -0,0 +1,500 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + AAABAAYAMDAAAAEACACoDgAAZgAAACAgAAABAAgAqAgAAA4PAAAQEAAAAQAIAGgFAAC2FwAAMDAAAAEA + IACoJQAAHh0AACAgAAABACAAqBAAAMZCAAAQEAAAAQAgAGgEAABuUwAAKAAAADAAAABgAAAAAQAIAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjAAAAKwAADC0MAAAzAAAAOwAACTUJAAg5CAAQLhAAETURABI5 + EgAYMhgAGDgYACAuIAAgMiAAJDskACg3KAAoOigAMzwzADk9OQAAQwAAAEwAAA5EDgAAUwAAAFsAAAlV + CQALWgsAE0YTABJXEgAAYwAAAGsAAApmCgAMaQwAAHMAAAB7AAAMcgwADHsMABJiEgATaRMAGWQZABtr + GwAVdhUAOkk6ADVSNQAiZiIAImoiAChnKAAuaC4AI3cjACN9IwAtdC0AK3krADtvOwA4djgAQEBAAExN + TABIWkgAUlJSAFxcXABNZE0ASHdIAF1iXQBafloAaWlpAHJycgB8fHwAAIMAAACLAAALhAsAC4sLAACS + AAAAmwAACZIJAAqdCgATgxMAFIoUABuBGwAcixwAEZERABGdEQAalRoAGZkZAACjAAAArAAAC6ILAAmo + CQAAswAAALwAAAu5CwAUpRQAFLEUABG6EQAdth0AGbkZACOBIwAiiiIALIQsACyJLAAjkiMAIZshACmU + KQAqnCoAM4MzADWKNQA7hjsAO4s7ADSXNAAynTIAPZY9ADucOwAppSkAIrUiACG7IQAquSoAMqMyADGr + MQA8ojwAO6g7ADi+OAAAxAAAAMsAAA7FDgAA0wAAANsAAA7UDgAO2w4AEsMSABPUEwAA4wAAAOoAAA7h + DgAL6QsAAPEAACjHKAAm3CYANME0ADLKMgA7xjsAN9g3ACfhJwBChkIARIlEAEuMSwBNkk0AVYVVAFWV + VQBCo0IAQ6hDAEmkSQBMqkwARbRFAFarVgBVslUAXrZeAF24XQBgiGAAYpxiAHWTdQBkoGQAZbNlAGK4 + YgBqtWoAbLpsAHWndQBysHIAcrtyAHi+eABBwkEARchFAE7NTgBO204AVcZVAFTKVABZylkAVtVWAFnS + WQBA4EAAYMdgAGHTYQBq02oAc8JzAHDLcAB7w3sAfs1+AHLTcgBy2XIAe9Z7AH7cfgBg6mAAcONwAIGC + gQCMjIwAlJSUAJaYlgCZmZkAjqGOAIm2iQCYp5gAlriWAKKiogChqaEAq6urAKi3qAC4uLgAg8WDAIPK + gwCLy4sAgNWAAIHcgQCM1IwAi9yLAJHFkQCQzJAAn8efAJnLmQCX1ZcAgOaAAJLhkgCb45sAkPCQAKfE + pwCi1qIAp9qnAKnVqQCr2qsAvMK8ALHTsQC02rQAvNa8ALveuwCl46UAsOKwALLssgC55LkAuey5AMPE + wwDNzc0AwtnCANXV1QDa2toAxOXEAMLrwgDL48sAzOjMAMjwyADU69QA2vLaAOTk5ADs7OwA5fPlAOD5 + 4ADr9esA7vnuAPLy8gDy+vIA/v7+AAAAAAD///////////////////////////////////////////// + /////////////////////////////////////////8mikGcvJRwcJCw0j5zJ//////////////////// + /////////////////////8miZyMgHR0dHBwcFxcXFxYZNJzJ//////////////////////////////// + ///JnWAhISAgIB0dHRwcHBcXFxcWFhYsnMn//////////////////////////////6JjQUEhISEgICAd + HR0cHBwXFxcXFhYWFC6c///////////////////////////JlkJCQUFBISEhICAgHR0dHBwcFxcXFxYW + FhQUj8n//////////////////////8V0RUJCQkFBQSEhISAgIB0dHRwcHBcXFxcWFhYUFDPE//////// + ////////////w21FRUVCQkJBQUEhISEgICAdHR0cHBwXFxcXFhYWFBQuwv/////////////////FbUZG + RUVFQkJCQUFBISEhICAgHR0dHBwcFxcXFxYWFhQULsT//////////////8l0UUZGRkVFRUJCQkFBQSEh + ISAgIB0dHRwcHBcXFxcWFhYUFDPJ/////////////5dRUVFGRkZFRUVHTU1NRENBISEgICAdHR0dHiUl + JSQZFxYWFBSP////////////pFJSUVFRRkZIWG1tdJKSbGpjSiEhICAgIigvYGdni2dnLyYZFhQUnP// + ///////JcFJSUlFRUVhtbXSVl5+kpKSfbEwhISAjS2BnjpCdnaKinYssGRYULsn///////+fVVVSUlJS + UVhtbbPd4ujo3d3TpGpJISEjS2Ci2+Hi4uHbxaKLJBYWFJz//////9twVVVVUlJRUVjT+/7+/v7+/v71 + tZNKISAhw/j+/v7+/v7+/sOOJxYWFizJ/////7NWVlVVUkZFbfT+/v7+/v7+/v71pJNBICLs/v7+/v7+ + /v7+/qKOJxcWFhac/////4hWVlZVUUJK6vz+/v7tyL69yP7vlGogHsn2/v7+9sq+vcT874tnJxcXFhY0 + ////23h2VlZSQiCc6vz+/u3ANxANKsCkT0Icj8r2/v7tyDoQDRG92ygvJRcXFxYZyf//tXZ2dlZGICzA + 6v7+/NsiFgQDAxtgQR0bvsr8/v7sLBMBAAAGNBwfHhcXFxcWnP//q3d2dlVCHDrA7f7++1hCIR0XFx0g + IBYqvur+/v5sHRcUFBMUFhwcHBwXFxcXj///iHd3dlIhFDnA9v7+1lxSRkVCQkJBHBM3vu3+/uhKQSAd + HRwcHBwdHBwcFxcXNP//hHd3d1EdFTnA/P7+sYZcUlFRRkZBFwM4vvb+/sxqYUEhISAgHR0dHRwcHBcX + LP//fnl3d0YcCDjA/v7+q6dvUlJRUVFBFgE2vvz+/qSSYUEhISEgICAdHR0cHBwXJP//eXl5d0YXCDbA + /v77satvUlJSUVFBFAI1vv7+/p+XY0FBISEhICAgHR0dHBwcHP//enl5eUYXCDXA/v7+t65wVVJSUlFB + FAI1vf7+/rOfakRBQSEhISAgIB0dHRwcHP//fnp5eUYXCDW+/v7+z7KIV1VSUlFBFAE1Pvz+/t2zkk1B + QUEhISEgICAdHR0cJf//hXp6eVEXBTU+/P7+2c+ub1VVVVJFFwE1Oe3+/ujMn2NEQUFBQSEhICAgHR0d + L///iXp6elIcAxE46v7+9dnPp4RcXG9SIAEQNcj+/vjWzJdtT0xhYUxJISAgIB0dZ///rnp6elYhAxA1 + vv7+/ujZz66np6unURMINT7+/v7v3cyfkpKUl5NjQyEgICAdkP//tX96endFEwU1OOr+/v7o1rexsdnd + hh0BETXI/v7+79a1n5/M76RsSiEhICAgov//24F/enlVHQMQNT7t/v7++Ojw+/7wrkUBCDU46v7+/vjv + 6Pj++LWTTCEhISAjyf///4l/f3p3RRQDETU56v7+/v7+/v7oq1UWARA1OMj+/v7+/v7+9Z+SSkEhISFn + /////7d/f396ViEEAxA1Nb3J7e32/v7ZiFchBAENNTU+yOzt7fz+73RqTUFBISGi/////9uFf39/eVUh + EwMIETU1ODk+vsmIXFdGHQQBAhA1NTY5Ob3En01PREFBQWDJ//////+yf39/enlVQhcDAwUICAgaF0FR + VlZVRiEWAwEBBwcHCBUXIUJHQkJBQZ3////////bin9/f3p5dlFBHRcXFxcdIUZSVlZWVVFCIBcUFBQU + FhcgQUJFQkJCY8n/////////t4B/f39/enl2VVJRRlFRUlVWVlZWVlVSUUVCQSEhQUFCRUVFRUJCov// + /////////66Af39/f3p6enp5eXl3d3d2dnZWVlZVVVVSUlJRUVFGRkZFRUWW/////////////9uJgH9/ + f396enp6eXl5d3d3dnZ2VlZWVVVVUlJSUVFRRkZGRXTJ///////////////TioB/f39/enp6enl5eXd3 + d3Z2dlZWVlVVVVJSUlFRUUZGbcX/////////////////04qAf39/f3p6enp5eXl3d3d2dnZWVlZVVVVS + UlJRUVFtw////////////////////9OJgH9/f396enp6eXl5d3d3dnZ2VlZWVVVVUlJSUXTF//////// + ///////////////broB/f39/enp6enl5eXd3d3Z2dlZWVlVVVVJSl8n///////////////////////// + /7eKf39/f3p6enp5eXl3d3d2dnZWVlZVVXCk///////////////////////////////bsoV/f396enp6 + eXl5d3d3dnZ2VlZwn8n//////////////////////////////////9u3iYF/enp6enl5eXd3d3Z4iLPb + /////////////////////////////////////////9u1romFfnp5foSIq7Xb//////////////////// + //////////////////////////////////////////////////////////////////////////8AAP// + gAH//wAA//wAAD//AAD/8AAAD/8AAP/gAAAH/wAA/4AAAAH/AAD/AAAAAP8AAP4AAAAAfwAA/AAAAAA/ + AAD4AAAAAB8AAPgAAAAAHwAA8AAAAAAPAADgAAAAAAcAAOAAAAAABwAAwAAAAAADAADAAAAAAAMAAMAA + AAAAAwAAgAAAAAABAACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAACAAAAAAAEAAIAAAAAAAQAAgAAAAAAB + AACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAACAAAAAAAEAAMAA + AAAAAwAAwAAAAAADAADAAAAAAAMAAOAAAAAABwAA4AAAAAAHAADwAAAAAA8AAPgAAAAAHwAA+AAAAAAf + AAD8AAAAAD8AAP4AAAAAfwAA/wAAAAD/AAD/gAAAAf8AAP/gAAAH/wAA//AAAA//AAD//AAAP/8AAP// + gAH//wAA////////AAAoAAAAIAAAAEAAAAABAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACMAAAAr + AAAMLQwAADMAAAA7AAAJNQkACDkIABAuEAARNREAEjkSABgyGAAYOBgAIC4gACAyIAAkOyQAKDcoACg6 + KAAzPDMAOT05AABDAAAATAAADkQOAABTAAAAWwAACVUJAAtaCwATRhMAElcSAABjAAAAawAACmYKAAxp + DAAAcwAAAHsAAAxyDAAMewwAEmISABNpEwAZZBkAG2sbABV2FQA6SToANVI1ACJmIgAiaiIAKGcoAC5o + LgAjdyMAI30jAC10LQAreSsAO287ADh2OABAQEAATE1MAEhaSABSUlIAXFxcAE1kTQBId0gAXWJdAFp+ + WgBpaWkAcnJyAHx8fAAAgwAAAIsAAAuECwALiwsAAJIAAACbAAAJkgkACp0KABODEwAUihQAG4EbAByL + HAARkREAEZ0RABqVGgAZmRkAAKMAAACsAAALogsACagJAACzAAAAvAAAC7kLABSlFAAUsRQAEboRAB22 + HQAZuRkAI4EjACKKIgAshCwALIksACOSIwAhmyEAKZQpACqcKgAzgzMANYo1ADuGOwA7izsANJc0ADKd + MgA9lj0AO5w7ACmlKQAitSIAIbshACq5KgAyozIAMasxADyiPAA7qDsAOL44AADEAAAAywAADsUOAADT + AAAA2wAADtQOAA7bDgASwxIAE9QTAADjAAAA6gAADuEOAAvpCwAA8QAAKMcoACbcJgA0wTQAMsoyADvG + OwA32DcAJ+EnAEKGQgBEiUQAS4xLAE2STQBVhVUAVZVVAEKjQgBDqEMASaRJAEyqTABFtEUAVqtWAFWy + VQBetl4AXbhdAGCIYABinGIAdZN1AGSgZABls2UAYrhiAGq1agBsumwAdad1AHKwcgByu3IAeL54AEHC + QQBFyEUATs1OAE7bTgBVxlUAVMpUAFnKWQBW1VYAWdJZAEDgQABgx2AAYdNhAGrTagBzwnMAcMtwAHvD + ewB+zX4ActNyAHLZcgB71nsAftx+AGDqYABw43AAgYKBAIyMjACUlJQAlpiWAJmZmQCOoY4AibaJAJin + mACWuJYAoqKiAKGpoQCrq6sAqLeoALi4uACDxYMAg8qDAIvLiwCA1YAAgdyBAIzUjACL3IsAkcWRAJDM + kACfx58AmcuZAJfVlwCA5oAAkuGSAJvjmwCQ8JAAp8SnAKLWogCn2qcAqdWpAKvaqwC8wrwAsdOxALTa + tAC81rwAu967AKXjpQCw4rAAsuyyALnkuQC57LkAw8TDAM3NzQDC2cIA1dXVANra2gDE5cQAwuvCAMvj + ywDM6MwAyPDIANTr1ADa8toA5OTkAOzs7ADl8+UA4PngAOv16wDu+e4A8vLyAPL68gD+/v4AAAAAAP// + /////////////////////////////////////////////////////8mikGUoHBwlNI+cyf////////// + /////////////8mdXiEgIB0dHBwXFxYrmsf//////////////////+CiYUFBISEgIB0dHBwXFxYWK5zg + ///////////////JlkVCQkFBISEgIB0dHBwXFxYWFI/J////////////yZRGRUVCQkFBISEgIB0dHBwX + FxYWFDvJ/////////+CXUUZGRUVFREpKSSMhIB0dHx8lJSQZFo/g////////pFJRUUZGTmJxkZORbEwj + IihdZYuLizQmGJz//////8luUlJRUVNYcpWfpKSgk15JXWiQnaKimzQkLcf/////n1VVUlFRUVjM3vTs + 79KWYyNg0uL07OzDjywWmv///9tvVlVSRkVt9P7+/v7+4pRDlvv+/v7+/sONLBcryf//tXZWVlFCI8n+ + /v7gyffNRGbu/v78yeD+jjIlFxac//+qdnZWRR07yv7+kxcUJDIXnO3++ywTBC4cHx8XF4///4d3dnZB + Fjzg/uVGIRwXFBVA7v6gHRYUFhwcHBwXNP//fnd3diATPOv+uXBUQh0TCD/8/nNhIR0dHR0dHBwl//95 + eXd3HQM47v7RrHVRIRMHPv7+npZhISAgIB0dHBz//3p5eXcdAzXr/tm5rG5CFgc8/v7LtZRhSUkjIB0d + HP//fnp5eR0DEsf+89nPrFkgBTju/t7WtZaTbEwjIB0o//+Jenp5IQMQPP7+5dnPrFkUEr7++NbNtcue + bEkgIGX//61/enpFEwUSvv7+8+/7tx0KNcr+++/v/qSTTCEgkP//tn9/elUdAws1QO7+/v65QQEQNcH3 + /v7+l3NMISGi///bhX9/d0YXAwUQNkDJ3nVCFAEIETi+ydZxYURBXsn///+xf396dkYdEwMDExdBRkYh + FAMBAQMWIEJFREGd/////9uKf396d1JFIR0gIUVSUlFCIBwXFx0hQkVCYcn//////7eAf39/enp5eXd3 + dnZWVlVVUlJRUUZGRUWi////////4K2Af39/enp5eXd3dnZWVlVVUlJRUUZGluD/////////26mAf39/ + enp5eXd3dnZWVlVVUlJRUZTJ////////////262Af39/enp5eXd3dnZWVlVVUlKXyf////////////// + 4LeKf39/enp5eXd3dnZWVlVupOD//////////////////9uxhX9/enp5eXd3dnZvn8n///////////// + ///////////btq2Jfnp5foeqtdv///////////////////////////////////////////////////// + /////////8AD//8AAP/8AAA/+AAAH/AAAA/gAAAH4AAAB8AAAAPAAAADgAAAAYAAAAGAAAABgAAAAYAA + AAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABwAAAA8AAAAPgAAAH4AAAB/AAAA/4AAAf/AAAP/8A + AP//wAP//////ygAAAAQAAAAIAAAAAEACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIwAAACsAAAwt + DAAAMwAAADsAAAk1CQAIOQgAEC4QABE1EQASORIAGDIYABg4GAAgLiAAIDIgACQ7JAAoNygAKDooADM8 + MwA5PTkAAEMAAABMAAAORA4AAFMAAABbAAAJVQkAC1oLABNGEwASVxIAAGMAAABrAAAKZgoADGkMAABz + AAAAewAADHIMAAx7DAASYhIAE2kTABlkGQAbaxsAFXYVADpJOgA1UjUAImYiACJqIgAoZygALmguACN3 + IwAjfSMALXQtACt5KwA7bzsAOHY4AEBAQABMTUwASFpIAFJSUgBcXFwATWRNAEh3SABdYl0AWn5aAGlp + aQBycnIAfHx8AACDAAAAiwAAC4QLAAuLCwAAkgAAAJsAAAmSCQAKnQoAE4MTABSKFAAbgRsAHIscABGR + EQARnREAGpUaABmZGQAAowAAAKwAAAuiCwAJqAkAALMAAAC8AAALuQsAFKUUABSxFAARuhEAHbYdABm5 + GQAjgSMAIooiACyELAAsiSwAI5IjACGbIQAplCkAKpwqADODMwA1ijUAO4Y7ADuLOwA0lzQAMp0yAD2W + PQA7nDsAKaUpACK1IgAhuyEAKrkqADKjMgAxqzEAPKI8ADuoOwA4vjgAAMQAAADLAAAOxQ4AANMAAADb + AAAO1A4ADtsOABLDEgAT1BMAAOMAAADqAAAO4Q4AC+kLAADxAAAoxygAJtwmADTBNAAyyjIAO8Y7ADfY + NwAn4ScAQoZCAESJRABLjEsATZJNAFWFVQBVlVUAQqNCAEOoQwBJpEkATKpMAEW0RQBWq1YAVbJVAF62 + XgBduF0AYIhgAGKcYgB1k3UAZKBkAGWzZQBiuGIAarVqAGy6bAB1p3UAcrByAHK7cgB4vngAQcJBAEXI + RQBOzU4ATttOAFXGVQBUylQAWcpZAFbVVgBZ0lkAQOBAAGDHYABh02EAatNqAHPCcwBwy3AAe8N7AH7N + fgBy03IActlyAHvWewB+3H4AYOpgAHDjcACBgoEAjIyMAJSUlACWmJYAmZmZAI6hjgCJtokAmKeYAJa4 + lgCioqIAoamhAKurqwCot6gAuLi4AIPFgwCDyoMAi8uLAIDVgACB3IEAjNSMAIvciwCRxZEAkMyQAJ/H + nwCZy5kAl9WXAIDmgACS4ZIAm+ObAJDwkACnxKcAotaiAKfapwCp1akAq9qrALzCvACx07EAtNq0ALzW + vAC73rsApeOlALDisACy7LIAueS5ALnsuQDDxMMAzc3NAMLZwgDV1dUA2traAMTlxADC68IAy+PLAMzo + zADI8MgA1OvUANry2gDk5OQA7OzsAOXz5QDg+eAA6/XrAO757gDy8vIA8vryAP7+/gAAAAAA//////// + ///////////////////Fm2AiHzGaxP////////+jYkEhIB0cFyuc//////+kU0ZFQSEgHRwXGZz////F + blJRRkVBISAdHBcrxP//sFZa5vDvcWrh7OwcF5r//4R29f7l5pX9/tLsHRwx//97if7nVVKV/tNBISAd + H///fK/+11ZVpv7MRUEhICL//4WK/vl2Vob+5kZFQSFg//+xf9r++f598P70/kVBm///1Yp/u9e8fX23 + zrRGYsX///+3gn96eXd2VlVSU6P//////7eKf3p5d3ZWbqT/////////1bGFfHuEsMX///////////// + ////////////////yW7wD1FR4AdylcADpKCAAUldgAGdooABNCSAAf//gAGfVYABUVGAAczegAHv0sAD + I2DgB/Ts8A+PLP////8oAAAAMAAAAGAAAAABACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAcQAoAG0AXABrAIkAaQCxAGYA0gBkAOoAYQD6AF8A+gBdAOoAWgDSAFgAsQBV + AIkAUwBcAFEAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAewAdAHkAZwB1AKwAcwDtAHEA/wBtAP8AawD/AGkA/wBmAP8AZAD/AGEA/wBf + AP8AXQD/AFoA/wBYAP8AVQD/AFMA7QBRAKwATwBnAE0AHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAIMAIQCBAHgAfQDNAHsA/wB5AP8AdQD/AHMA/wBxAP8AbQD/AGsA/wBp + AP8AZgD/AGQA/wBhAP8AXwD/AF0A/wBaAP8AWAD/AFUA/wBTAP8AUQD/AE8AzQBNAHgASwAhAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiQBgAIUAwgCDAP8AgQD/AH0A/wB7AP8AeQD/AHUA/wBz + AP8AcQD/AG0A/wBrAP8AaQD/AGYA/wBkAP8AYQD/AF8A/wBdAP8AWgD/AFgA/wBVAP8AUwD/AFEA/wBP + AP8ATQDCAEsAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJEAIwCOAJAAiwD7AIkA/wCFAP8AgwD/AIEA/wB9 + AP8AewD/AHkA/wB1AP8AcwD/AHEA/wBtAP8AawD/AGkA/wBmAP8AZAD/AGEA/wBfAP8AXQD/AFoA/wBY + AP8AVQD/AFMA/wBRAP8ATwD/AE0A+wBLAJAASQAjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlgA7AJQAsACRAP8AjgD/AIsA/wCJ + AP8AhQD/AIMA/wCBAP8AfQD/AHsA/wB5AP8AdQD/AHMA/wBxAP8AbQD/AGsA/wBpAP8AZgD/AGQA/wBh + AP8AXwD/AF0A/wBaAP8AWAD/AFUA/wBTAP8AUQD/AE8A/wBNAP8ASwCwAEkAOwAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACcAEIAmQDAAJYA/wCU + AP8AkQD/AI4A/wCLAP8AiQD/AIUA/wCDAP8AgQD/AH0A/wB7AP8AeQD/AHUA/wBzAP8AcQD/AG0A/wBr + AP8AaQD/AGYA/wBkAP8AYQD/AF8A/wBdAP8AWgD/AFgA/wBVAP8AUwD/AFEA/wBPAP8ATQD/AEsAwABJ + AEIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKEAOwCe + AMAAnAD/AJkA/wCWAP8AlAD/AJEA/wCOAP8AiwD/AIkA/wCFAP8AgwD/AIEA/wB9AP8AewD/AHkA/wB1 + AP8AcwD/AHEA/wBtAP8AawD/AGkA/wBmAP8AZAD/AGEA/wBfAP8AXQD/AFoA/wBYAP8AVQD/AFMA/wBR + AP8ATwD/AE0A/wBLAMAASQA7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAApwAjAKQAsAChAP8AngD/AJwA/wCZAP8AlgD/AJQA/wCRAP8AjgD/AIsA/wCJAP8AhQD/AIMA/wCB + AP8AfQD/AHsA/wB5AP8AdQD/AHMA/wBxAP8AbQD/AGsA/wBpAP8AZgD/AGQA/wBhAP8AXwD/AF0A/wBa + AP8AWAD/AFUA/wBTAP8AUQD/AE8A/wBNAP8ASwCwAEkAIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAqQCQAKcA/wCkAP8AoQD/AJ4A/wCcAP8AmQD/AJYA/wKVAv8GlAb/C5ML/xCS + EP8SkRL/EY0R/w+KD/8Khgr/BoAG/wJ8Av8BegH/AHUA/wBzAP8AcQD/AG0A/wBrAP8CagL/BmoG/wpq + Cv8Pag//EmoS/xJoEv8QZBD/C18L/wZZBv8CVAL/AVIB/wBPAP8ATQD/AEsAkAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvAGAArQD7AKkA/wCnAP8ApAD/AKEA/wGeAf8EngT/Cp0K/xWf + Ff8ioiL/MKYw/zqoOv9AqED/QqhC/0CkQP83njf/KJUo/xeJF/8JgAn/AnoC/wB1AP8BdAH/BHME/wpz + Cv8UdxT/IXwh/y6CLv85hzn/P4g//0KIQv9AhkD/OoA6/yt0K/8aZhr/C1oL/wNTA/8ATwD/AE0A+wBL + AGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALUAIQCxAMIArwD/AK0A/wCpAP8ApwD/AaQB/waj + Bv8QpBD/Hacd/yyrLP89rz3/TLRM/1u4W/9kumT/bLxs/3G9cf9wu3D/YbJh/0ChQP8djB3/B38H/wF6 + Af8EdwT/DXoN/xp/Gv8rhiv/O407/0yWTP9Ym1j/YqBi/2qjav9wpXD/cqVy/2acZv9JiEn/Imwi/wpa + Cv8AUQD/AE8A/wBNAMIASwAhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALcAeAC1AP8AsQD/AK8A/wCt + AP8AqQD/AqgC/wemB/8SqBL/IKog/zGvMf9yx3L/qtyq/7Hfsf+24Lb/vOG8/63Zrf+n1qf/jsmO/224 + bf84nTj/EIUQ/wF8Af8EewT/DXwN/xyCHP8viy//cq9y/5/Hn/+w0bD/tdO1/7rVuv+yz7L/p8en/5K6 + kv92pnb/QYNB/xRiFP8AUwD/AFEA/wBPAP8ATQB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAvQAdALkAzQC3 + AP8AtQD/ALEA/wCuAP8AqgD/AKMA/wCiAP8UqxT/jNSM//P68/////////////////////////////// + ////////4PDg/3/Cf/9Jpkn/E4oT/wB5AP8AdgD/AHkA/4m/if/l8eX///////////////////////// + //////////////n8+f+Gsob/Uo9S/xxqHP8AVQD/AFMA/wBRAP8ATwDNAE0AHQAAAAAAAAAAAAAAAAAA + AAAAvwBnAL0A/wC5AP8AtwD/ALQA/wCrAP8AnwD/AJUA/yqiKv/W6db///////////////////////// + ////////////////////////3/Df/3C9cP9JqEn/B4YH/wBwAP8Ocg7/wdbB//////////////////// + //////////////////////////////////9xpnH/T49P/x1tHf8AWAD/AFUA/wBTAP8AUQD/AE8AZwAA + AAAAAAAAAAAAAAAAAAAAwQCsAL8A/wC9AP8AuQD/ALIA/wCiAP8AiwD/F4gX/77Gvv/s7Oz///////// + ////////1tbW/6qqqv+IiIj/gYGB/62trf/7+/v/zenN/0qtSv8xoDH/AHcA/wxmDP+hs6H/4+Pj//// + /////////////+Hh4f+zs7P/jY2N/3x8fP+fn5//7Ozs/8vgy/9GjEb/PIU8/xhsGP8AWgD/AFgA/wBV + AP8AUwD/AFEArAAAAAAAAAAAAAAAAADHACgAxQDtAMEA/wC/AP8AvAD/AKsA/wCOAP8AdAD/eZV5/8DA + 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 + //+54rn/iMyI/2G5Yf8nnSf/B4wH/wGFAf8BgwH/BIME/weBB/8Hfwf/BHsE/wF2Af8AcwD/AHEA/wBt + AP8AawD/AGkA/wBmANIAAAAAAAAAAADfALEA3QD/ANoA/wDYAP8ArwD/AGcA/wA0AP84Pjj/UFBQ/8XF + xf///////////9r22v+b5pv/f95//03OTf8nwif/Gr0a/xy6HP8iuiL/Bq8G/wBzAP8AKwD/LDks/0BA + QP+srKz////////////m9Ob/m9Wb/4XKhf9VtFX/K58r/xuVG/8bkhv/IpQi/yWTJf8gjSD/EoQS/wZ8 + Bv8AdQD/AHMA/wBxAP8AbQD/AGsA/wBpALEAAAAAAAAAAADhAIkA3wD/AN0A/wDaAP8AvgD/AHoA/wA1 + AP8kOyT/QEBA/4+Pj/////////////////+37rf/nead/3/ef/9a0lr/RcpF/0bJRv9SylL/RMRE/wCi + AP8AQwD/GDIY/0BAQP92dnb/+vr6////////////x+jH/6DXoP+EyoT/X7hf/0arRv9DqEP/T6tP/1iu + WP9Kpkr/KZIp/w2CDf8AeQD/AHUA/wBzAP8AcQD/AG0A/wBrAIkAAAAAAAAAAADjAFwA4QD/AN8A/wDd + AP8AywD/AJUA/wBEAP8INgj/QEBA/1BQUP/FxcX////////////5/vn/tO20/5Hjkf9z23P/XtNe/2PT + Y/+b4pv/rOWs/zfAN/8AawD/ACoA/zg9OP9AQED/rKys////////////+f35/8DlwP+V05X/ecV5/164 + Xv9etl7/hceF/8Hhwf9wuXD/QKFA/xWIFf8AewD/AHkA/wB1AP8AcwD/AHEA/wBtAFwAAAAAAAAAAADl + ACgA4wDtAOEA/wDfAP8A1gD/ALEA/wBoAP8ANQD/JDsk/0BAQP9nZ2f/2tra/////////////////+r6 + 6v+67rr/xvDG/+767v//////xu7G/1vNW/8AlQD/AC8A/xQxFP9AQED/U1NT/8TExP////////////// + ///q9+r/xebF/7zivP/k8+T//////+Xz5f97wHv/S6dL/xmNGf8AfQD/AHsA/wB5AP8AdQD/AHMA7QBx + ACgAAAAAAAAAAAAAAAAA5QCsAOMA/wDhAP8A3QD/AMkA/wCUAP8ASAD/ADUA/zQ+NP9AQED/YmJi/7+/ + v///////////////////////////////////////ueu5/1XOVf8AsQD/AFIA/wArAP8oOCj/QEBA/1JS + Uv+tra3//////////////////////////////////////93v3f9muGb/RKZE/xeOF/8AgQD/AH0A/wB7 + AP8AeQD/AHUArAAAAAAAAAAAAAAAAAAAAAAA5wBnAOUA/wDjAP8A4QD/ANgA/wC6AP8AfwD/ADoA/wQ2 + BP8oPCj/QEBA/0NDQ/99fX3/sLCw/9HR0f/Z2dn/4ODg//v7+///////muOa/zfHN/8NuQ3/AHwA/wA6 + AP8AKwD/IDUg/0BAQP9AQED/cXFx/6ioqP/Nzc3/2tra/9vb2//x8fH//////8zozP88pjz/MJ8w/xGN + Ef8AgwD/AIEA/wB9AP8AewD/AHkAZwAAAAAAAAAAAAAAAAAAAAAA6QAdAOcAzQDlAP8A4wD/AOAA/wDU + AP8AswD/AHwA/wBBAP8ANQD/FDgU/zQ+NP9AQED/QEBA/1BQUP9ZWVn/aGho/42Njf+euZ7/PcY9/xO+ + E/8Lugv/AJ4A/wBvAP8APgD/ACsA/wwuDP8sOSz/QEBA/0BAQP9NTU3/WFhY/2JiYv+AgID/naqd/2ex + Z/8QlRD/GJYY/wqOCv8AhQD/AIMA/wCBAP8AfQDNAHsAHQAAAAAAAAAAAAAAAAAAAAAAAAAAAOkAeADn + AP8A5QD/AOMA/wDeAP8A0wD/ALcA/wCKAP8AWwD/ADUA/wA1AP8INgj/EDcQ/xA2EP8ROBH/FUcV/wde + B/8AgAD/AKYA/wC8AP8EugT/ALEA/wCbAP8AeQD/AFIA/wAxAP8AKgD/BCsE/xAvEP8QLhD/EC4Q/xQ4 + FP8ORg7/AFsA/wB5AP8AjQD/B5EH/wSNBP8AiQD/AIUA/wCDAP8AgQB4AAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAOsAIQDpAMIA5wD/AOUA/wDjAP8A3wD/ANYA/wDDAP8ApgD/AIYA/wBrAP8AXgD/AFkA/wBa + AP8AXwD/AGoA/wB+AP8AmAD/AK0A/wC6AP8AvQD/ALgA/wCxAP8AowD/AIwA/wByAP8AWwD/AEwA/wBH + AP8ARwD/AEoA/wBRAP8AXgD/AHAA/wCCAP8AjgD/AJEA/wGOAf8AiwD/AIkA/wCFAMIAgwAhAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAADrAGAA6QD7AOcA/wDlAP8A4wD/AOAA/wDcAP8A0gD/AMMA/wC0 + AP8AqAD/AKEA/wCfAP8AoAD/AKYA/wCuAP8AtwD/AL4A/wC/AP8AvwD/AL0A/wC4AP8AtQD/AK4A/wCh + AP8AlQD/AIoA/wCBAP8AfwD/AH8A/wCBAP8AhwD/AI4A/wCSAP8AlAD/AJMA/wCRAP8AjgD/AIsA+wCJ + AGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6wCQAOkA/wDnAP8A5QD/AOMA/wDh + AP8A3wD/AN0A/wDaAP8A2AD/ANUA/wDTAP8A0QD/AM4A/wDMAP8AyQD/AMcA/wDFAP8AwQD/AL8A/wC9 + AP8AuQD/ALcA/wC1AP8AsQD/AK8A/wCtAP8AqQD/AKcA/wCkAP8AoQD/AJ4A/wCcAP8AmQD/AJYA/wCU + AP8AkQD/AI4AkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7QAjAOsAsADp + AP8A5wD/AOUA/wDjAP8A4QD/AN8A/wDdAP8A2gD/ANgA/wDVAP8A0wD/ANEA/wDOAP8AzAD/AMkA/wDH + AP8AxQD/AMEA/wC/AP8AvQD/ALkA/wC3AP8AtQD/ALEA/wCvAP8ArQD/AKkA/wCnAP8ApAD/AKEA/wCe + AP8AnAD/AJkA/wCWAP8AlACwAJEAIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAO0AOwDrAMAA6QD/AOcA/wDlAP8A4wD/AOEA/wDfAP8A3QD/ANoA/wDYAP8A1QD/ANMA/wDR + AP8AzgD/AMwA/wDJAP8AxwD/AMUA/wDBAP8AvwD/AL0A/wC5AP8AtwD/ALUA/wCxAP8ArwD/AK0A/wCp + AP8ApwD/AKQA/wChAP8AngD/AJwA/wCZAMAAlgA7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAADtAEIA6wDAAOkA/wDnAP8A5QD/AOMA/wDhAP8A3wD/AN0A/wDa + AP8A2AD/ANUA/wDTAP8A0QD/AM4A/wDMAP8AyQD/AMcA/wDFAP8AwQD/AL8A/wC9AP8AuQD/ALcA/wC1 + AP8AsQD/AK8A/wCtAP8AqQD/AKcA/wCkAP8AoQD/AJ4AwACcAEIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7QA7AOsAsADpAP8A5wD/AOUA/wDj + AP8A4QD/AN8A/wDdAP8A2gD/ANgA/wDVAP8A0wD/ANEA/wDOAP8AzAD/AMkA/wDHAP8AxQD/AMEA/wC/ + AP8AvQD/ALkA/wC3AP8AtQD/ALEA/wCvAP8ArQD/AKkA/wCnAP8ApACwAKEAOwAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO0AIwDr + AJAA6QD7AOcA/wDlAP8A4wD/AOEA/wDfAP8A3QD/ANoA/wDYAP8A1QD/ANMA/wDRAP8AzgD/AMwA/wDJ + AP8AxwD/AMUA/wDBAP8AvwD/AL0A/wC5AP8AtwD/ALUA/wCxAP8ArwD/AK0A+wCpAJAApwAjAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAA6wBgAOkAwgDnAP8A5QD/AOMA/wDhAP8A3wD/AN0A/wDaAP8A2AD/ANUA/wDT + AP8A0QD/AM4A/wDMAP8AyQD/AMcA/wDFAP8AwQD/AL8A/wC9AP8AuQD/ALcA/wC1AP8AsQDCAK8AYAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOsAIQDpAHgA5wDNAOUA/wDjAP8A4QD/AN8A/wDd + AP8A2gD/ANgA/wDVAP8A0wD/ANEA/wDOAP8AzAD/AMkA/wDHAP8AxQD/AMEA/wC/AP8AvQD/ALkAzQC3 + AHgAtQAhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6QAdAOcAZwDl + AKwA4wDtAOEA/wDfAP8A3QD/ANoA/wDYAP8A1QD/ANMA/wDRAP8AzgD/AMwA/wDJAP8AxwD/AMUA7QDB + AKwAvwBnAL0AHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAA5QAoAOMAXADhAIkA3wCxAN0A0gDaAOoA2AD6ANUA+gDTAOoA0QDSAM4AsQDM + AIkAyQBcAMcAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////AAD//4AB//8AAP/8AAA//wAA//AAAA// + AAD/4AAAB/8AAP+AAAAB/wAA/wAAAAD/AAD+AAAAAH8AAPwAAAAAPwAA+AAAAAAfAAD4AAAAAB8AAPAA + AAAADwAA4AAAAAAHAADgAAAAAAcAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAIAAAAAAAQAAgAAAAAAB + AACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAACAAAAAAAEAAIAA + AAAAAQAAgAAAAAABAACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAADAAAAAAAMAAMAAAAAAAwAAwAAAAAAD + AADgAAAAAAcAAOAAAAAABwAA8AAAAAAPAAD4AAAAAB8AAPgAAAAAHwAA/AAAAAA/AAD+AAAAAH8AAP8A + AAAA/wAA/4AAAAH/AAD/4AAAB/8AAP/wAAAP/wAA//wAAD//AAD//4AB//8AAP///////wAAKAAAACAA + AABAAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4ABoAdABYAHAAjgBsALwAaADgAGQA9wBgAPcAXQDgAFkAvABV + AI4AUgBYAE8AGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAACEACsAgACAAHwA0QB4AP8AdAD/AHAA/wBsAP8AaAD/AGQA/wBg + AP8AXQD/AFkA/wBVAP8AUgDRAE8AgABMACsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAACRAAEAjQBoAIgAzQCEAP8AgAD/AHwA/wB4AP8AdAD/AHAA/wBs + AP8AaAD/AGQA/wBgAP8AXQD/AFkA/wBVAP8AUgD/AE8AzQBMAGgASQABAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmQAYAJUAjACRAP8AjQD/AIgA/wCEAP8AgAD/AHwA/wB4 + AP8AdAD/AHAA/wBsAP8AaAD/AGQA/wBgAP8AXQD/AFkA/wBVAP8AUgD/AE8A/wBMAIwASQAYAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKEAGACdAJgAmQD/AJUA/wCRAP8AjQD/AIgA/wCE + AP8AgAD/AHwA/wB4AP8AdAD/AHAA/wBsAP8AaAD/AGQA/wBgAP8AXQD/AFkA/wBVAP8AUgD/AE8A/wBM + AJgASQAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACqAAEApQCMAKEA/wCdAP8AmQD/AZUB/wOS + A/8HkAf/Do8O/xONE/8VihX/EoUS/w1/Df8HeAf/AnEC/wFtAf8EagT/CWkJ/w9pD/8TaRP/FGYU/xFg + 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 + Pf8ZjBn/AX0B/wB4AP8AdABYAAAAAAAAAAAA6QAaAOYA0QDjAP8A4AD/AMsA/wCdAP8AXQD/ADUA/ww2 + DP8oOyj/SExI/3l5ef+tra3/qdGp/z2/Pf8AjwD/AE0A/wArAP8UMBT/MDow/1ZWVv+Ghob/srmy/5rO + mv82pTb/H5Yf/w+LD/8BgAH/AHwA0QB4ABoAAAAAAAAAAAAAAAAA6QCAAOYA/wDjAP8A2wD/AMUA/wCd + AP8AawD/AEQA/wA0AP8AMwD/AEAA/wBcAP8AggD/AJ4A/wCeAP8AewD/AE4A/wAwAP8AKQD/ACkA/wA4 + AP8AUgD/AHEA/wCIAP8HkAf/BosG/wGEAf8AgACAAAAAAAAAAAAAAAAAAAAAAADtACsA6QDNAOYA/wDi + AP8A2gD/AMoA/wCvAP8AkQD/AHsA/wBvAP8AcAD/AH8A/wCWAP8AqQD/AK4A/wCiAP8AigD/AHEA/wBf + AP8AWQD/AF0A/wBrAP8AfQD/AIsA/wCQAP8BjQH/AIgAzQCEACsAAAAAAAAAAAAAAAAAAAAAAAAAAADt + AGgA6QD/AOYA/wDjAP8A4AD/AN0A/wDZAP8A1QD/ANIA/wDOAP8AygD/AMYA/wDCAP8AvgD/ALoA/wC2 + AP8AsgD/AK4A/wCqAP8ApQD/AKEA/wCdAP8AmQD/AJUA/wCRAP8AjQBoAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAO8AAQDtAIwA6QD/AOYA/wDjAP8A4AD/AN0A/wDZAP8A1QD/ANIA/wDOAP8AygD/AMYA/wDC + AP8AvgD/ALoA/wC2AP8AsgD/AK4A/wCqAP8ApQD/AKEA/wCdAP8AmQD/AJUAjACRAAEAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAO8AGADtAJgA6QD/AOYA/wDjAP8A4AD/AN0A/wDZAP8A1QD/ANIA/wDO + AP8AygD/AMYA/wDCAP8AvgD/ALoA/wC2AP8AsgD/AK4A/wCqAP8ApQD/AKEA/wCdAJgAmQAYAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO8AGADtAIwA6QD/AOYA/wDjAP8A4AD/AN0A/wDZ + AP8A1QD/ANIA/wDOAP8AygD/AMYA/wDCAP8AvgD/ALoA/wC2AP8AsgD/AK4A/wCqAP8ApQCMAKEAGAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO8AAQDtAGgA6QDNAOYA/wDj + AP8A4AD/AN0A/wDZAP8A1QD/ANIA/wDOAP8AygD/AMYA/wDCAP8AvgD/ALoA/wC2AP8AsgDNAK4AaACq + AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADt + ACsA6QCAAOYA0QDjAP8A4AD/AN0A/wDZAP8A1QD/ANIA/wDOAP8AygD/AMYA/wDCAP8AvgDRALoAgAC2 + ACsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAA6QAaAOYAWADjAI4A4AC8AN0A4ADZAPcA1QD3ANIA4ADOALwAygCOAMYAWADC + ABoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//////8AD//8A + AP/8AAA/+AAAH/AAAA/gAAAH4AAAB8AAAAPAAAADgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAA + AAGAAAABgAAAAYAAAAGAAAABwAAAA8AAAAPgAAAH4AAAB/AAAA/4AAAf/AAAP/8AAP//wAP//////ygA + AAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH + ADQAfgCAAHUAwABtAO0AZQDtAF0AwABVAIAATQA0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACZ + AGcAkADVAIcA/wB+AP8AdQD/AG0A/wBlAP8AXQD/AFUA1QBNAGcAAAAAAAAAAAAAAAAAAAAAAAAAAACr + AGcAogDxAJkA/wCQAP8AhwD/AH4A/wB1AP8AbQD/AGUA/wBdAP8AVQDxAE0AZwAAAAAAAAAAAAAAAAC9 + ADQAtADVAKsA/wCiAP8AmQD/AJAA/wCHAP8AfgD/AHUA/wBtAP8AZQD/AF0A/wBVANUATQA0AAAAAAAA + AAAAxQCAAL0A/xC5EP+w5bD/wOjA/8DmwP8wpTD/MJ4w/7DXsP/A3cD/wNvA/wBlAP8AXQD/AFUAgAAA + AAAAAAAAAM0AwADFAP/Q89D//////6DgoP+w4rD/QLNA//D48P//////kMeQ/8DdwP8AbQD/AGUA/wBd + AMAAAAAAAAAAAADVAO0w1jD//////7DrsP8AtAD/AKsA/0C5QP//////kM+Q/wCHAP8AfgD/AHUA/wBt + AP8AZQDtAAAAAAAAAAAA3QDtQOBA//////+A4oD/AL0A/wC0AP9AwED//////4DMgP8AkAD/AIcA/wB+ + AP8AdQD/AG0A7QAAAAAAAAAAAOUAwCDhIP//////4Png/wDFAP8AvQD/MMIw//////+w4rD/AJkA/wCQ + AP8AhwD/AH4A/wB1AMAAAAAAAAAAAADrAIAA5QD/kPCQ///////g+eD//////xDBEP/A7MD//////9Du + 0P//////AJAA/wCHAP8AfgCAAAAAAAAAAAAA8QA0AOsA1QDlAP9g6mD/gOqA/3DjcP8QyRD/EMEQ/3DV + cP+A1YD/cMtw/wCZAP8AkADVAIcANAAAAAAAAAAAAAAAAADxAGcA6wDxAOUA/wDdAP8A1QD/AM0A/wDF + AP8AvQD/ALQA/wCrAP8AogDxAJkAZwAAAAAAAAAAAAAAAAAAAAAAAAAAAPEAZwDrANUA5QD/AN0A/wDV + AP8AzQD/AMUA/wC9AP8AtADVAKsAZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8QA0AOsAgADl + AMAA3QDtANUA7QDNAMAAxQCAAL0ANAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8AAPAPAADgBwArwAMAzYAB + AP+AAQD/gAEA/4ABA/+AAQv/gAEb/4ABMf+AAUn/wANg/+AHc//wD3j///9q/w== + + + \ No newline at end of file Index: CCTrayExtensions/WcfExtension.cs =================================================================== --- CCTrayExtensions/WcfExtension.cs (revision 0) +++ CCTrayExtensions/WcfExtension.cs (revision 0) @@ -0,0 +1,134 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.ServiceModel; +using System.ServiceModel.Channels; +using System.Text; +using System.Windows.Forms; +using ThoughtWorks.CruiseControl.CCTrayLib.Configuration; +using ThoughtWorks.CruiseControl.CCTrayLib.Monitoring; + +namespace ThoughtWorks.CruiseControl.CCTrayExtensions +{ + public class WcfExtension + : ITransportExtension + { + private Dictionary _projectManagers = new Dictionary(); + private WcfServerManager _serverManager; + private string _settings; + + public string DisplayName + { + get { return string.Format("{0}: {1}", this.Binding, this.Url); } + } + + public string Settings + { + get { return _settings; } + set + { + this._settings = value; + this.Binding = (TransportBinding)Enum.Parse(typeof(TransportBinding), value); + } + } + + public TransportBinding Binding { get; protected internal set; } + public string Url { get; set; } + + public CCTrayProject[] GetProjectList(BuildServer server) + { + var client = OpenClient(); + try + { + var projects = client.RetrieveProjects(); + var projectList = from project in projects + select new CCTrayProject(server, project.Name); + return projectList.ToArray(); + } + finally + { + client.Close(); + } + } + + public ICruiseProjectManager RetrieveProjectManager(string projectName) + { + WcfProjectManager projectManager = null; + if (!_projectManagers.ContainsKey(projectName)) + { + projectManager = new WcfProjectManager(this, projectName); + _projectManagers.Add(projectName, projectManager); + + return projectManager; + } + else + { + return _projectManagers[projectName]; + } + } + + public ICruiseServerManager RetrieveServerManager() + { + if (_serverManager == null) _serverManager = new WcfServerManager(this); + return _serverManager; + } + + public bool Configure(IWin32Window owner) + { + var window = new WcfConfigurationWindow(this); + if (window.ShowDialog(owner) == DialogResult.OK) + { + this._settings = this.Binding.ToString(); + return true; + } + else + { + return false; + } + } + + /// + /// Instantiates and opens a new WCF client to the server. + /// + /// + internal WcfClient.CruiseControlContractClient OpenClient() + { + System.ServiceModel.Channels.Binding binding = null; + switch (this.Binding) + { + case TransportBinding.BasicHttp: + binding = new BasicHttpBinding(); + break; + case TransportBinding.NetTcp: + binding = new NetTcpBinding(); + break; + case TransportBinding.WSHttp: + binding = new WSHttpBinding(); + break; + case TransportBinding.NamedPipes: + binding = new NetNamedPipeBinding(); + break; + default: + throw new NotImplementedException("Unknown transport protocol: " + this.Binding.ToString()); + } + var endPoint = new EndpointAddress(Url); + var newClient = new WcfClient.CruiseControlContractClient(binding, endPoint); + newClient.Open(); + return newClient; + } + + /// + /// Helper method for closing a client. + /// + /// The client to close. + internal void CloseClient(WcfClient.CruiseControlContractClient client) + { + if ((client.State != CommunicationState.Closed) && + (client.State != CommunicationState.Closing) && + (client.State != CommunicationState.Faulted)) + { + client.Close(); + } + } + } +} Index: CCTrayExtensions/WcfHelpers.cs =================================================================== --- CCTrayExtensions/WcfHelpers.cs (revision 0) +++ CCTrayExtensions/WcfHelpers.cs (revision 0) @@ -0,0 +1,67 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using ThoughtWorks.CruiseControl.Remote; + +namespace ThoughtWorks.CruiseControl.CCTrayExtensions +{ + /// + /// Helper class for working with a WCF client. + /// + internal static class WcfHelpers + { + /// + /// Helper method for generating a dicitionary of project activities to use in mappings. + /// + /// + internal static Dictionary GenerateActivityDictionary() + { + var dictionary = new Dictionary(); + dictionary.Add(ProjectActivity.Building.ToString(), ProjectActivity.Building); + dictionary.Add(ProjectActivity.CheckingModifications.ToString(), ProjectActivity.CheckingModifications); + dictionary.Add(ProjectActivity.Pending.ToString(), ProjectActivity.Pending); + dictionary.Add(ProjectActivity.Sleeping.ToString(), ProjectActivity.Sleeping); + return dictionary; + } + + /// + /// Concerts a WCF snapshot to the cruise server snapshot. + /// + /// + /// + internal static CruiseServerSnapshot ConvertSnapshotFromWcf(WcfClient.Snapshot snapshot) + { + // Convert the projects statuses + var activityDictionary = GenerateActivityDictionary(); + var projectStatuses = from project in snapshot.Projects + select new ProjectStatus(project.Name, + project.Category, + activityDictionary[project.Activity], + (IntegrationStatus)Enum.Parse(typeof(IntegrationStatus), project.BuildStatus), + (ProjectIntegratorState)Enum.Parse(typeof(ProjectIntegratorState), project.ProjectStatus), + project.WebUrl, + project.LastBuildTime, + project.LastBuildLabel, + project.LastSuccessfulBuildLabel, + project.NextBuildTime, + project.BuildStage); + + // Convert the queues + var queueSnapshot = new QueueSetSnapshot(); + foreach (var queue in snapshot.Queues) + { + var newQueue = new QueueSnapshot(queue.Name); + queueSnapshot.Queues.Add(newQueue); + foreach (var request in queue.Requests) + { + var activity = activityDictionary[request.Activity]; + newQueue.Requests.Add(new QueuedRequestSnapshot(request.ProjectName, activity)); + } + } + + var newSnapshot = new CruiseServerSnapshot(projectStatuses.ToArray(), queueSnapshot); + return newSnapshot; + } + } +} Index: CCTrayExtensions/WcfProjectManager.cs =================================================================== --- CCTrayExtensions/WcfProjectManager.cs (revision 0) +++ CCTrayExtensions/WcfProjectManager.cs (revision 0) @@ -0,0 +1,130 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using ThoughtWorks.CruiseControl.CCTrayLib.Monitoring; + +namespace ThoughtWorks.CruiseControl.CCTrayExtensions +{ + public class WcfProjectManager + : ICruiseProjectManager + { + private WcfExtension _extension; + private string _name; + private DateTime _cacheExpiry = DateTime.MinValue; + private WcfClient.Project _projectDetails; + + public WcfProjectManager(WcfExtension extension, string projectName) + { + this._extension = extension; + this._name = projectName; + } + + public void ForceBuild() + { + var client = _extension.OpenClient(); + try + { + client.ForceBuild(_name); + } + finally + { + _extension.CloseClient(client); + } + } + + public void FixBuild(string fixingUserName) + { + var client = _extension.OpenClient(); + try + { + client.FixBuild(_name); + } + finally + { + _extension.CloseClient(client); + } + } + + public void AbortBuild() + { + var client = _extension.OpenClient(); + try + { + client.AbortBuild(_name); + } + finally + { + _extension.CloseClient(client); + } + } + + public void StopProject() + { + var client = _extension.OpenClient(); + try + { + client.StopProject(_name); + } + finally + { + _extension.CloseClient(client); + } + } + + public void StartProject() + { + var client = _extension.OpenClient(); + try + { + client.StartProject(_name); + } + finally + { + _extension.CloseClient(client); + } + } + + public void CancelPendingRequest() + { + var client = _extension.OpenClient(); + try + { + client.CancelPendingRequest(_name); + } + finally + { + _extension.CloseClient(client); + } + } + + public string ProjectName + { + get { return this._name; } + } + + public string ProjectIntegratorState + { + get { return RetrieveProject().ProjectStatus; } + } + + private WcfClient.Project RetrieveProject() + { + // Cache the project so we are not calling the web service multiple times for an update + if (DateTime.Now > _cacheExpiry) + { + var client = _extension.OpenClient(); + try + { + _projectDetails = client.RetrieveProject(_name); + _cacheExpiry = DateTime.Now.AddSeconds(5); + } + finally + { + _extension.CloseClient(client); + } + } + return _projectDetails; + } + } +} Index: CCTrayExtensions/WcfServerManager.cs =================================================================== --- CCTrayExtensions/WcfServerManager.cs (revision 0) +++ CCTrayExtensions/WcfServerManager.cs (revision 0) @@ -0,0 +1,59 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using ThoughtWorks.CruiseControl.CCTrayLib.Configuration; +using ThoughtWorks.CruiseControl.Remote; +using ThoughtWorks.CruiseControl.CCTrayLib.Monitoring; + +namespace ThoughtWorks.CruiseControl.CCTrayExtensions +{ + public class WcfServerManager + : ICruiseServerManager + { + private WcfExtension _extension; + + public WcfServerManager(WcfExtension extension) + { + this._extension = extension; + } + + public string ServerUrl + { + get { return _extension.Url; } + } + + public string DisplayName + { + get { return _extension.DisplayName; } + } + + public BuildServerTransport Transport + { + get { return BuildServerTransport.Extension; } + } + + public void CancelPendingRequest(string projectName) + { + throw new NotImplementedException(); + } + + /// + /// Retrieve a snapshot of the current status of the server. + /// + /// + public CruiseServerSnapshot GetCruiseServerSnapshot() + { + var client = _extension.OpenClient(); + try + { + var snapshot = client.RetrieveSnapshot(); + return WcfHelpers.ConvertSnapshotFromWcf(snapshot); + } + finally + { + _extension.CloseClient(client); + } + } + } +} Index: core/configuration/ServerConfigurationHandler.cs =================================================================== --- core/configuration/ServerConfigurationHandler.cs (revision 0) +++ core/configuration/ServerConfigurationHandler.cs (revision 0) @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; +using System.Configuration; +using System.Xml; +using ThoughtWorks.CruiseControl.Remote; + +namespace ThoughtWorks.CruiseControl.Core.Config +{ + /// + /// Provides additional configuration settings for the server. + /// + /// + /// Currently this only retrieves a list of type names, but it could be extended in future + /// to load additional settings (perhaps in the same way as the custom builders work). + /// + public sealed class ServerConfigurationHandler + : IConfigurationSectionHandler + { + #region Create() + /// + /// Retrieve the list of extensions to load. + /// + /// The parent. + /// The context. + /// The section that is being loaded. + /// An array of strings containing the type names. + public object Create(object parent, object configContext, XmlNode section) + { + List extensions = new List(); + + foreach (XmlNode node in section.SelectNodes("extension")) + { + ExtensionConfiguration config = new ExtensionConfiguration(); + config.Type = node.Attributes["type"].Value; + extensions.Add(config); + } + + return extensions; + } + #endregion + } +} Index: Remote/ExtensionConfiguration.cs ==================================================