File: testipc_server.pp

package info (click to toggle)
fpc 3.2.2%2Bdfsg-49
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 341,452 kB
  • sloc: pascal: 3,820,194; xml: 194,356; ansic: 9,637; asm: 8,482; java: 5,346; sh: 4,813; yacc: 3,956; makefile: 2,705; lex: 2,661; javascript: 2,454; sql: 929; php: 474; cpp: 145; perl: 136; sed: 132; csh: 34; tcl: 7
file content (105 lines) | stat: -rw-r--r-- 2,765 bytes parent folder | download | duplicates (6)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
program testipc_server;

{$MODE ObjFPC}
{$H+}

uses
  Classes, SysUtils, AdvancedIPC;

const
  STRINGMESSAGE_WANTS_RESPONSE = 3;
  STRINGMESSAGE_NO_RESPONSE = 2;
  MESSAGE_STOP = 4;

var
  xServer: TIPCServer;
  xStream, xResponseStream: TStringStream;
  xMsgID: Integer;
  xMsgType: TMessageType;
  xNotRunningMessagesCount: Integer;
begin
  xServer := nil;
  xStream := nil;
  xResponseStream := nil;
  try
    xStream := TStringStream.Create('');
    xResponseStream := TStringStream.Create('OK');

    //first get all messages from the hello server
    xServer := TIPCServer.Create(nil);
    xServer.ServerID := 'hello';
    xServer.StartServer;

    WriteLn('Server ', xServer.ServerID, ' started.');
    WriteLn('-----');

    while True do
    begin
      if xServer.PeekRequest(xMsgID{%H-}, xMsgType{%H-}) then
      begin
        case xMsgType of
          STRINGMESSAGE_WANTS_RESPONSE, STRINGMESSAGE_NO_RESPONSE:
          begin
            xServer.ReadRequest(xMsgID, xStream);
            WriteLn('Received string message:');
            WriteLn(xStream.DataString);
            if xMsgType = STRINGMESSAGE_WANTS_RESPONSE then
            begin
              xResponseStream.Position := 0;
              xServer.PostResponse(xMsgID, STRINGMESSAGE_NO_RESPONSE, xResponseStream);
              WriteLn('Posting response.');
            end;
            WriteLn('-----');
          end;
          MESSAGE_STOP:
          begin
            WriteLn('Stopping '+xServer.ServerID+' server.');
            WriteLn('-----');
            Break;
          end;
        end;
      end else
        Sleep(50);
    end;

    FreeAndNil(xServer);

    //now try to get all unhandled messages from the not_running server
    //please see that the messages are not peeked in the order they have been posted (this is correct/designed behavior).
    xServer := TIPCServer.Create(nil);
    xServer.ServerID := 'not_running';
    xServer.StartServer(False);

    WriteLn('');
    WriteLn('Server ', xServer.ServerID, ' started.');
    WriteLn('-----');

    xNotRunningMessagesCount := 0;
    while xServer.PeekRequest(xStream, xMsgID, xMsgType) do
    begin
      if xMsgType = STRINGMESSAGE_NO_RESPONSE then
      begin
        WriteLn('Received message: ', xStream.DataString);
        Inc(xNotRunningMessagesCount);
      end else
        WriteLn('ERROR: Wrong message type: ', xMsgType);

      WriteLn('-----');
    end;

    if xNotRunningMessagesCount <> 10 then
    begin
      WriteLn('ERROR: Wrong message count: ', xNotRunningMessagesCount);
      WriteLn('-----');
    end;

    WriteLn('Stopping '+xServer.ServerID+' server.');
    WriteLn('-----');
    FreeAndNil(xServer);
  finally
    xServer.Free;
    xStream.Free;
    xResponseStream.Free;
  end;
end.