add unitfork.pas to uses clause of test app so it's compilation gets checked
[lcore.git] / lcoretest.dpr
1 program lcoretest;\r
2 \r
3 uses\r
4   lcore,\r
5   lsocket,\r
6   {$ifdef win32}\r
7     lcorewsaasyncselect in 'lcorewsaasyncselect.pas',\r
8   {$else}\r
9     lcoreselect,\r
10   {$endif}\r
11   dnsasync,\r
12   binipstuff,\r
13   sysutils,\r
14   dnssync,\r
15   //we don't actually make any use of the units below in this app, we just\r
16   //include it to check if it compiles ok ;)\r
17   lmessages,\r
18   unitfork;\r
19 {$ifdef win32}\r
20   {$R *.RES}\r
21 {$endif}\r
22 \r
23 type\r
24   tsc=class\r
25     procedure sessionavailable(sender: tobject;error : word);\r
26     procedure dataavailable(sender: tobject;error : word);\r
27     procedure sessionconnected(sender: tobject;error : word);\r
28     procedure taskrun(wparam,lparam:longint);\r
29     procedure timehandler(sender:tobject);\r
30     procedure dnsrequestdone(sender:tobject;error : word);\r
31     procedure sessionclosed(sender:tobject;error : word);\r
32   end;\r
33 var\r
34   listensocket : tlsocket;\r
35   serversocket : tlsocket;\r
36   clientsocket : tlsocket;\r
37   sc : tsc;\r
38   task : tltask;\r
39 procedure tsc.sessionavailable(sender: tobject;error : word);\r
40 begin\r
41   writeln('received connection');\r
42   serversocket.dup(listensocket.accept);\r
43 end;\r
44 \r
45 var\r
46   receivebuf : string;\r
47   receivecount : integer;\r
48 procedure tsc.dataavailable(sender: tobject;error : word);\r
49 var\r
50   receiveddata : string;\r
51   receivedon : string;\r
52   line : string;\r
53 begin\r
54   receiveddata := tlsocket(sender).receivestr;\r
55   if sender=clientsocket then begin\r
56     receivedon := 'client socket';\r
57   end else begin\r
58     receivedon := 'server socket';\r
59   end;\r
60   writeln('received data '+receiveddata+' on '+receivedon);\r
61 \r
62   receivebuf := receivebuf+receiveddata;\r
63 \r
64   if receivebuf = 'hello world' then begin\r
65     receivebuf := '';\r
66     writeln('received hello world creating task');\r
67     task := tltask.create(sc.taskrun,nil,0,0);\r
68   end;\r
69   receivecount := receivecount +1;\r
70   if receivecount >50 then begin\r
71     writeln('received over 50 bits of data, pausing to let the operator take a look');\r
72     \r
73     receivecount := 0;\r
74   end;\r
75   while pos(#10,receivebuf) > 0 do begin\r
76     line := receivebuf;\r
77     setlength(line,pos(#10,receivebuf)-1);\r
78     receivebuf := copy(receivebuf,pos(#10,receivebuf)+1,1000000);\r
79     if uppercase(copy(line,1,4))='PING' then begin\r
80       line[2] := 'o';\r
81       writeln('send pong:'+line);\r
82       clientsocket.sendstr(line+#10);\r
83     end;\r
84   end;\r
85 end;\r
86 \r
87 procedure tsc.sessionconnected(sender: tobject;error : word);\r
88 begin\r
89   \r
90   if error=0 then begin\r
91     writeln('session is connected, local address is'+clientsocket.getxaddr);\r
92 \r
93     if (clientsocket.addr = '127.0.0.1') or (clientsocket.addr = '::1') then begin\r
94       clientsocket.sendstr('hello world');\r
95     end else begin\r
96       clientsocket.sendstr('nick test'#13#10'user x x x x'#13#10);\r
97     end;\r
98   end else begin\r
99     writeln('connect failed');\r
100   end;\r
101 end;\r
102 \r
103 var\r
104   das : tdnsasync;\r
105 \r
106 procedure tsc.taskrun(wparam,lparam:longint);\r
107 var\r
108   tempbinip : tbinip;\r
109   dummy : integer;\r
110 begin\r
111   writeln('task ran');\r
112   writeln('closing client socket');\r
113   clientsocket.close;\r
114 \r
115   writeln('looking up irc.ipv6.p10link.net using dnsasync');\r
116   das := tdnsasync.Create(nil);\r
117   das.onrequestdone := sc.dnsrequestdone;\r
118   //das.forwardfamily := af_inet6;\r
119   das.forwardlookup('irc.ipv6.p10link.net');\r
120   \r
121 end;\r
122 \r
123 procedure tsc.dnsrequestdone(sender:tobject;error : word);\r
124 var\r
125   tempbinip : tbinip;\r
126   tempbiniplist : tbiniplist;\r
127 begin\r
128   writeln('irc.ipv6.p10link.net resolved to '+das.dnsresult+' connecting client socket there');\r
129   das.dnsresultbin(tempbinip);\r
130   tempbiniplist := biniplist_new;\r
131   biniplist_add(tempbiniplist,tempbinip);\r
132   clientsocket.addr := tempbiniplist;\r
133   clientsocket.port := '6667';\r
134   clientsocket.connect;\r
135   //writeln(clientsocket.getxaddr);\r
136   das.free;\r
137 end;\r
138 \r
139 procedure tsc.timehandler(sender:tobject);\r
140 begin\r
141   //writeln('got timer event');\r
142 end;\r
143 procedure tsc.sessionclosed(sender:tobject;error : word);\r
144 begin\r
145   Writeln('session closed with error ',error);\r
146 end;\r
147 var\r
148   timer : tltimer;\r
149   ipbin : tbinip;\r
150   dummy : integer;\r
151 begin\r
152   ipbin := forwardlookup('invalid.domain',5);\r
153   writeln(ipbintostr(ipbin));\r
154 \r
155   ipbin := forwardlookup('p10link.net',5);\r
156   writeln(ipbintostr(ipbin));\r
157 \r
158   ipstrtobin('80.68.89.68',ipbin);\r
159   writeln('80.68.89.68 reverses to '+reverselookup(ipbin,5));\r
160 \r
161   ipstrtobin('2001:200::8002:203:47ff:fea5:3085',ipbin);\r
162   writeln('2001:200::8002:203:47ff:fea5:3085 reverses to '+reverselookup(ipbin,5));\r
163   writeln('creating and setting up listen socket');\r
164   listensocket := tlsocket.create(nil);\r
165   listensocket.addr := '::';\r
166   listensocket.port := '12345';\r
167   listensocket.onsessionavailable := sc.sessionavailable;\r
168   writeln('listening');\r
169   listensocket.listen;\r
170   writeln(listensocket.getxport);\r
171   writeln('listen socket is number ', listensocket.fdhandlein);\r
172   writeln('creating and setting up server socket');\r
173   serversocket := tlsocket.create(nil);\r
174   serversocket.ondataavailable := sc.dataavailable;\r
175   writeln('creating and setting up client socket');\r
176   clientsocket := tlsocket.create(nil);\r
177   clientsocket.addr := '::1';{'127.0.0.1';}\r
178   clientsocket.port := '12345';\r
179   clientsocket.onsessionconnected := sc.sessionconnected;\r
180   clientsocket.ondataAvailable := sc.dataavailable;\r
181   clientsocket.onsessionclosed := sc.sessionclosed;\r
182   writeln('connecting');\r
183   clientsocket.connect;\r
184   writeln('client socket is number ',clientsocket.fdhandlein);\r
185   writeln('creating and setting up timer');\r
186   timer := tltimer.create(nil);\r
187   timer.interval := 1000;\r
188   timer.ontimer := sc.timehandler;\r
189   timer.enabled := true;\r
190   writeln('entering message loop');\r
191   messageloop;\r
192   writeln('exiting cleanly');\r
193 end.\r