QueueAccessMode.cs 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. //------------------------------------------------------------------------------
  2. // <copyright file="QueueAccessMode.cs" company="Microsoft">
  3. // Copyright (c) Microsoft Corporation. All rights reserved.
  4. // </copyright>
  5. //------------------------------------------------------------------------------
  6. using Experimental.System.Messaging.Interop;
  7. using System.Collections.Generic;
  8. using System.Diagnostics.CodeAnalysis;
  9. namespace Experimental.System.Messaging
  10. {
  11. /// <include file='doc\QueueAccessMode.uex' path='docs/doc[@for="QueueAccessMode"]/*' />
  12. /// <devdoc>
  13. /// <para>
  14. /// Specifies what operations can be performed on the queue.
  15. /// </para>
  16. /// </devdoc>
  17. [SuppressMessage("Microsoft.Design", "CA1008:EnumsShouldHaveZeroValue")]
  18. public enum QueueAccessMode
  19. {
  20. Send = NativeMethods.QUEUE_ACCESS_SEND,
  21. Peek = NativeMethods.QUEUE_ACCESS_PEEK,
  22. Receive = NativeMethods.QUEUE_ACCESS_RECEIVE,
  23. PeekAndAdmin = NativeMethods.QUEUE_ACCESS_PEEK | NativeMethods.QUEUE_ACCESS_ADMIN,
  24. ReceiveAndAdmin = NativeMethods.QUEUE_ACCESS_RECEIVE | NativeMethods.QUEUE_ACCESS_ADMIN,
  25. ///
  26. /// SendAndReceive is supported for compatibility only.
  27. ///
  28. SendAndReceive = NativeMethods.QUEUE_ACCESS_SEND | NativeMethods.QUEUE_ACCESS_RECEIVE,
  29. }
  30. internal class QueueAccessModeHolder
  31. {
  32. private QueueAccessMode accessMode;
  33. private static Dictionary<QueueAccessMode, QueueAccessModeHolder> holders = new Dictionary<QueueAccessMode, QueueAccessModeHolder>();
  34. private QueueAccessModeHolder(QueueAccessMode accessMode)
  35. {
  36. this.accessMode = accessMode;
  37. }
  38. /// <devdoc>
  39. /// <para>
  40. /// Factory method for getting a QueueAccessModeHolder holder. For each accessMode, we want only one holder.
  41. /// </para>
  42. /// </devdoc>
  43. public static QueueAccessModeHolder GetQueueAccessModeHolder(QueueAccessMode accessMode)
  44. {
  45. if (holders.ContainsKey(accessMode))
  46. {
  47. return holders[accessMode];
  48. }
  49. lock (holders)
  50. {
  51. QueueAccessModeHolder newHolder = new QueueAccessModeHolder(accessMode);
  52. holders[accessMode] = newHolder;
  53. return newHolder;
  54. }
  55. }
  56. public bool CanRead()
  57. {
  58. return (((accessMode & QueueAccessMode.Receive) != 0) || ((accessMode & QueueAccessMode.Peek) != 0));
  59. }
  60. public bool CanWrite()
  61. {
  62. return ((accessMode & QueueAccessMode.Send) != 0);
  63. }
  64. public int GetReadAccessMode()
  65. {
  66. int result = (int)(accessMode & ~QueueAccessMode.Send);
  67. if (result != 0)
  68. return result;
  69. // this is fail-fast path, when we know right away that the operation is incompatible with access mode
  70. // AccessDenied can also happen in other cases,
  71. // (for example, when we try to receive on a queue opened only for peek.
  72. // We'll let MQReceiveMessage enforce these rules
  73. throw new MessageQueueException((int)MessageQueueErrorCode.AccessDenied);
  74. }
  75. public int GetWriteAccessMode()
  76. {
  77. int result = (int)(accessMode & QueueAccessMode.Send);
  78. if (result != 0)
  79. return result;
  80. // this is fail-fast path, when we know right away that the operation is incompatible with access mode
  81. // AccessDenied can also happen in other cases,
  82. // (for example, when we try to receive on a queue opened only for peek.
  83. // We'll let MQReceiveMessage enforce these rules
  84. throw new MessageQueueException((int)MessageQueueErrorCode.AccessDenied);
  85. }
  86. }
  87. }