IdInterceptThrottler.pas 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. {
  2. $Project$
  3. $Workfile$
  4. $Revision$
  5. $DateUTC$
  6. $Id$
  7. This file is part of the Indy (Internet Direct) project, and is offered
  8. under the dual-licensing agreement described on the Indy website.
  9. (http://www.indyproject.org/)
  10. Copyright:
  11. (c) 1993-2005, Chad Z. Hower and the Indy Pit Crew. All rights reserved.
  12. }
  13. {
  14. $Log$
  15. }
  16. {
  17. Rev 1.2 2004.02.03 4:17:18 PM czhower
  18. For unit name changes.
  19. Rev 1.1 2003.10.19 12:10:00 AM czhower
  20. Changed formula to be accurate with smaller numbers.
  21. Rev 1.0 2003.10.18 11:32:00 PM czhower
  22. Initial checkin
  23. Rev 1.1 2003.10.14 1:27:16 PM czhower
  24. Uupdates + Intercept support
  25. Rev 1.0 2003.10.13 6:40:40 PM czhower
  26. Moved from root
  27. Rev 1.0 11/13/2002 07:55:12 AM JPMugaas
  28. }
  29. unit IdInterceptThrottler;
  30. interface
  31. {$i IdCompilerDefines.inc}
  32. uses
  33. IdComponent, IdIntercept, IdGlobal;
  34. type
  35. TIdInterceptThrottler = class(TIdConnectionIntercept)
  36. protected
  37. FBitsPerSec: Int64;
  38. FRecvBitsPerSec: Int64;
  39. FSendBitsPerSec: Int64;
  40. procedure SetBitsPerSec(AValue: Int64);
  41. public
  42. procedure Receive(var ABuffer: TIdBytes); override;
  43. procedure Send(var ABuffer: TIdBytes); override;
  44. published
  45. property BitsPerSec: Int64 read FBitsPerSec write SetBitsPerSec;
  46. property RecvBitsPerSec: Int64 read FRecvBitsPerSec write FRecvBitsPerSec;
  47. property SendBitsPerSec: Int64 read FSendBitsPerSec write FSendBitsPerSec;
  48. end;
  49. implementation
  50. uses
  51. IdAntiFreezeBase;
  52. { TIdInterceptThrottler }
  53. procedure TIdInterceptThrottler.Receive(var ABuffer: TIdBytes);
  54. var
  55. LInterval: Int64;
  56. begin
  57. inherited Receive(ABuffer);
  58. if RecvBitsPerSec > 0 then begin
  59. LInterval := (Int64(Length(ABuffer)) * 8 * 1000) div RecvBitsPerSec;
  60. while LInterval > MaxInt do begin
  61. TIdAntiFreezeBase.Sleep(MaxInt);
  62. Dec(LInterval, MaxInt);
  63. end;
  64. TIdAntiFreezeBase.Sleep(Integer(LInterval));
  65. end;
  66. end;
  67. procedure TIdInterceptThrottler.Send(var ABuffer: TIdBytes);
  68. var
  69. LInterval: Int64;
  70. begin
  71. inherited Send(ABuffer);
  72. if SendBitsPerSec > 0 then begin
  73. LInterval := (Int64(Length(ABuffer)) * 8 * 1000) div SendBitsPerSec;
  74. while LInterval > MaxInt do begin
  75. TIdAntiFreezeBase.Sleep(MaxInt);
  76. Dec(LInterval, MaxInt);
  77. end;
  78. TIdAntiFreezeBase.Sleep(Integer(LInterval));
  79. end;
  80. end;
  81. procedure TIdInterceptThrottler.SetBitsPerSec(AValue: Int64);
  82. begin
  83. FBitsPerSec := AValue;
  84. FRecvBitsPerSec := AValue;
  85. FSendBitsPerSec := AValue;
  86. end;
  87. end.