source: PinConnection/UCommSocket.pas

Last change on this file was 272, checked in by george, 13 years ago
  • Fixed: Do not send or receive data for comm classes if not in active state.
  • Fixed: TCommProtocol now raise ENotActive exception on try to send data while in inactive state.
  • Fixed: Reseting event after data received in TCommThread class.
File size: 2.9 KB
Line 
1unit UCommSocket;
2
3{$mode Delphi}{$H+}
4
5interface
6
7uses
8 Classes, SysUtils, blcksock, UCommPin, UCommon, UThreading,
9 DateUtils;
10
11type
12 TCommSocket = class;
13
14 TReceiveDataEvent = procedure(Stream: TMemoryStream) of object;
15
16 { TCommSocketReceiveThread }
17
18 TCommSocketReceiveThread = class(TListedThread)
19 public
20 Parent: TCommSocket;
21 Stream: TMemoryStream;
22 procedure Execute; override;
23 constructor Create(CreateSuspended: Boolean;
24 const StackSize: SizeUInt = DefaultStackSize);
25 destructor Destroy; override;
26 end;
27
28 { TCommSocket }
29
30 TCommSocket = class
31 private
32 FActive: Boolean;
33 FOnReceiveData: TReceiveDataEvent;
34 FReceiveThread: TCommSocketReceiveThread;
35 procedure ReceiveData(Sender: TCommPin; Stream: TStream);
36 procedure SetActive(const AValue: Boolean);
37 public
38 Socket: TBlockSocket;
39 Pin: TCommPin;
40 property Active: Boolean read FActive write SetActive;
41 constructor Create;
42 destructor Destroy; override;
43 end;
44
45implementation
46
47{ TCommSocket }
48
49procedure TCommSocket.ReceiveData(Sender: TCommPin; Stream:TStream);
50begin
51 if FActive then Socket.SendStreamRaw(Stream);
52end;
53
54procedure TCommSocket.SetActive(const AValue: Boolean);
55begin
56 if FActive = AValue then Exit;
57 FActive := AValue;
58
59 if AValue then begin
60 FReceiveThread := TCommSocketReceiveThread.Create(True);
61 FReceiveThread.FreeOnTerminate := False;
62 FReceiveThread.Parent := Self;
63 FReceiveThread.Start;
64 end else begin
65 FReceiveThread.Terminate;
66 FReceiveThread.WaitFor;
67 FreeAndNil(FReceiveThread);
68 end;
69end;
70
71constructor TCommSocket.Create;
72begin
73 inherited Create;
74 Socket := TTCPBlockSocket.Create;
75 Pin := TCommPin.Create;
76 Pin.OnReceive := ReceiveData;
77end;
78
79destructor TCommSocket.Destroy;
80begin
81 Active := False;
82 Socket.Free;
83 Pin.Free;
84 inherited Destroy;
85end;
86
87{ TCommSocketReceiveThread }
88
89procedure TCommSocketReceiveThread.Execute;
90var
91 InBufferUsed: Integer;
92 Buffer: array of Byte;
93begin
94 InBufferUsed := 0;
95 with Parent do repeat
96 if InBufferUsed = 0 then Sleep(1);
97 //else Yield;
98 if Assigned(Socket) then
99 with Socket do
100 if CanRead(0) then begin
101 InBufferUsed := WaitingData;
102 if InBufferUsed > 0 then begin
103 SetLength(Buffer, InBufferUsed);
104 RecvBuffer(Buffer, Length(Buffer));
105
106 Stream.Size := Length(Buffer);
107 Stream.Position := 0;
108 Stream.Write(Buffer[0], Length(Buffer));
109 Pin.Send(Stream);
110 end else InBufferUsed := 0;
111 end else InBufferUsed := 0;
112 until Terminated;
113end;
114
115constructor TCommSocketReceiveThread.Create(CreateSuspended: Boolean;
116 const StackSize: SizeUInt);
117begin
118 inherited;
119 Stream := TMemoryStream.Create;
120end;
121
122destructor TCommSocketReceiveThread.Destroy;
123begin
124 Stream.Free;
125 inherited;
126end;
127
128end.
129
Note: See TracBrowser for help on using the repository browser.