WSOCKBUF.PAS
上传用户:xdgkgcw
上传日期:2007-01-04
资源大小:92k
文件大小:7k
源码类别:

Delphi控件源码

开发平台:

WINDOWS

  1. {*_* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  2. Author:       Fran鏾is PIETTE
  3. Description:  TBuffer is an object wich buffers data in a single dynamically
  4.               allocated memory block. It is a kind of FIFO wich manages
  5.               characters in bloc of various sizes.
  6. EMail:        francois.piette@pophost.eunet.be    
  7.               francois.piette@rtfm.be             http://www.rtfm.be/fpiette
  8. Creation:     April 1996
  9. Version:      2.01
  10. Support:      Use the mailing list twsocket@rtfm.be See website for details.
  11. Legal issues: Copyright (C) 1997, 1998 by Fran鏾is PIETTE
  12.               Rue de Grady 24, 4053 Embourg, Belgium. Fax: +32-4-365.74.56
  13.               <francois.piette@pophost.eunet.be>
  14.               This software is provided 'as-is', without any express or
  15.          implied warranty.  In no event will the author be held liable
  16.               for any  damages arising from the use of this software.
  17.               Permission is granted to anyone to use this software for any
  18.               purpose, including commercial applications, and to alter it
  19.               and redistribute it freely, subject to the following
  20.               restrictions:
  21.               1. The origin of this software must not be misrepresented,
  22.                  you must not claim that you wrote the original software.
  23.                  If you use this software in a product, an acknowledgment 
  24.                  in the product documentation would be appreciated but is
  25.                  not required.
  26.               2. Altered source versions must be plainly marked as such, and
  27.                  must not be misrepresented as being the original software.
  28.               3. This notice may not be removed or altered from any source
  29.                  distribution.
  30.                  
  31.               4. You must register this software by sending a picture postcard
  32.                  to the author. Use a nice stamp and mention your name, street
  33.                  address, EMail address and any comment you like to say.
  34. Updates:
  35. Mar 06, 1998  V2.00 Added a property and a parameter for the create method
  36.               to select the buffer size. Using a 0 value will make the object
  37.               use the default 1514 bytes (the largest size for an ethernet
  38.               packet).
  39. Jul 08, 1998  V2.01 Adadpted for Delphi 4
  40.  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
  41. unit WSockbuf;
  42. interface
  43. uses
  44.   SysUtils;
  45. const
  46.   WSockBufVersion = 201;
  47. type
  48.   TBuffer = class(TObject)
  49.     Buf      : Pointer;
  50.     FBufSize : Integer;
  51.     WrCount  : Integer;
  52.     RdCount  : Integer;
  53.   public
  54.     constructor Create(nSize : Integer); virtual;
  55.     destructor  Destroy; override;
  56.     function    Write(Data : Pointer; Len : Integer) : Integer;
  57.     function    Read(Data : Pointer; Len : Integer) : Integer;
  58.     function    Peek(var Len : Integer) : Pointer;
  59.     function    Remove(Len : Integer) : Integer;
  60.     procedure   SetBufSize(newSize : Integer);
  61.     property    BufSize : Integer read FBufSize write SetBufSize;
  62.   end;
  63. implementation
  64. {* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
  65. constructor TBuffer.Create(nSize : Integer);
  66. begin
  67.     inherited Create;
  68.     WrCount  := 0;
  69.     RdCount  := 0;
  70.     BufSize := nSize;
  71. end;
  72. {* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
  73. destructor TBuffer.Destroy;
  74. begin
  75.     if Assigned(Buf) then
  76.         FreeMem(Buf, FBufSize);
  77.     inherited Destroy;
  78. end;
  79. {* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
  80. procedure TBuffer.SetBufSize(newSize : Integer);
  81. var
  82.     newBuf : Pointer;
  83. begin
  84.     if newSize <= 0 then
  85.         newSize := 1514;
  86.     if newSize = FBufSize then
  87.         Exit;
  88.     if WrCount = RdCount then begin
  89.         { Buffer is empty }
  90.         if Assigned(Buf) then
  91.             FreeMem(Buf, FBufSize);
  92.         FBufSize := newSize;
  93.         GetMem(Buf, FBufSize);
  94.     end
  95.     else begin
  96.         { Buffer contains data }
  97.         GetMem(newBuf, newSize);
  98.         Move(Buf^, newBuf^, WrCount);
  99.         if Assigned(Buf) then
  100.             FreeMem(Buf, FBufSize);
  101.         FBufSize := newSize;
  102.         Buf      := newBuf;
  103.     end;
  104. end;
  105. {* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
  106. function TBuffer.Write(Data : Pointer; Len : Integer) : Integer;
  107. var
  108.     Remaining : Integer;
  109.     Copied    : Integer;
  110. begin
  111.     Remaining := FBufSize - WrCount;
  112.     if Remaining <= 0 then
  113.         Result := 0
  114.     else begin
  115.         if Len <= Remaining then
  116.             Copied := Len
  117.         else
  118.             Copied := Remaining;
  119.         Move(Data^, (PChar(Buf) + WrCount)^, Copied);
  120.         WrCount := WrCount + Copied;
  121.         Result  := Copied;
  122.     end;
  123. end;
  124. {* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
  125. function TBuffer.Read(Data : Pointer; Len : Integer) : Integer;
  126. var
  127.     Remaining : Integer;
  128.     Copied    : Integer;
  129. begin
  130.     Remaining := WrCount - RdCount;
  131.     if Remaining <= 0 then
  132.         Result := 0
  133.     else begin
  134.         if Len <= Remaining then
  135.             Copied := Len
  136.         else
  137.             Copied := Remaining;
  138.         Move((PChar(Buf) + RdCount)^, Data^, Copied);
  139.         RdCount := RdCount + Copied;
  140.         if RdCount = WrCount then begin
  141.             RdCount := 0;
  142.             WrCount := 0;
  143.         end;
  144.         Result := Copied;
  145.     end;
  146. end;
  147. {* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
  148. function TBuffer.Peek(var Len : Integer) : Pointer;
  149. var
  150.     Remaining : Integer;
  151. begin
  152.     Remaining := WrCount - RdCount;
  153.     if Remaining <= 0 then begin
  154.         Len    := 0;
  155.         Result := nil;
  156.     end
  157.     else begin
  158.         Len    := Remaining;
  159.         Result := PChar(Buf) + RdCount;
  160.     end;
  161. end;
  162. {* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
  163. function TBuffer.Remove(Len : Integer) : Integer;
  164. var
  165.     Remaining : Integer;
  166.     Removed   : Integer;
  167. begin
  168.     Remaining := WrCount - RdCount;
  169.     if Remaining <= 0 then
  170.         Result := 0
  171.     else begin
  172.         if Len < Remaining then
  173.             Removed := Len
  174.         else
  175.             Removed := Remaining;
  176.         RdCount := RdCount + Removed;
  177.         if RdCount = WrCount then begin
  178.             RdCount := 0;
  179.             WrCount := 0;
  180.         end;
  181.         Result := Removed;
  182.     end;
  183. end;
  184. {* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
  185. end.