Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / Services / Messaging / System / Messaging / MessageEnumerator.cs / 1305376 / MessageEnumerator.cs
//------------------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//-----------------------------------------------------------------------------
namespace System.Messaging {
using System.Diagnostics;
using System;
using System.ComponentModel;
using System.Collections;
using System.Messaging.Interop;
///
///
/// Provides (forward-only)
/// cursor semantics to enumerate the messages contained in
/// a queue.
///
/// Translate into English?
///
///
public class MessageEnumerator : MarshalByRefObject, IEnumerator, IDisposable {
private MessageQueue owner;
private CursorHandle handle = System.Messaging.Interop.CursorHandle.NullHandle;
private int index = 0;
private bool disposed = false;
private bool useCorrectRemoveCurrent = false;//needed in fix for 88615
internal MessageEnumerator(MessageQueue owner, bool useCorrectRemoveCurrent) {
this.owner = owner;
this.useCorrectRemoveCurrent = useCorrectRemoveCurrent;
}
///
///
/// Gets the current pointed to
/// by this enumerator.
///
public Message Current {
get {
if (this.index == 0)
throw new InvalidOperationException(Res.GetString(Res.NoCurrentMessage));
return this.owner.ReceiveCurrent(TimeSpan.Zero, NativeMethods.QUEUE_ACTION_PEEK_CURRENT, this.Handle,
this.owner.MessageReadPropertyFilter, null,
MessageQueueTransactionType.None);
}
}
///
///
object IEnumerator.Current {
get {
return this.Current;
}
}
///
///
/// Gets the native Message Queuing cursor handle used to browse messages
/// in the queue.
///
public IntPtr CursorHandle{
get { return this.Handle.DangerousGetHandle(); }
}
internal CursorHandle Handle {
get{
//Cursor handle doesn't demand permissions since GetEnumerator will demand somehow.
if (this.handle.IsInvalid) {
//Cannot allocate the a new cursor if the object has been disposed, since finalization has been suppressed.
if (this.disposed)
throw new ObjectDisposedException(GetType().Name);
CursorHandle result;
int status = SafeNativeMethods.MQCreateCursor(this.owner.MQInfo.ReadHandle, out result);
if (MessageQueue.IsFatalError(status))
throw new MessageQueueException(status);
this.handle = result;
}
return this.handle;
}
}
///
///
///
/// Frees the resources associated with the enumerator.
///
///
public void Close() {
this.index = 0;
if (!this.handle.IsInvalid) {
this.handle.Close();
}
}
///
///
///
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2213:DisposableFieldsShouldBeDisposed")]
public void Dispose() {
Dispose(true);
GC.SuppressFinalize(this);
}
///
///
///
///
///
protected virtual void Dispose(bool disposing) {
this.Close();
this.disposed = true;
}
///
///
///
///
~MessageEnumerator() {
Dispose(false);
}
///
///
/// Advances the enumerator to the next message in the queue, if one
/// is currently available.
///
public bool MoveNext() {
return MoveNext(TimeSpan.Zero);
}
///
///
/// Advances the enumerator to the next message in the
/// queue. If the enumerator is positioned at the end of the queue, waits until a message is available or the
/// given
/// expires.
///
public unsafe bool MoveNext(TimeSpan timeout) {
long timeoutInMilliseconds = (long)timeout.TotalMilliseconds;
if (timeoutInMilliseconds < 0 || timeoutInMilliseconds > UInt32.MaxValue)
throw new ArgumentException(Res.GetString(Res.InvalidParameter, "timeout", timeout.ToString()));
int status = 0;
int action = NativeMethods.QUEUE_ACTION_PEEK_NEXT;
//Peek current or next?
if (this.index == 0)
action = NativeMethods.QUEUE_ACTION_PEEK_CURRENT;
status = owner.StaleSafeReceiveMessage((uint)timeoutInMilliseconds, action, null, null, null, this.Handle, (IntPtr)NativeMethods.QUEUE_TRANSACTION_NONE);
//If the cursor reached the end of the queue.
if (status == (int)MessageQueueErrorCode.IOTimeout) {
this.Close();
return false;
}
//If all messages were removed.
else if (status == (int)MessageQueueErrorCode.IllegalCursorAction) {
this.index = 0;
this.Close();
return false;
}
if (MessageQueue.IsFatalError(status))
throw new MessageQueueException(status);
++ this.index;
return true;
}
///
///
/// Removes the current message from
/// the queue and returns the message to the calling application.
///
public Message RemoveCurrent() {
return RemoveCurrent(TimeSpan.Zero, null, MessageQueueTransactionType.None);
}
///
///
/// Removes the current message from
/// the queue and returns the message to the calling application.
///
public Message RemoveCurrent(MessageQueueTransaction transaction) {
if (transaction == null)
throw new ArgumentNullException("transaction");
return RemoveCurrent(TimeSpan.Zero, transaction, MessageQueueTransactionType.None);
}
///
///
/// Removes the current message from
/// the queue and returns the message to the calling application.
///
public Message RemoveCurrent(MessageQueueTransactionType transactionType) {
if (!ValidationUtility.ValidateMessageQueueTransactionType(transactionType))
throw new InvalidEnumArgumentException("transactionType", (int)transactionType, typeof(MessageQueueTransactionType));
return RemoveCurrent(TimeSpan.Zero, null, transactionType);
}
///
///
/// Removes the current message from
/// the queue and returns the message to the calling application within the timeout specified.
///
public Message RemoveCurrent(TimeSpan timeout) {
return RemoveCurrent(timeout, null, MessageQueueTransactionType.None);
}
///
///
/// Removes the current message from
/// the queue and returns the message to the calling application within the timeout specified.
///
public Message RemoveCurrent(TimeSpan timeout, MessageQueueTransaction transaction) {
if (transaction == null)
throw new ArgumentNullException("transaction");
return RemoveCurrent(timeout, transaction, MessageQueueTransactionType.None);
}
///
///
/// Removes the current message from
/// the queue and returns the message to the calling application within the timeout specified.
///
public Message RemoveCurrent(TimeSpan timeout, MessageQueueTransactionType transactionType) {
if (!ValidationUtility.ValidateMessageQueueTransactionType(transactionType))
throw new InvalidEnumArgumentException("transactionType", (int)transactionType, typeof(MessageQueueTransactionType));
return RemoveCurrent(timeout, null, transactionType);
}
private Message RemoveCurrent(TimeSpan timeout, MessageQueueTransaction transaction, MessageQueueTransactionType transactionType) {
long timeoutInMilliseconds = (long)timeout.TotalMilliseconds;
if (timeoutInMilliseconds < 0 || timeoutInMilliseconds > UInt32.MaxValue)
throw new ArgumentException(Res.GetString(Res.InvalidParameter, "timeout", timeout.ToString()));
if (this.index == 0)
return null;
Message message = this.owner.ReceiveCurrent(timeout, NativeMethods.QUEUE_ACTION_RECEIVE,
this.Handle, this.owner.MessageReadPropertyFilter, transaction, transactionType);
if (!useCorrectRemoveCurrent) --this.index;
return message;
}
///
///
/// Resets the current enumerator, so it points to
/// the head of the queue.
///
public void Reset() {
this.Close();
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
//------------------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//-----------------------------------------------------------------------------
namespace System.Messaging {
using System.Diagnostics;
using System;
using System.ComponentModel;
using System.Collections;
using System.Messaging.Interop;
///
///
/// Provides (forward-only)
/// cursor semantics to enumerate the messages contained in
/// a queue.
///
/// Translate into English?
///
///
public class MessageEnumerator : MarshalByRefObject, IEnumerator, IDisposable {
private MessageQueue owner;
private CursorHandle handle = System.Messaging.Interop.CursorHandle.NullHandle;
private int index = 0;
private bool disposed = false;
private bool useCorrectRemoveCurrent = false;//needed in fix for 88615
internal MessageEnumerator(MessageQueue owner, bool useCorrectRemoveCurrent) {
this.owner = owner;
this.useCorrectRemoveCurrent = useCorrectRemoveCurrent;
}
///
///
/// Gets the current pointed to
/// by this enumerator.
///
public Message Current {
get {
if (this.index == 0)
throw new InvalidOperationException(Res.GetString(Res.NoCurrentMessage));
return this.owner.ReceiveCurrent(TimeSpan.Zero, NativeMethods.QUEUE_ACTION_PEEK_CURRENT, this.Handle,
this.owner.MessageReadPropertyFilter, null,
MessageQueueTransactionType.None);
}
}
///
///
object IEnumerator.Current {
get {
return this.Current;
}
}
///
///
/// Gets the native Message Queuing cursor handle used to browse messages
/// in the queue.
///
public IntPtr CursorHandle{
get { return this.Handle.DangerousGetHandle(); }
}
internal CursorHandle Handle {
get{
//Cursor handle doesn't demand permissions since GetEnumerator will demand somehow.
if (this.handle.IsInvalid) {
//Cannot allocate the a new cursor if the object has been disposed, since finalization has been suppressed.
if (this.disposed)
throw new ObjectDisposedException(GetType().Name);
CursorHandle result;
int status = SafeNativeMethods.MQCreateCursor(this.owner.MQInfo.ReadHandle, out result);
if (MessageQueue.IsFatalError(status))
throw new MessageQueueException(status);
this.handle = result;
}
return this.handle;
}
}
///
///
///
/// Frees the resources associated with the enumerator.
///
///
public void Close() {
this.index = 0;
if (!this.handle.IsInvalid) {
this.handle.Close();
}
}
///
///
///
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2213:DisposableFieldsShouldBeDisposed")]
public void Dispose() {
Dispose(true);
GC.SuppressFinalize(this);
}
///
///
///
///
///
protected virtual void Dispose(bool disposing) {
this.Close();
this.disposed = true;
}
///
///
///
///
~MessageEnumerator() {
Dispose(false);
}
///
///
/// Advances the enumerator to the next message in the queue, if one
/// is currently available.
///
public bool MoveNext() {
return MoveNext(TimeSpan.Zero);
}
///
///
/// Advances the enumerator to the next message in the
/// queue. If the enumerator is positioned at the end of the queue, waits until a message is available or the
/// given
/// expires.
///
public unsafe bool MoveNext(TimeSpan timeout) {
long timeoutInMilliseconds = (long)timeout.TotalMilliseconds;
if (timeoutInMilliseconds < 0 || timeoutInMilliseconds > UInt32.MaxValue)
throw new ArgumentException(Res.GetString(Res.InvalidParameter, "timeout", timeout.ToString()));
int status = 0;
int action = NativeMethods.QUEUE_ACTION_PEEK_NEXT;
//Peek current or next?
if (this.index == 0)
action = NativeMethods.QUEUE_ACTION_PEEK_CURRENT;
status = owner.StaleSafeReceiveMessage((uint)timeoutInMilliseconds, action, null, null, null, this.Handle, (IntPtr)NativeMethods.QUEUE_TRANSACTION_NONE);
//If the cursor reached the end of the queue.
if (status == (int)MessageQueueErrorCode.IOTimeout) {
this.Close();
return false;
}
//If all messages were removed.
else if (status == (int)MessageQueueErrorCode.IllegalCursorAction) {
this.index = 0;
this.Close();
return false;
}
if (MessageQueue.IsFatalError(status))
throw new MessageQueueException(status);
++ this.index;
return true;
}
///
///
/// Removes the current message from
/// the queue and returns the message to the calling application.
///
public Message RemoveCurrent() {
return RemoveCurrent(TimeSpan.Zero, null, MessageQueueTransactionType.None);
}
///
///
/// Removes the current message from
/// the queue and returns the message to the calling application.
///
public Message RemoveCurrent(MessageQueueTransaction transaction) {
if (transaction == null)
throw new ArgumentNullException("transaction");
return RemoveCurrent(TimeSpan.Zero, transaction, MessageQueueTransactionType.None);
}
///
///
/// Removes the current message from
/// the queue and returns the message to the calling application.
///
public Message RemoveCurrent(MessageQueueTransactionType transactionType) {
if (!ValidationUtility.ValidateMessageQueueTransactionType(transactionType))
throw new InvalidEnumArgumentException("transactionType", (int)transactionType, typeof(MessageQueueTransactionType));
return RemoveCurrent(TimeSpan.Zero, null, transactionType);
}
///
///
/// Removes the current message from
/// the queue and returns the message to the calling application within the timeout specified.
///
public Message RemoveCurrent(TimeSpan timeout) {
return RemoveCurrent(timeout, null, MessageQueueTransactionType.None);
}
///
///
/// Removes the current message from
/// the queue and returns the message to the calling application within the timeout specified.
///
public Message RemoveCurrent(TimeSpan timeout, MessageQueueTransaction transaction) {
if (transaction == null)
throw new ArgumentNullException("transaction");
return RemoveCurrent(timeout, transaction, MessageQueueTransactionType.None);
}
///
///
/// Removes the current message from
/// the queue and returns the message to the calling application within the timeout specified.
///
public Message RemoveCurrent(TimeSpan timeout, MessageQueueTransactionType transactionType) {
if (!ValidationUtility.ValidateMessageQueueTransactionType(transactionType))
throw new InvalidEnumArgumentException("transactionType", (int)transactionType, typeof(MessageQueueTransactionType));
return RemoveCurrent(timeout, null, transactionType);
}
private Message RemoveCurrent(TimeSpan timeout, MessageQueueTransaction transaction, MessageQueueTransactionType transactionType) {
long timeoutInMilliseconds = (long)timeout.TotalMilliseconds;
if (timeoutInMilliseconds < 0 || timeoutInMilliseconds > UInt32.MaxValue)
throw new ArgumentException(Res.GetString(Res.InvalidParameter, "timeout", timeout.ToString()));
if (this.index == 0)
return null;
Message message = this.owner.ReceiveCurrent(timeout, NativeMethods.QUEUE_ACTION_RECEIVE,
this.Handle, this.owner.MessageReadPropertyFilter, transaction, transactionType);
if (!useCorrectRemoveCurrent) --this.index;
return message;
}
///
///
/// Resets the current enumerator, so it points to
/// the head of the queue.
///
public void Reset() {
this.Close();
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- PackWebResponse.cs
- TimeSpanConverter.cs
- Cast.cs
- WindowsMenu.cs
- GifBitmapEncoder.cs
- CopyAttributesAction.cs
- CrossContextChannel.cs
- EmptyStringExpandableObjectConverter.cs
- TextDecorationCollection.cs
- Expander.cs
- ImageSource.cs
- Deserializer.cs
- WebColorConverter.cs
- SimpleTypesSurrogate.cs
- oledbmetadatacollectionnames.cs
- HighlightComponent.cs
- FormsIdentity.cs
- SecureStringHasher.cs
- CompiledAction.cs
- RtType.cs
- EntityContainerEntitySet.cs
- InkPresenter.cs
- WSDualHttpBindingElement.cs
- ToolBar.cs
- ListViewContainer.cs
- SqlNotificationEventArgs.cs
- SpellerHighlightLayer.cs
- DataGridViewCellStyleContentChangedEventArgs.cs
- FontClient.cs
- NotifyInputEventArgs.cs
- StrongNamePublicKeyBlob.cs
- SqlFlattener.cs
- ContentElementAutomationPeer.cs
- InvokeBinder.cs
- LinkDescriptor.cs
- PromptEventArgs.cs
- ArgumentNullException.cs
- PlanCompilerUtil.cs
- _FtpDataStream.cs
- KeyInterop.cs
- bidPrivateBase.cs
- RightsManagementEncryptedStream.cs
- CompilationUnit.cs
- ExpressionReplacer.cs
- EdmError.cs
- XmlTextReader.cs
- SortKey.cs
- OdbcParameterCollection.cs
- MetadataArtifactLoaderResource.cs
- SwitchElementsCollection.cs
- CodeConditionStatement.cs
- webeventbuffer.cs
- SqlWebEventProvider.cs
- LambdaCompiler.Lambda.cs
- RoutedEventValueSerializer.cs
- MultiDataTrigger.cs
- KeyNotFoundException.cs
- SqlBooleanMismatchVisitor.cs
- CompositeCollectionView.cs
- ListBindingConverter.cs
- ZipIOCentralDirectoryBlock.cs
- Array.cs
- ApplicationBuildProvider.cs
- HtmlHead.cs
- DeferredSelectedIndexReference.cs
- NetPeerTcpBindingElement.cs
- AlphabeticalEnumConverter.cs
- Image.cs
- SettingsPropertyCollection.cs
- CngKeyCreationParameters.cs
- CodeNamespaceImport.cs
- Config.cs
- SystemSounds.cs
- MultiBinding.cs
- Renderer.cs
- SmtpDigestAuthenticationModule.cs
- FaultContractInfo.cs
- InternalsVisibleToAttribute.cs
- ResourceDisplayNameAttribute.cs
- ErrorsHelper.cs
- ImportedPolicyConversionContext.cs
- FragmentQueryKB.cs
- EtwTrackingParticipant.cs
- BindingManagerDataErrorEventArgs.cs
- InvokePattern.cs
- TransactionState.cs
- NavigationProperty.cs
- XmlToDatasetMap.cs
- OleDbFactory.cs
- EmptyControlCollection.cs
- DataTable.cs
- TypeConverterHelper.cs
- DataGridTextBox.cs
- DiscoveryServerProtocol.cs
- UriTemplate.cs
- MexHttpBindingCollectionElement.cs
- SafeIUnknown.cs
- SourceInterpreter.cs
- OdbcStatementHandle.cs
- DelegatingConfigHost.cs