source: cprs/branches/GUI-config/BDK32/Source/Rpcnet.pas@ 1099

Last change on this file since 1099 was 476, checked in by Kevin Toppenberg, 16 years ago

New WorldVistA Config Utility

File size: 11.5 KB
RevLine 
[476]1{ **************************************************************
2 Package: XWB - Kernel RPCBroker
3 Date Created: Sept 18, 1997 (Version 1.1)
4 Site Name: Oakland, OI Field Office, Dept of Veteran Affairs
5 Developers: Danila Manapsal, Don Craven, Joel Ivey
6 Description: winsock utilities.
7 Current Release: Version 1.1 Patch 40 (January 7, 2005))
8*************************************************************** }
9
10
11unit RpcNet ;
12{
13 Changes in v1.1.13 (JLI -- 8/23/00) -- XWB*1.1*13
14 Made changes to cursor dependent on current cursor being crDefault so
15 that the application can set it to a different cursor for long or
16 repeated processes without the cursor 'flashing' repeatedly.
17}
18interface
19
20uses
21 SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
22 Forms, Dialogs, winsock;
23
24Const XWB_GHIP = WM_USER + 10000;
25//Const XWB_SELECT = WM_USER + 10001;
26
27Const WINSOCK1_1 = $0101;
28Const PF_INET = 2;
29Const SOCK_STREAM = 1;
30Const IPPROTO_TCP = 6;
31Const INVALID_SOCKET = -1;
32Const SOCKET_ERROR = -1;
33Const FIONREAD = $4004667F;
34Const ActiveConnection: boolean = False;
35
36type EchatError = class(Exception);
37
38type
39 TRPCFRM1 = class(TForm)
40 private
41 { Private declarations }
42 public
43 { Public declarations }
44 procedure XWBGHIP(var msgSock: TMessage);
45 //procedure xwbSelect(var msgSock: TMessage); //P14
46 procedure WndProc(var Message : TMessage); reintroduce; //P14
47end;
48
49type
50 WinTaskRec = record
51 InUse: boolean;
52 pTCPResult: Pointer;
53 strTemp: string; {generic output string for async calls}
54 chrTemp: PChar; {generic out PChar for async calls}
55 hTCP: THandle; {pseudo handle for async calls}
56 hWin: hWnd; {handle for owner window}
57 CallWait: boolean;
58 CallAbort: boolean;
59 RPCFRM1: TRPCFRM1;
60 end;
61
62var
63 WRec: array[1..128] of WinTaskRec;
64 Hash: array[0..159] of char;
65
66{Windows OS abstraction functions. Should be taken over by VA Kernel}
67
68function libGetCurrentProcess: word;
69
70{Socket functions using library RPCLIB.DLL, in this case called locally}
71
72//function libAbortCall(inst: integer): integer; export; //P14
73function libGetHostIP1(inst: integer; HostName: PChar;
74 var outcome: PChar): integer; export;
75function libGetLocalIP(inst: integer; var outcome: PChar): integer; export;
76procedure libClose(inst: integer); export;
77function libOpen:integer; export;
78
79function GetTCPError:string;
80
81{Secure Hash Algorithm functions, library SHA.DLL and local interfaces}
82
83function libGetLocalModule: PChar; export;
84function GetFileHash(fn: PChar): longint; export;
85
86implementation
87
88uses rpcconf1;
89
90{function shsTest: integer; far; external 'SHA';
91procedure shsHash(plain: PChar; size: integer;
92 Hash: PChar); far; external 'SHA';} //Removed in P14
93
94{$R *.DFM}
95
96
97
98function libGetCurrentProcess: word;
99begin
100 Result := GetCurrentProcess;
101end;
102
103function libGetLocalIP(inst: integer; var outcome: PChar): integer;
104var
105 local: PChar;
106begin
107 local := StrAlloc(255);
108 gethostname( local, 255);
109 Result := libGetHostIP1(inst, local, outcome);
110 StrDispose(local);
111end;
112
113function libGetLocalModule: PChar;
114var
115 tsk: THandle;
116 name: PChar;
117begin
118 tsk := GetCurrentProcess;
119 name := StrAlloc(1024);
120 GetModuleFilename(tsk, name, 1024);
121 Result := name;
122
123end;
124
125function GetFileHash(fn: PChar): longint;
126var
127 hFn: integer;
128 finfo: TOFSTRUCT;
129 bytesRead, status: longint;
130 tBuf: PChar;
131
132begin
133 tBuf := StrAlloc(160);
134 hFn := OpenFile(fn, finfo, OF_READ);
135 bytesRead := 0;
136 status := _lread(hFn, tBuf, sizeof(tBuf));
137 while status <> 0 do
138 begin
139 status := _lread(hFn, tBuf, sizeof(tBuf));
140 inc(bytesRead,status);
141 end;
142 _lclose(hFn);
143 StrDispose(tBuf);
144 Result := bytesRead;
145end;
146
147function libOpen:integer;
148var
149 inst: integer;
150 WSData: TWSADATA;
151 RPCFRM1: TRPCFRM1;
152begin
153 inst := 1; {in this case, no DLL so instance is always 1}
154 RPCFRM1 := TRPCFRM1.Create(nil); //P14
155 with WRec[inst] do
156 begin
157 hWin := AllocateHWnd(RPCFRM1.wndproc);
158
159 WSAStartUp(WINSOCK1_1, WSData);
160 WSAUnhookBlockingHook;
161
162 Result := inst;
163 InUse := True;
164 end;
165 RPCFRM1.Release; //P14
166end;
167
168procedure libClose(inst: integer);
169begin
170
171 with WRec[inst] do
172 begin
173 InUse := False;
174 WSACleanup;
175 DeallocateHWnd(hWin);
176 end;
177end;
178
179function libGetHostIP1(inst: integer; HostName: PChar;
180 var outcome: PChar): integer;
181var
182 //RPCFRM1: TRPCFRM1; {P14}
183 //wMsg: TMSG; {P14}
184 //hWnd: THandle; {P14}
185 ChangeCursor: Boolean;
186
187begin
188
189 outcome[0] := #0;
190
191 if Screen.Cursor = crDefault then
192 ChangeCursor := True
193 else
194 ChangeCursor := False;
195 if ChangeCursor then
196 Screen.Cursor := crHourGlass;
197
198 with WRec[inst] do
199 begin
200
201 if HostName[0] = #0 then
202 begin
203 StrCat(outcome,'No Name to Resolve!');
204 Result := -1;
205 exit;
206 end;
207
208 if CallWait = True then
209 begin
210 outcome[0] := #0;
211 StrCat(outcome, 'Call in Progress');
212 Result := -1;
213 exit;
214 end;
215
216 if inet_addr(HostName) > INADDR_ANY then
217 begin
218 outcome := Hostname;
219 Result := 0;
220 if ChangeCursor then
221 Screen.Cursor := crDefault;
222 WSACleanup;
223 exit;
224 end;
225
226 GetMem(pTCPResult, MAXGETHOSTSTRUCT+1);
227 try
228 begin
229 CallWait := True;
230 CallAbort := False;
231 PHostEnt(pTCPResult)^.h_name := nil;
232 hTCP := WSAAsyncGetHostByName(hWin, XWB_GHIP, HostName,
233 pTCPResult, MAXGETHOSTSTRUCT );
234 { loop while CallWait is True }
235 CallAbort := False;
236 while CallWait = True do
237 Application.ProcessMessages;
238 end;
239 except on EInValidPointer do
240 begin
241 StrCat(outcome,'Error in GetHostByName');
242 if ChangeCursor then
243 Screen.Cursor := crDefault;
244 end;
245
246 end;
247
248 FreeMem(pTCPResult, MAXGETHOSTSTRUCT+1);
249 StrCopy(outcome,chrTemp);
250 Result := 0;
251 if ChangeCursor then
252 Screen.Cursor := crDefault;
253 end;
254 end;
255
256(*procedure TRPCFRM1.XWBSELECT(var msgSock: TMessage);
257var
258 noop: integer;
259begin
260 case msgSock.lparam of
261 FD_ACCEPT: {connection arrived}
262 begin
263 noop := 1;
264 end;
265 FD_CONNECT: {connection initiated}
266 begin
267 noop := 1;
268 end;
269 FD_READ: {data received, put in display}
270 begin
271 noop := 1;
272 end;
273 FD_CLOSE: {disconnection of accepted socket}
274 begin
275 noop := 1;
276 end;
277 else
278 noop := 1;
279 end;
280end;*) //Procedure removed in P14.
281
282procedure TRPCFRM1.WndProc(var Message : TMessage);
283begin
284 with Message do
285 case Msg of
286 {XWB_SELECT : xwbSelect(Message);} //P14
287 XWB_GHIP: xwbghip(Message);
288 else
289 DefWindowProc(WRec[1].hWin, Msg, wParam, lParam);
290 {Inherited WndProc(Message);}
291 end;
292end;
293
294procedure TRPCFRM1.XWBGHIP(var msgSock: TMessage);
295var
296 TCPResult: PHostEnt;
297 WSAError: integer;
298 HostAddr: TSockaddr;
299 inst: integer;
300
301begin
302 inst := 1; {local case is always 1}
303
304
305 with WRec[inst] do
306 begin
307
308 hTCP := msgSock.WParam;
309
310 chrTemp := StrAlloc(512);
311
312 CallWait := False;
313 If CallAbort = True then { User aborted call }
314 begin
315 StrCopy(ChrTemp,'Abort!');
316 exit;
317 end;
318
319 WSAError := WSAGetAsyncError(hTCP); { in case async call failed }
320 If WSAError < 0 then
321 begin
322 StrPCopy(chrTemp,IntToStr(WSAError));
323 exit;
324 end;
325
326 try
327 begin
328 TCPResult := PHostEnt(pTCPResult);
329 StrTemp := '';
330 if TCPResult^.h_name = nil then
331 begin
332 StrCopy(chrTemp, 'Unknown!');
333 if rpcconfig <> nil then
334 rpcconfig.panel4.Caption := StrPas(chrTemp);
335 exit;
336 end;
337 {success, return resolved address}
338 HostAddr.sin_addr.S_addr := longint(plongint(TCPResult^.h_addr_list^)^);
339 chrTemp := inet_ntoa(HostAddr.sin_addr);
340 end;
341 except on EInValidPointer do StrCat(chrTemp, 'Error in GetHostByName');
342 end;
343end;
344end;
345
346(*function libAbortCall(inst: integer): integer;
347var
348 WSAError: integer;
349begin
350
351 with WRec[inst] do
352 begin
353
354 WSAError := WSACancelAsyncRequest(hTCP);
355 if WSAError = Socket_Error then
356 begin
357 WSAError := WSAGetLastError;
358 CallWait := False;
359 CallAbort := True;
360 Result := WSAError;
361 end;
362
363 CallAbort := True;
364 CallWait := False;
365 Result := WSAError;
366
367 end;
368
369end; *) //Removed in P14
370
371function GetTCPError:string;
372var
373 x: string;
374 r: integer;
375
376begin
377 r := WSAGetLastError;
378 Case r of
379 WSAEINTR : x := 'WSAEINTR';
380 WSAEBADF : x := 'WSAEINTR';
381 WSAEFAULT : x := 'WSAEFAULT';
382 WSAEINVAL : x := 'WSAEINVAL';
383 WSAEMFILE : x := 'WSAEMFILE';
384 WSAEWOULDBLOCK : x := 'WSAEWOULDBLOCK';
385 WSAEINPROGRESS : x := 'WSAEINPROGRESS';
386 WSAEALREADY : x := 'WSAEALREADY';
387 WSAENOTSOCK : x := 'WSAENOTSOCK';
388 WSAEDESTADDRREQ : x := 'WSAEDESTADDRREQ';
389 WSAEMSGSIZE : x := 'WSAEMSGSIZE';
390 WSAEPROTOTYPE : x := 'WSAEPROTOTYPE';
391 WSAENOPROTOOPT : x := 'WSAENOPROTOOPT';
392 WSAEPROTONOSUPPORT : x := 'WSAEPROTONOSUPPORT';
393 WSAESOCKTNOSUPPORT : x := 'WSAESOCKTNOSUPPORT';
394 WSAEOPNOTSUPP : x := 'WSAEOPNOTSUPP';
395 WSAEPFNOSUPPORT : x := 'WSAEPFNOSUPPORT';
396 WSAEAFNOSUPPORT : x := 'WSAEAFNOSUPPORT';
397 WSAEADDRINUSE : x := 'WSAEADDRINUSE';
398 WSAEADDRNOTAVAIL : x := 'WSAEADDRNOTAVAIL';
399 WSAENETDOWN : x := 'WSAENETDOWN';
400 WSAENETUNREACH : x := 'WSAENETUNREACH';
401 WSAENETRESET : x := 'WSAENETRESET';
402 WSAECONNABORTED : x := 'WSAECONNABORTED';
403 WSAECONNRESET : x := 'WSAECONNRESET';
404 WSAENOBUFS : x := 'WSAENOBUFS';
405 WSAEISCONN : x := 'WSAEISCONN';
406 WSAENOTCONN : x := 'WSAENOTCONN';
407 WSAESHUTDOWN : x := 'WSAESHUTDOWN';
408 WSAETOOMANYREFS : x := 'WSAETOOMANYREFS';
409 WSAETIMEDOUT : x := 'WSAETIMEDOUT';
410 WSAECONNREFUSED : x := 'WSAECONNREFUSED';
411 WSAELOOP : x := 'WSAELOOP';
412 WSAENAMETOOLONG : x := 'WSAENAMETOOLONG';
413 WSAEHOSTDOWN : x := 'WSAEHOSTDOWN';
414 WSAEHOSTUNREACH : x := 'WSAEHOSTUNREACH';
415 WSAENOTEMPTY : x := 'WSAENOTEMPTY';
416 WSAEPROCLIM : x := 'WSAEPROCLIM';
417 WSAEUSERS : x := 'WSAEUSERS';
418 WSAEDQUOT : x := 'WSAEDQUOT';
419 WSAESTALE : x := 'WSAESTALE';
420 WSAEREMOTE : x := 'WSAEREMOTE';
421 WSASYSNOTREADY : x := 'WSASYSNOTREADY';
422 WSAVERNOTSUPPORTED : x := 'WSAVERNOTSUPPORTED';
423 WSANOTINITIALISED : x := 'WSANOTINITIALISED';
424 WSAHOST_NOT_FOUND : x := 'WSAHOST_NOT_FOUND';
425 WSATRY_AGAIN : x := 'WSATRY_AGAIN';
426 WSANO_RECOVERY : x := 'WSANO_RECOVERY';
427 WSANO_DATA : x := 'WSANO_DATA';
428
429 else x := 'Unknown Error';
430 end;
431 Result := x + ' (' + IntToStr(r) + ')';
432end;
433
434
435end.
Note: See TracBrowser for help on using the repository browser.