Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / Services / Messaging / System / Messaging / MessageQueueInstaller.cs / 1305376 / MessageQueueInstaller.cs
//------------------------------------------------------------------------------ //// Copyright (c) Microsoft Corporation. All rights reserved. // //----------------------------------------------------------------------------- /* */ namespace System.Messaging { using System.ComponentModel; using System.Diagnostics; using System; using System.Configuration.Install; using System.Collections; using Microsoft.Win32; ////// /// public class MessageQueueInstaller : ComponentInstaller { private bool authenticate = false; private short basePriority = (short)0; private Guid category = Guid.Empty; private System.Messaging.EncryptionRequired encryptionRequired = System.Messaging.EncryptionRequired.Optional; private string label = String.Empty; private long maximumJournalSize = UInt32.MaxValue; private long maximumQueueSize = UInt32.MaxValue; private string multicastAddress = String.Empty; private string path = String.Empty; private bool transactional = false; private bool useJournalQueue = false; private AccessControlList permissions = null; private UninstallAction uninstallAction = System.Configuration.Install.UninstallAction.Remove; ///Allows you to install and configure a queue that your /// application needs in order to run. This class is called by the installation /// utility, installutil.exe, when installing a ////// . /// Do we install the /// backend queue resource or some MessageQueue object. I.e. is this creating a /// new backend queue resource? Do we need to say anthing about checking for Path /// existence? /// ////// /// public MessageQueueInstaller() : base() { } ///[To be supplied.] ////// /// public MessageQueueInstaller(MessageQueue componentToCopy) : base() { InternalCopyFromComponent(componentToCopy); } ////// /// [DefaultValue(false)] public bool Authenticate { get { return authenticate; } set { authenticate = value; } } ///Indicates whether the queue to be installed only accepts authenticated messages. ////// /// [DefaultValue(0)] public short BasePriority { get { return basePriority; } set { basePriority = value; } } ////// Indicates the base priority used /// to route a public queue's messages over the network. ////// /// [TypeConverterAttribute("System.ComponentModel.GuidConverter, " + AssemblyRef.System)] public Guid Category { get { return category; } set { category = value; } } ////// Indicates an implementation-specific queue type. ////// Wording. Shorter /// ("Indicates the queue's type") better here? /// ////// /// [DefaultValue(EncryptionRequired.Optional)] public EncryptionRequired EncryptionRequired { get { return encryptionRequired; } set { if (!ValidationUtility.ValidateEncryptionRequired(value)) throw new InvalidEnumArgumentException("value", (int)value, typeof(EncryptionRequired)); encryptionRequired = value; } } ///Indicates whether the queue only accepts private /// (encrypted) messages. ////// /// [DefaultValue("")] public string Label { get { return label; } set { if (value == null) throw new ArgumentNullException("value"); label = value; } } ///Indicates a description of the queue. ////// /// [ TypeConverterAttribute(typeof(System.Messaging.Design.SizeConverter)) ] public long MaximumJournalSize { get { return maximumJournalSize; } set { if (value < 0) throw new ArgumentException(Res.GetString(Res.InvalidMaxJournalSize)); maximumJournalSize = value; } } ///Indicates the maximum size of the journal associated with the queue. ////// /// [ TypeConverterAttribute(typeof(System.Messaging.Design.SizeConverter)), ] public long MaximumQueueSize { get { return maximumQueueSize; } set { if (value < 0) throw new ArgumentException(Res.GetString(Res.InvalidMaxQueueSize)); maximumQueueSize = value; } } ///Indicates the the maximum size of the queue. ////// /// [DefaultValue("")] public string MulticastAddress { get { if (!MessageQueue.Msmq3OrNewer) //this feature is unavailable on win2k throw new PlatformNotSupportedException(Res.GetString(Res.PlatformNotSupported)); return multicastAddress; } set { if (value == null) throw new ArgumentNullException("value"); if (!MessageQueue.Msmq3OrNewer) //this feature is unavailable on win2k throw new PlatformNotSupportedException(Res.GetString(Res.PlatformNotSupported)); multicastAddress = value; } } ///Gets or sets the IP multicast address associated with the queue. ////// /// [ Editor("System.Messaging.Design.QueuePathEditor", "System.Drawing.Design.UITypeEditor, " + AssemblyRef.SystemDrawing), DefaultValue(""), TypeConverter("System.Diagnostics.Design.StringValueConverter, " + AssemblyRef.SystemDesign) ] public string Path { get { return path; } set { if (!MessageQueue.ValidatePath(value, true)) throw new ArgumentException(Res.GetString(Res.PathSyntax)); if (value == null) throw new ArgumentNullException("value"); this.path = value; } } ////// Indicates the /// location of /// the queue that /// will /// be referenced by this object. . ////// /// [Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] public AccessControlList Permissions { get { return permissions; } set { permissions = value; } } ///[To be supplied.] ////// /// If a queue is transactional, it can only accept messages that are sent as part /// of a transaction. However, messages can be retrieved from a local transaction /// queue with or without using a transaction. /// [DefaultValue(false)] public bool Transactional { get { return transactional; } set { transactional = value; } } ////// /// [DefaultValue(UninstallAction.Remove)] public UninstallAction UninstallAction { get { return uninstallAction; } [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1803:AvoidCostlyCallsWherePossible")] set { if (!Enum.IsDefined(typeof(UninstallAction), value)) throw new InvalidEnumArgumentException("value", (int)value, typeof(UninstallAction)); uninstallAction = value; } } ///Indicates what the installer does with the queue at uninstall time: remove it, restore it /// to its pre-installation state, or leave it in its current installed state. ////// /// [DefaultValue(false)] public bool UseJournalQueue { get { return useJournalQueue; } set { useJournalQueue = value; } } ///Indicates whether messages retrieved from the queue are also copied to the /// associated journal queue. ////// /// public override void Commit(IDictionary savedState) { base.Commit(savedState); Context.LogMessage(Res.GetString(Res.ClearingQueue, Path)); // make sure the queue is empty // we don't do this in Install because it can't be undone. MessageQueue queue = new MessageQueue(path); queue.Purge(); } ///Completes the installation process by committing ////// installation information that was written to the registry by the /// method. This method is meant to be used by installation tools, which /// process the appropriate methods automatically. /// /// public override void CopyFromComponent(IComponent component) { InternalCopyFromComponent(component); } private void InternalCopyFromComponent(IComponent component) { MessageQueue queue = component as MessageQueue; if (queue == null) throw new ArgumentException(Res.GetString(Res.NotAMessageQueue)); if (queue.Path != null && queue.Path != string.Empty) Path = queue.Path; else throw new ArgumentException(Res.GetString(Res.IncompleteMQ)); } ///Copies the property values of a ////// component to this /// . /// /// public override void Install(IDictionary stateSaver) { base.Install(stateSaver); Context.LogMessage(Res.GetString(Res.CreatingQueue, Path)); bool exists = MessageQueue.Exists(path); stateSaver["Exists"] = exists; MessageQueue queue = null; if (!exists) queue = MessageQueue.Create(Path, Transactional); else { // it exists. If it's got the right transactional property, we're OK. // Otherwise we have to recreate. queue = new MessageQueue(Path); // save off the properties for rollback stateSaver["Authenticate"] = queue.Authenticate; stateSaver["BasePriority"] = queue.BasePriority; stateSaver["Category"] = queue.Category; stateSaver["EncryptionRequired"] = queue.EncryptionRequired; stateSaver["Label"] = queue.Label; stateSaver["MaximumJournalSize"] = queue.MaximumJournalSize; stateSaver["MaximumQueueSize"] = queue.MaximumQueueSize; stateSaver["Path"] = queue.Path; stateSaver["Transactional"] = queue.Transactional; stateSaver["UseJournalQueue"] = queue.UseJournalQueue; if (MessageQueue.Msmq3OrNewer) //this feature is unavailable on win2k stateSaver["MulticastAddress"] = queue.MulticastAddress; if (queue.Transactional != Transactional) { // Messages won't be kept. MessageQueue.Delete(Path); queue = MessageQueue.Create(Path, Transactional); } } // now change all the properties to how we want them. queue.Authenticate = Authenticate; queue.BasePriority = BasePriority; queue.Category = Category; queue.EncryptionRequired = EncryptionRequired; queue.Label = Label; queue.MaximumJournalSize = MaximumJournalSize; queue.MaximumQueueSize = MaximumQueueSize; queue.UseJournalQueue = UseJournalQueue; if (MessageQueue.Msmq3OrNewer) //this feature is unavailable on win2k queue.MulticastAddress = MulticastAddress; if (permissions != null) queue.SetPermissions(permissions); } ///Writes message queue information to the registry. This method is meant to be /// used by installation tools, which process the appropriate methods /// automatically ////// /// public override bool IsEquivalentInstaller(ComponentInstaller otherInstaller) { MessageQueueInstaller other = otherInstaller as MessageQueueInstaller; if (other == null) return false; return other.Path == Path; } ///[To be supplied.] ////// /// Called by Rollback and Uninstall to restore a queue to its state prior to Install /// private void RestoreQueue(IDictionary state) { bool exists = false; if (state != null && state["Exists"] != null) exists = (bool) state["Exists"]; else // this can only happen at uninstall - the user might have deleted the .InstallState // file since Install ran. It's probably best to leave things the way they are. return; if (exists) { Context.LogMessage(Res.GetString(Res.RestoringQueue, Path)); // the queue existed before install. Restore the properties MessageQueue queue = null; // first, restore the queue with the right Transactional property if (!MessageQueue.Exists(Path)) { // weird, but possible: the queue used to exist, but it doesn't now. // put it back queue = MessageQueue.Create(Path, (bool) state["Transactional"]); } else { queue = new MessageQueue(Path); if (queue.Transactional != (bool) state["Transactional"]) { // the transactional property doesn't match. Recreate so it does MessageQueue.Delete(Path); queue = MessageQueue.Create(Path, (bool) state["Transactional"]); } } // now change all the other properties to how they were. queue.Authenticate = (bool) state["Authenticate"]; queue.BasePriority = (short) state["BasePriority"]; queue.Category = (Guid) state["Category"]; queue.EncryptionRequired = (EncryptionRequired) state["EncryptionRequired"]; queue.Label = (string) state["Label"]; queue.MaximumJournalSize = (long) state["MaximumJournalSize"]; queue.MaximumQueueSize = (long) state["MaximumQueueSize"]; if (MessageQueue.Msmq3OrNewer) //this feature is unavailable on win2k queue.MulticastAddress = (string) state["MulticastAddress"]; queue.UseJournalQueue = (bool) state["UseJournalQueue"]; queue.ResetPermissions(); } else { Context.LogMessage(Res.GetString(Res.RemovingQueue, Path)); // it wasn't there before install, so let's make sure it still isn't if (MessageQueue.Exists(path)) MessageQueue.Delete(path); } } ////// /// public override void Rollback(IDictionary savedState) { base.Rollback(savedState); RestoreQueue(savedState); } ///Rolls back queue information that was written to the registry /// by the installation procedure. This method is meant to be used by installation /// tools, which process the appropriate methods automatically. ////// /// private bool ShouldSerializeCategory() { return !Category.Equals(Guid.Empty); } ///Indicates whether the value of the Category property should be persisted in /// generated code. ////// The similar /// "ShouldSerializeServicesDependedOn" in ServiceInstaller had dev comments that /// indicated "persisted in code-gen". Is generated code the operative issue /// here also? /// ////// /// public override void Uninstall(IDictionary savedState) { base.Uninstall(savedState); if (UninstallAction == UninstallAction.Remove) { Context.LogMessage(Res.GetString(Res.DeletingQueue, Path)); if (MessageQueue.Exists(Path)) MessageQueue.Delete(Path); } } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007.Uninstalls the queue by removing information concerning it from the registry. /// If the ///is , /// Uninstall also deletes the queue associated with the .
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- XmlAutoDetectWriter.cs
- DirectoryInfo.cs
- ContentPlaceHolder.cs
- FileUpload.cs
- RelationshipEndMember.cs
- KnownBoxes.cs
- SQLSingle.cs
- BindingList.cs
- WhitespaceSignificantCollectionAttribute.cs
- TextBoxBase.cs
- DesignOnlyAttribute.cs
- XmlnsCache.cs
- FixedPageStructure.cs
- OdbcParameterCollection.cs
- ValueSerializerAttribute.cs
- InheritanceContextChangedEventManager.cs
- MobileDeviceCapabilitiesSectionHandler.cs
- DataGridViewTextBoxEditingControl.cs
- GeneralTransform3D.cs
- OdbcRowUpdatingEvent.cs
- GenericsInstances.cs
- SettingsPropertyWrongTypeException.cs
- FacetValues.cs
- Byte.cs
- XsltException.cs
- ObjectStorage.cs
- InlineUIContainer.cs
- BuilderElements.cs
- OracleException.cs
- ThreadStartException.cs
- OledbConnectionStringbuilder.cs
- AssemblyAssociatedContentFileAttribute.cs
- WindowsGraphicsWrapper.cs
- FtpWebResponse.cs
- CompiledELinqQueryState.cs
- SizeAnimationBase.cs
- RawContentTypeMapper.cs
- TimeEnumHelper.cs
- DataStreams.cs
- FontUnitConverter.cs
- CharConverter.cs
- RSAPKCS1KeyExchangeDeformatter.cs
- WebConfigurationManager.cs
- ContentControl.cs
- PanelStyle.cs
- ServiceMemoryGates.cs
- Win32.cs
- DataGridColumn.cs
- OciEnlistContext.cs
- NotifyIcon.cs
- PageStatePersister.cs
- RadioButtonPopupAdapter.cs
- VisualBasic.cs
- BuildProviderAppliesToAttribute.cs
- DecimalStorage.cs
- MarkupObject.cs
- ImplicitInputBrush.cs
- Console.cs
- WindowsStatusBar.cs
- KnownTypesHelper.cs
- ReadOnlyTernaryTree.cs
- DetailsViewUpdateEventArgs.cs
- VariableQuery.cs
- XmlCompatibilityReader.cs
- DesignerLoader.cs
- TdsParserHelperClasses.cs
- EntityViewContainer.cs
- DecimalConstantAttribute.cs
- ForeignKeyConstraint.cs
- Ipv6Element.cs
- SqlConnectionString.cs
- SafeFindHandle.cs
- SqlBuilder.cs
- FloaterBaseParaClient.cs
- HttpDictionary.cs
- EntityDesignerUtils.cs
- AttachmentService.cs
- Transform.cs
- MissingSatelliteAssemblyException.cs
- StringUtil.cs
- ChtmlImageAdapter.cs
- SiblingIterators.cs
- SystemTcpConnection.cs
- SharedPersonalizationStateInfo.cs
- TextViewSelectionProcessor.cs
- Color.cs
- ValidatorCollection.cs
- MenuBase.cs
- MessageSecurityProtocolFactory.cs
- Vector.cs
- Publisher.cs
- SqlNamer.cs
- Section.cs
- ClientSettings.cs
- DataColumnPropertyDescriptor.cs
- GridViewAutomationPeer.cs
- MenuItem.cs
- ResXResourceWriter.cs
- WebControlsSection.cs
- TdsParserSafeHandles.cs