BufferManager.cs 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. //
  2. // BufferManager.cs
  3. //
  4. // Author: Atsushi Enomoto ([email protected])
  5. //
  6. // Copyright (C) 2005 Novell, Inc (http://www.novell.com)
  7. //
  8. // Permission is hereby granted, free of charge, to any person obtaining
  9. // a copy of this software and associated documentation files (the
  10. // "Software"), to deal in the Software without restriction, including
  11. // without limitation the rights to use, copy, modify, merge, publish,
  12. // distribute, sublicense, and/or sell copies of the Software, and to
  13. // permit persons to whom the Software is furnished to do so, subject to
  14. // the following conditions:
  15. //
  16. // The above copyright notice and this permission notice shall be
  17. // included in all copies or substantial portions of the Software.
  18. //
  19. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  20. // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  21. // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  22. // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
  23. // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
  24. // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
  25. // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  26. //
  27. using System;
  28. using System.IO;
  29. using System.Collections.ObjectModel;
  30. using System.ServiceModel;
  31. namespace System.ServiceModel.Channels
  32. {
  33. public abstract class BufferManager
  34. {
  35. protected BufferManager ()
  36. {
  37. }
  38. public abstract void Clear ();
  39. [MonoTODO]
  40. public static BufferManager CreateBufferManager (
  41. long maxBufferPoolSize, int maxBufferSize)
  42. {
  43. return new DefaultBufferManager (maxBufferPoolSize,
  44. maxBufferSize);
  45. }
  46. public abstract void ReturnBuffer (byte[] buffer);
  47. public abstract byte[] TakeBuffer (int bufferSize);
  48. class DefaultBufferManager : BufferManager
  49. {
  50. long max_pool_size;
  51. int max_size;
  52. byte [] buffer;
  53. public DefaultBufferManager (long maxBufferPoolSize,
  54. int maxBufferSize)
  55. {
  56. this.max_pool_size = maxBufferPoolSize;
  57. this.max_size = maxBufferSize;
  58. }
  59. public override void Clear ()
  60. {
  61. if (buffer != null)
  62. Array.Clear (buffer, 0, buffer.Length);
  63. }
  64. public override void ReturnBuffer (byte [] buffer)
  65. {
  66. // is this correct?
  67. if (this.buffer == null)
  68. return;
  69. Array.Copy (this.buffer, buffer, this.buffer.Length);
  70. }
  71. public override byte [] TakeBuffer (int bufferSize)
  72. {
  73. if (bufferSize > max_size)
  74. throw new ArgumentOutOfRangeException ();
  75. if (buffer == null || buffer.Length < bufferSize)
  76. buffer = new byte [bufferSize];
  77. return buffer;
  78. }
  79. }
  80. }
  81. }