home *** CD-ROM | disk | FTP | other *** search
/ PC World 2000 October / PCWorld_2000-10_cd2.bin / Borland / interbase / IBConsole_src.ZIP / ibconsole / frmuCommDiag.pas < prev    next >
Pascal/Delphi Source File  |  2000-07-24  |  36KB  |  1,172 lines

  1. {
  2.  * The contents of this file are subject to the InterBase Public License
  3.  * Version 1.0 (the "License"); you may not use this file except in
  4.  * compliance with the License.
  5.  * 
  6.  * You may obtain a copy of the License at http://www.Inprise.com/IPL.html.
  7.  * 
  8.  * Software distributed under the License is distributed on an "AS IS"
  9.  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
  10.  * the License for the specific language governing rights and limitations
  11.  * under the License.  The Original Code was created by Inprise
  12.  * Corporation and its predecessors.
  13.  * 
  14.  * Portions created by Inprise Corporation are Copyright (C) Inprise
  15.  * Corporation. All Rights Reserved.
  16.  * 
  17.  * Contributor(s): ______________________________________.
  18. }
  19.  
  20. {****************************************************************
  21. *
  22. *  f r m u C o m m D i a g
  23. *
  24. ****************************************************************
  25. *  Author: The Client Server Factory Inc.
  26. *  Date:   March 1, 1999
  27. *
  28. *  Description:  This unit provides all the necessary functions
  29. *                and interface to perform network communication
  30. *                diagnostics.
  31. *
  32. *****************************************************************
  33. * Revisions:
  34. *
  35. *****************************************************************}
  36.  
  37. unit frmuCommDiag;
  38.  
  39. interface
  40.  
  41. uses
  42.   Windows, SysUtils,Forms, ExtCtrls, StdCtrls, Classes, Controls, ComCtrls, Dialogs,
  43.   Graphics, zluibcClasses, zluCommDiag, Winsock, IB, ScktComp, Registry,
  44.   IBDatabase, IBDatabaseInfo, Messages, frmuDlgClass;
  45.  
  46. type
  47.   TfrmCommDiag = class(TDialog)
  48.     btnSelDB: TButton;
  49.     cbDBServer: TComboBox;
  50.     cbNetBEUIServer: TComboBox;
  51.     cbProtocol: TComboBox;
  52.     cbSPXServer: TComboBox;
  53.     cbService: TComboBox;
  54.     cbTCPIPServer: TComboBox;
  55.     edtDatabase: TEdit;
  56.     edtPassword: TEdit;
  57.     edtUsername: TEdit;
  58.     gbDBServerInfo: TGroupBox;
  59.     gbDatabaseInfo: TGroupBox;
  60.     gbNetBEUIServerInfo: TGroupBox;
  61.     gbNovellServerInfo: TGroupBox;
  62.     gbTCPIPServerInfo: TGroupBox;
  63.     lblDBResults: TLabel;
  64.     lblDatabase: TLabel;
  65.     lblNetBEUIServer: TLabel;
  66.     lblNetBeuiResults: TLabel;
  67.     lblPassword: TLabel;
  68.     lblProtocol: TLabel;
  69.     lblSPXResults: TLabel;
  70.     lblSPXServer: TLabel;
  71.     lblServerName: TLabel;
  72.     lblService: TLabel;
  73.     lblUsername: TLabel;
  74.     lblWinSockResults: TLabel;
  75.     lblWinsockServer: TLabel;
  76.     memDBResults: TMemo;
  77.     memNetBeuiResults: TMemo;
  78.     memSPXResults: TMemo;
  79.     memTCPIPResults: TMemo;
  80.     pgcDiagnostics: TPageControl;
  81.     rbLocalServer: TRadioButton;
  82.     rbRemoteServer: TRadioButton;
  83.     tabDBConnection: TTabSheet;
  84.     tabNetBEUI: TTabSheet;
  85.     tabSPX: TTabSheet;
  86.     tabTCPIP: TTabSheet;
  87.     pnlButtonBar: TPanel;
  88.     btnTest: TButton;
  89.     btnCancel: TButton;
  90.     procedure FormCreate(Sender: TObject);
  91.     procedure FormDestroy(Sender: TObject);
  92.     procedure FormKeyPress(Sender: TObject; var Key: Char);
  93.     procedure btnCancelClick(Sender: TObject);
  94.     procedure btnSelDBClick(Sender: TObject);
  95.     procedure btnTestClick(Sender: TObject);
  96.     procedure cbDBServerClick(Sender: TObject);
  97.     procedure rbLocalServerClick(Sender: TObject);
  98.     procedure rbRemoteServerClick(Sender: TObject);
  99.     procedure edtDatabaseChange(Sender: TObject);
  100.   private
  101.     { Private declarations }
  102.     FProtocols: TStringList;
  103.     FRegistry: TRegistry;
  104.     FServers: TStringList;
  105.     function VerifyInputData(): boolean;
  106.     procedure PingServer;
  107.     procedure TestDBConnect;
  108.     procedure TestNetBEUI;
  109.     procedure TestPort(Port : String);
  110.     procedure TestSPX;
  111.     procedure WMNCLButtonDown( var Message: TWMNCLBUTTONDOWN ); message WM_NCLBUTTONDOWN ;
  112.   public
  113.     { Public declarations }
  114.   end;
  115.  
  116.   function DoDiagnostics(const CurrSelServer: TibcServerNode) : Integer;
  117.   function ServiceRunning(const CurrSelServer : TibcServerNode) : Boolean;
  118.  
  119. const
  120.   Port21     = 0;                      // constants to identify TCP/IP service tests
  121.   PortFTP    = 1;
  122.   Port3050   = 2;
  123.   Portgds_db = 3;
  124.   Ping       = 4;
  125.  
  126. var
  127.   frmCommDiag : TfrmCommDiag;
  128.  
  129. implementation
  130.  
  131. uses
  132.    zluGlobal, zluContextHelp, IBServices, frmuMessage;
  133.  
  134. {$R *.DFM}
  135.  
  136. {****************************************************************
  137. *
  138. *  D o D i a g n o t i c s
  139. *
  140. ****************************************************************
  141. *  Author: The Client Server Factory Inc.
  142. *  Date:   March 1, 1999
  143. *
  144. *  Input:  TibcServerNode - Specifies the currenly selected server
  145. *
  146. *  Return: Integer - Determines success or failure.
  147. *
  148. *  Description:  Responsible for creating the form.
  149. *
  150. *****************************************************************
  151. * Revisions:
  152. *
  153. *****************************************************************}
  154.  
  155. function DoDiagnostics(const CurrSelServer: TibcServerNode): integer;
  156. var
  157.   frmCommDiag: TfrmCommDiag;
  158. begin
  159.   frmCommDiag:= TfrmCommDiag.Create(Application);
  160.   try
  161.     // determine if a server is currently selected
  162.     if Assigned(CurrSelServer) then
  163.     begin
  164.       // if a local server is selected then check the local radio button
  165.       if CurrSelServer.Server.Protocol = Local then
  166.       begin
  167.         frmCommDiag.rbLocalServer.Checked := true;
  168.       end
  169.       else
  170.       begin
  171.         // otherwise select the specified protocol of the remote server from the protocol combo box
  172.         // and check the remote radio button
  173.         frmCommDiag.cbDBServer.Text := CurrSelServer.Servername;
  174.         case CurrSelServer.Server.Protocol of
  175.           TCP: frmCommDiag.cbProtocol.ItemIndex := frmCommDiag.cbProtocol.Items.IndexOf('TCP/IP');
  176.           NamedPipe: frmCommDiag.cbProtocol.ItemIndex := frmCommDiag.cbProtocol.Items.IndexOf('NetBEUI');
  177.           SPX: frmCommDiag.cbProtocol.ItemIndex := frmCommDiag.cbProtocol.Items.IndexOf('SPX');
  178.         end;
  179.         frmCommDiag.rbRemoteServer.Checked := true;
  180.       end;
  181.     end
  182.     else                               // if no server selected then assume Local Server
  183.       frmCommDiag.rbLocalServer.Checked := true;
  184.     frmCommDiag.ShowModal;             // show form as modal
  185.     if frmCommDiag.ModalResult = mrOK then
  186.     begin
  187.       result := SUCCESS;
  188.     end
  189.     else
  190.       result := FAILURE;
  191.   finally
  192.     // deallocate memory
  193.     frmCommDiag.Free;
  194.   end;
  195. end;
  196.  
  197. {****************************************************************
  198. *
  199. *  D o D i a g n o t i c s
  200. *
  201. ****************************************************************
  202. *  Author: The Client Server Factory Inc.
  203. *  Date:   March 1, 1999
  204. *
  205. *  Input:  TibcServerNode - Specifies the currenly selected server
  206. *
  207. *  Return: Integer - Determines success or failure.
  208. *
  209. *  Description:  Responsible for creating the form.
  210. *
  211. *****************************************************************
  212. * Revisions:
  213. *
  214. *****************************************************************}
  215.  
  216. function ServiceRunning(const CurrSelServer: TibcServerNode) : Boolean;
  217. var
  218.   lPipe   : TibcPipes;
  219.   lSPX    : TibcSPX;
  220.   lSocket : TibcSocket;
  221.   lStr    : String;
  222. begin
  223.   lPipe   := Nil;
  224.   lSPX    := Nil;
  225.   lSocket := Nil;
  226.   Result  := True;
  227.   try
  228.     case CurrSelServer.Server.Protocol of
  229.       TCP :
  230.       begin
  231.         lSocket := TibcSocket.Create(Nil);
  232.         lSocket.Host := CurrSelServer.Servername;
  233.         lSocket.Port := 3050;         // gds_db
  234.         lSocket.Timeout := 5000;      // set timeout for 5 secs.
  235.         try
  236.           lSocket.Connect;
  237.         except
  238.           Result := False;
  239.         end;
  240.       end;
  241.       NamedPipe :
  242.       begin
  243.         lPipe := TibcPipes.Create;
  244.         lPipe.Server := CurrSelServer.Servername;
  245.         lPipe.Path := '\pipe\interbas\server\gds_db';
  246.         lPipe.Tries := 5;
  247.         lStr := '';
  248.  
  249.         // test pipe
  250.         Result := lPipe.TestPipe(lStr, True);
  251.       end;
  252.       SPX :
  253.       begin
  254.  
  255.       end;
  256.     end;
  257.   finally
  258.     lPipe.Free;
  259.     lSPX.Free;
  260.     lSocket.Free
  261.   end;
  262. end;
  263.  
  264. // if user presses the Cancel button then set the result to mrCancel
  265. procedure TfrmCommDiag.btnCancelClick(Sender: TObject);
  266. begin
  267.   ModalResult := mrCancel;
  268. end;
  269.  
  270. {****************************************************************
  271. *
  272. *  b t n S e l D B C l i c k
  273. *
  274. ****************************************************************
  275. *  Author: The Client Server Factory Inc.
  276. *  Date:   March 1, 1999
  277. *
  278. *  Input:  Tobject
  279. *
  280. *  Return: None
  281. *
  282. *  Description:  Shows an open file dialog box that allows
  283. *                a user to browse for a local database file.
  284. *
  285. *****************************************************************
  286. * Revisions:
  287. *
  288. *****************************************************************}
  289.  
  290. procedure TfrmCommDiag.btnSelDBClick(Sender: TObject);
  291. var
  292.   lOpenDialog: TOpenDialog;
  293. begin
  294.   lOpenDialog := nil;
  295.   try
  296.   begin
  297.     // create and show open file dialog box
  298.     lOpenDialog := TOpenDialog.Create(self);
  299.     // specify defaul extension and filters
  300.     lOpenDialog.DefaultExt := 'gdb';
  301.     lOpenDialog.Filter := 'Database File (*.gdb)|*.GDB|All files (*.*)|*.*';
  302.     // if OK is pressed then extract selected filename
  303.     if lOpenDialog.Execute then
  304.     begin
  305.       edtDatabase.Text := lOpenDialog.Filename;
  306.     end;
  307.   end
  308.   finally
  309.     // deallocate memory
  310.     lOpenDialog.free;
  311.   end;
  312. end;
  313.  
  314. // if the local radio button is selected then enable and/or disable
  315. // the appropriate controls
  316. procedure TfrmCommDiag.rbLocalServerClick(Sender: TObject);
  317. begin
  318.   if rbLocalServer.Checked then
  319.   begin
  320.     cbDBServer.Text := '';
  321.     cbDBServer.Enabled := false;
  322.     cbProtocol.ItemIndex := -1;
  323.     cbProtocol.Enabled := false;
  324.     cbDBServer.Color := clSilver;
  325.     cbProtocol.Color := clSilver;
  326.     btnSelDB.Enabled := true;
  327.     edtDatabase.Text := '';
  328.     edtUsername.Text := '';
  329.     edtPassword.Text := '';
  330.   end
  331.   else
  332.   begin
  333.     cbDBServer.Enabled := true;
  334.     cbProtocol.Enabled := true;
  335.     cbDBServer.Color := clWindow;
  336.     cbProtocol.Color := clWindow;
  337.     btnSelDB.Enabled := false;
  338.     edtDatabase.Text := '';
  339.     edtUsername.Text := '';
  340.     edtPassword.Text := '';
  341.   end
  342. end;
  343.  
  344. // if the remote radio button is selected then enable and/or disable
  345. // the appropriate controls
  346. procedure TfrmCommDiag.rbRemoteServerClick(Sender: TObject);
  347. begin
  348.   if rbRemoteServer.Checked then
  349.   begin
  350.     cbDBServer.Enabled := true;
  351.     cbProtocol.Enabled := true;
  352.     cbDBServer.Color := clWindow;
  353.     cbProtocol.Color := clWindow;
  354.     btnSelDB.Enabled := false;
  355.     edtDatabase.Text := '';
  356.     edtUsername.Text := '';
  357.     edtPassword.Text := '';
  358.   end
  359.   else
  360.   begin
  361.     cbDBServer.Enabled := false;
  362.     cbProtocol.Enabled := false;
  363.     cbDBServer.Color := clSilver;
  364.     cbProtocol.Color := clSilver;
  365.     btnSelDB.Enabled := false;
  366.     edtDatabase.Text := '';
  367.     edtUsername.Text := '';
  368.     edtPassword.Text := '';
  369.   end
  370. end;
  371.  
  372. {****************************************************************
  373. *
  374. *  V e r i f y I n p u t D a t a ( )
  375. *
  376. ****************************************************************
  377. *  Author: The Client Server Factory Inc.
  378. *  Date:   March 1, 1999
  379. *
  380. *  Input:  None
  381. *
  382. *  Return: Boolean - Indicates whether all the necessary
  383. *                    data has been entered in order to
  384. *                    perform the specified task
  385. *
  386. *  Description:  Verifies whther all the necessary data has been
  387. *                enetered in order to performt he specified
  388. *                task.  If not an error message will be displayed
  389. *                and the control responsible for the violation
  390. *                will be given focus.
  391. *
  392. *****************************************************************
  393. * Revisions:
  394. *
  395. *****************************************************************}
  396.  
  397. function TfrmCommDiag.VerifyInputData(): boolean;
  398. begin
  399.   result := true;
  400.  
  401.   // if the db connection tab is currently active
  402.   if pgcDiagnostics.ActivePage = tabDBConnection then
  403.   begin
  404.     // if the remote radio button is checked
  405.     if rbRemoteServer.Checked then
  406.     begin
  407.       // then make sure a server has been supplied
  408.       if (cbDBServer.Text = '') or (cbDBServer.Text = ' ') then
  409.       begin
  410.         DisplayMsg(ERR_SERVER_NAME,'');
  411.         cbDBServer.SetFocus;
  412.         result := false;
  413.         Exit;
  414.       end;
  415.       // also make sure a network protocol has been selected
  416.       if (cbProtocol.Text = '') or (cbProtocol.Text = ' ') then
  417.       begin
  418.         DisplayMsg(ERR_PROTOCOL,'');
  419.         cbProtocol.SetFocus;
  420.         result := false;
  421.         Exit;
  422.       end;
  423.     end;
  424.  
  425.     // ensure that a database has been specified
  426.     if (edtDatabase.Text = '') or (edtDatabase.Text = ' ') then
  427.     begin
  428.       DisplayMsg(ERR_DB_ALIAS,'');
  429.       edtDatabase.SetFocus;
  430.       result := false;
  431.       Exit;
  432.     end;
  433.  
  434.     // ensure that a username has been specified
  435.     if (edtUsername.Text = '') or (edtUsername.Text = ' ') then
  436.     begin
  437.       DisplayMsg(ERR_USERNAME,'');
  438.       edtUsername.SetFocus;
  439.       result := false;
  440.       Exit;
  441.     end;
  442.  
  443.     // ensure that a password has been specified
  444.     if (edtPassword.Text = '') or (edtPassword.Text = ' ') then
  445.     begin
  446.       DisplayMsg(ERR_PASSWORD,'');
  447.       edtPassword.SetFocus;
  448.       result := false;
  449.       Exit;
  450.     end;
  451.   end
  452.  
  453.   // otherwise, if the NetBEUI tab is active
  454.   else if pgcDiagnostics.ActivePage = tabNetBEUI then
  455.   begin
  456.     // ensure that a server is specified
  457.     if (cbNetBEUIServer.Text = '') or (cbNetBEUIServer.Text = ' ') then
  458.     begin
  459.       DisplayMsg(ERR_SERVER_NAME,'');
  460.       cbNetBEUIServer.SetFocus;
  461.       result := false;
  462.       Exit;
  463.     end;
  464.   end
  465.  
  466.   // otherwise if the SPX tab is active
  467.   else if pgcDiagnostics.ActivePage = tabSPX then
  468.   begin
  469.     // ensure that a server is specified
  470.     if (cbSPXServer.Text = '') or (cbSPXServer.Text = ' ') then
  471.     begin
  472.       DisplayMsg(ERR_SERVER_NAME,'');
  473.       cbSPXServer.SetFocus;
  474.       result := false;
  475.       Exit;
  476.     end;
  477.   end
  478.  
  479.   // otherwise if the TCP/IP tab is active
  480.   else if pgcDiagnostics.ActivePage = tabTCPIP then
  481.   begin
  482.     // ensure that a server is specified
  483.     if (cbTCPIPServer.Text = '') or (cbTCPIPServer.Text = ' ') then
  484.     begin
  485.       DisplayMsg(ERR_SERVER_NAME,'');
  486.       cbTCPIPServer.SetFocus;
  487.       result := false;
  488.       Exit;
  489.     end;
  490.  
  491.     // also ensure that a service has been selected
  492.     if (cbService.Text = '') or (cbService.Text = ' ') then
  493.     begin
  494.       DisplayMsg(ERR_SERVICE,'');
  495.       cbService.SetFocus;
  496.       result := false;
  497.       Exit;
  498.     end;
  499.   end;
  500. end;
  501.  
  502. {****************************************************************
  503. *
  504. *  b t n T e s t C l i c k
  505. *
  506. ****************************************************************
  507. *  Author: The Client Server Factory Inc.
  508. *  Date:   March 1, 1999
  509. *
  510. *  Input:  TObject
  511. *
  512. *  Return: None
  513. *
  514. *  Description:  Determines which tab is active and performs
  515. *                the appropriate network disgnostic.
  516. *
  517. *****************************************************************
  518. * Revisions:
  519. *
  520. *****************************************************************}
  521.  
  522. procedure TfrmCommDiag.btnTestClick(Sender: TObject);
  523. begin
  524.   // if all the necessary data has been supplied then proceed
  525.   if VerifyInputData() then
  526.   begin
  527.     // if DB connection is the active page
  528.     if pgcDiagnostics.ActivePage = tabDBConnection then
  529.     begin
  530.       memDBResults.Lines.Clear;        // then clear the database results
  531.       TestDBConnect;                   // perform the database test
  532.     end;
  533.  
  534.     // if TCP/IP is the active page
  535.     if pgcDiagnostics.ActivePage = tabTCPIP then
  536.     begin
  537.       memTCPIPResults.Lines.Clear;     // then clear the TCP/IP results
  538.       case cbService.ItemIndex of     // determine which service is selected
  539.         Port21     : TestPort('21');   // and perform the TCP/IP test
  540.         PortFTP    : TestPort('ftp');
  541.         Port3050   : TestPort('3050');
  542.         Portgds_db : TestPort('gds_db');
  543.         Ping       : PingServer;
  544.       end;
  545.     end;
  546.  
  547.     // if NetBEUI is the active page
  548.     if pgcDiagnostics.ActivePage = tabNetBEUI then
  549.     begin
  550.       memNetBEUIResults.Lines.Clear;   // then clear the NetBEUI results
  551.       TestNetBEUI;                     // perform the NetBEUI test
  552.     end;
  553.  
  554.     // if SPX is the active page
  555.     if pgcDiagnostics.ActivePage = tabSPX then
  556.     begin
  557.       memSPXResults.Lines.Clear;       // then clear the SPX results
  558.       TestSPX;
  559.     end;
  560.  
  561.   end;
  562. end;
  563.  
  564. {****************************************************************
  565. *
  566. *  P i n g S e r v e r
  567. *
  568. ****************************************************************
  569. *  Author: The Client Server Factory Inc.
  570. *  Date:   March 1, 1999
  571. *
  572. *  Input:  None
  573. *
  574. *  Return: None
  575. *
  576. *  Description:  Creates a Ping object and performs a
  577. *                TCP/IP ping returning round trip times and
  578. *                packet loss statistics.
  579. *
  580. *****************************************************************
  581. * Revisions:
  582. *
  583. *****************************************************************}
  584.  
  585. procedure TfrmCommDiag.PingServer;
  586. var
  587.   Ping        : TibcPing;              // Ping
  588.   iMaxRTT     : Integer;               // store maximum round trip time
  589.   iMinRTT     : Integer;               // store minimum round trip time
  590.   iAvgRTT     : Integer;               // stores average round trip time
  591.   fPacketLoss : Real;                  // stores packet loss statistics
  592.   iPackets    : Integer;               // stores number of packets
  593.   iSuccesses  : Integer;               // stores number of successes
  594.   i           : Integer;               // counter
  595. begin
  596.   Ping := Nil;                         // initialize variables
  597.   iMaxRTT:=0;
  598. //  iMinRTT:=0;
  599.   iAvgRTT:=0;
  600. //  fPacketLoss:=0;
  601.   iSuccesses:=0;
  602.   iPackets:=4;
  603.  
  604.   Screen.Cursor := crHourGlass;
  605.   try
  606.     Ping := TibcPing.Create;           // create ping object
  607.  
  608.     with Ping do
  609.     begin
  610.       Host:=cbTCPIPServer.Text;       // set hostname
  611.       Size:=32;                        // set packet size
  612.       TTL:=64;                         // set time to live
  613.       TimeOut:=4000;                   // set timeout
  614.       iMinRTT:=TimeOut div 1000;       // set the minimum RTT to timeout
  615.     end;
  616.  
  617.     // try to resolve host and get an IP address
  618.     if Ping.ResolveHost then
  619.     begin
  620.       // if the specified host is already an IP address
  621.       if Ping.HostName = ping.HostIP then
  622.       begin
  623.         memTCPIPResults.Lines.Add('Pinging ' + Ping.HostIP + ' with ' +
  624.           IntToStr(Ping.Size) + ' bytes of data:');
  625.       end
  626.       else
  627.       begin
  628.         // if name is resolved then show hostname and IP address
  629.         memTCPIPResults.Lines.Add('Pinging ' + Ping.HostName + ' [' +
  630.           Ping.HostIP + '] ' + ' with ' + IntToStr(Ping.Size) + ' bytes of data:');
  631.       end;
  632.       memTCPIPResults.Lines.Add('');
  633.  
  634.       // ping server iPacket times
  635.       for i:=0 to iPackets-1 do
  636.       begin
  637.         // ping server
  638.         Ping.Ping;
  639.         with memTCPIPResults.Lines do
  640.         begin
  641.           // if no errors
  642.           if Ping.LastError = 0 then
  643.           begin
  644.             // increment the number of successes
  645.             Inc(iSuccesses);
  646.             // add the round trip time to the average acc
  647.             iAvgRTT:=iAvgRTT + Ping.RTTReply;
  648.             // if RTT larger then maxRTT then store it
  649.             if Ping.RTTReply > iMaxRTT then
  650.               iMaxRTT:=Ping.RTTReply;
  651.             // if RTT less then minRTT then store it
  652.             if Ping.RTTReply < iMinRTT then
  653.               iMinRTT:=Ping.RTTReply;
  654.             // if no error then show reply
  655.             if Ping.LastError = 0 then
  656.             begin
  657.               Add('Reply from ' + Ping.HostIP + ': ' + 'bytes=' +
  658.                 IntToStr(Ping.Size) + ' time=' + IntToStr(Ping.RTTReply) +
  659.                 'ms ' + 'TTL=' + IntToStr(Ping.TTLReply));
  660.             end;
  661.           end
  662.           else                         // if an error occured
  663.           begin
  664.             Add(Ping.VerboseResult);   // then show verbose error message
  665.           end;
  666.         end;
  667.       end;
  668.  
  669.       if iSuccesses < 1 then           // if there were no successful pings
  670.         iMinRTT:=0;                    // then set minimum RTT to 0
  671.  
  672.       // calculate the percentage of lost packets
  673.       fPacketLoss:=((iPackets - iSuccesses) / iPackets) * 100;
  674.       // calculate the average round trip times
  675.       iAvgRTT:=iAvgRTT div iPackets;
  676.  
  677.       // show ping statistics
  678.       with memTCPIPResults.Lines do
  679.       begin
  680.         Add('');
  681.         Add('Ping statistics for ' + Ping.HostIP + ':');
  682.         Add('    Packets: Send = ' + IntToStr(iPackets) + ', Received = ' +
  683.           IntToStr(iSuccesses) + ', Lost = ' + IntToStr(iPackets-iSuccesses) +
  684.           ' (' + FloatToStr(fPacketLoss) + '%),');
  685.         Add('Approximate round trip times in milli-seconds:');
  686.         Add('    Minimum = ' + IntToStr(iMinRTT) + 'ms, Maximum = ' +
  687.           IntToStr(iMaxRTT) + 'ms, ' + 'Average = ' + IntToStr(iAvgRTT) + 'ms');
  688.       end;
  689.     end
  690.     else                               // if host can't be resolved shot error message
  691.       memTCPIPResults.Lines.add('Unknown host ' + cbTCPIPServer.Text + '.');
  692.   finally
  693.     // deallocate memory
  694.     Ping.Free;
  695.     Screen.Cursor := crDefault;
  696.   end;
  697. end;
  698.  
  699. {****************************************************************
  700. *
  701. *  T e s t D B C o n n e c t
  702. *
  703. ****************************************************************
  704. *  Author: The Client Server Factory Inc.
  705. *  Date:   March 1, 1999
  706. *
  707. *  Input:  None
  708. *
  709. *  Return: None
  710. *
  711. *  Description:  Creates a Database object and performs a
  712. *                database connect test using a specified protocol.
  713. *
  714. *****************************************************************
  715. * Revisions:
  716. *
  717. *****************************************************************}
  718.  
  719. procedure TfrmCommDiag.TestDBConnect;
  720. var
  721.   lDatabase : TIBDatabase;
  722.   lProto    : TProtocol;
  723.   iSuccess  : Boolean;
  724.   lDBInfo   : TIBDatabaseInfo;
  725. begin
  726.   lDatabase := Nil;                    // initialize variables
  727.   lDBInfo   := Nil;
  728.   iSuccess  := True;;
  729.   lProto    := Local;
  730.  
  731.   Screen.Cursor := crHourGlass;
  732.  
  733.   // if the local radio button is checked then set protocol to local
  734.   if rbLocalServer.Checked or ((cbProtocol.ItemIndex < 0) and
  735.      (rbLocalServer.Checked = False)) then
  736.     lProto:=Local
  737.   else
  738.   begin
  739.     // otherwise determine the specified protocol
  740.     case cbProtocol.ItemIndex of
  741.       0 : lProto:=TCP;
  742.       1 : lProto:=NamedPipe;
  743.       2 : lProto:=SPX;
  744.     end;
  745.   end;
  746.  
  747.   try
  748.     // create the database object
  749.     lDatabase := TIBDatabase.Create(Self);
  750.     lDBInfo   := TIBDatabaseInfo.Create(Self);
  751.     try
  752.       // setup database path according to the specified protocol
  753.       case lProto of
  754.         TCP       : lDatabase.DatabaseName := Format('%s:%s',[UpperCase(cbDBServer.Text), edtDatabase.Text]);
  755.         NamedPipe : lDatabase.DatabaseName := Format('\\%s\%s',[UpperCase(cbDBServer.Text), edtDatabase.Text]);
  756.         SPX       : lDatabase.DatabaseName := Format('%s@%s',[UpperCase(cbDBServer.Text), edtDatabase.Text]);
  757.         Local     : lDatabase.DatabaseName := edtDatabase.Text;
  758.       end;
  759.  
  760.       // supply parameters to the database
  761.       lDatabase.LoginPrompt:=False;
  762.       lDatabase.Params.Clear;
  763.       lDatabase.Params.Add(Format('isc_dpb_user_name=%s',[edtUsername.Text]));
  764.       lDatabase.Params.Add(Format('isc_dpb_password=%s',[edtPassword.Text]));
  765.       // connect to database
  766.       lDatabase.Connected:=True;
  767.  
  768.       // show database name
  769.       lDBInfo.Database := lDatabase;
  770.       memDBResults.Lines.Add('Attempting to connect to:');
  771.       memDBResults.Lines.Add(lDatabase.DatabaseName);
  772.       memDBResults.Lines.Add(Format('Version : %s', [lDBInfo.Version]));
  773.       memDBResults.Lines.Add('');
  774.  
  775.       // test attach - if connected then attach was successful
  776.       if lDatabase.TestConnected then
  777.         memDBResults.Lines.Add('Attaching    ... Passed!');
  778.  
  779.       try
  780.         // test detach - detach from database
  781.         lDatabase.Connected:=False;
  782.         // if not connected then detach was successful
  783.         if not lDatabase.Connected then
  784.           memDBResults.Lines.Add('Detaching    ... Passed!');
  785.       except
  786.         on E : EIBError do
  787.         begin
  788.           // if an error occurs while detaching then show message
  789.           memDBResults.Lines.Add('An InterBase error has occurred while detaching.');
  790.           memDBResults.Lines.Add('Error - ' + E.Message);
  791.           memDBResults.Lines.Add('');
  792.           iSuccess:=False;             // set success flag to false
  793.         end;
  794.       end;
  795.     except
  796.       on E : EIBError do
  797.       begin
  798.         // if an error occurs while attaching then show message
  799.         memDBResults.Lines.Add('An InterBase error has occurred while attaching.');
  800.         memDBResults.Lines.Add('Error - ' + E.Message);
  801.         iSuccess:=False;               // set success flag to false
  802.       end;
  803.     end;
  804.   finally
  805.     with memDBResults.Lines do
  806.     begin
  807.       if iSuccess then                 // show appropriate message
  808.       begin                            // depending on Success flag
  809.         Add('');
  810.         Add('InterBase Communication Test Passed!');
  811.       end
  812.       else
  813.         Add('InterBase Communication Test Failed!');
  814.     end;
  815.     // deallocate memory
  816.     lDatabase.Free;
  817.     lDBInfo.Free;
  818.     Screen.Cursor := crDefault;
  819.   end;
  820. end;
  821.  
  822. {****************************************************************
  823. *
  824. *  T e s t P o r t
  825. *
  826. ****************************************************************
  827. *  Author: The Client Server Factory Inc.
  828. *  Date:   March 1, 1999
  829. *
  830. *  Input:  String - name or number of port service
  831. *
  832. *  Return: None
  833. *
  834. *  Description:  Creates a socket object and performs a
  835. *                port/service test using TCP/IP.
  836. *
  837. *****************************************************************
  838. * Revisions:
  839. *
  840. *****************************************************************}
  841.  
  842. procedure TfrmCommDiag.TestPort(Port : String);
  843. var
  844.   Sock     : TibcSocket;               // socket
  845.   iPort    : Integer;                  // port number
  846.   iResolve : Boolean;                  // port name resolution successful
  847.   lService : String;                   // service name
  848.   iSuccess : Boolean;                  // test successful
  849. begin
  850.   Sock := Nil;                         // initialize variables
  851. //  iResolve := False;
  852.   iSuccess := True;
  853.   iPort := 3050;
  854.   Screen.Cursor := crHourGlass;
  855.  
  856.   try
  857.     iPort:=StrToInt(Port);             // convert specified port to a number
  858.     iResolve:=True;                    // set resolution flag to true
  859.   except
  860.     on E : EConvertError do            // if a conversion error occurs then
  861.     begin                              // est conversion flag to false
  862.       iResolve:=False;
  863.     end;
  864.   end;
  865.  
  866.   try
  867.     Sock:=TibcSocket.Create(Self);     // create socket
  868.     Sock.Host := cbTCPIPServer.Text;  // set hostname
  869.     Sock.ReportLevel := 1;             // set report level
  870.     Sock.Timeout := 5000;              // set timeout
  871.  
  872.     with memTCPIPResults.Lines do
  873.     begin
  874.       Add('Attempting connection to ' + cbTCPIPServer.Text + '.');
  875.       Add('Socket for connection obtained.');
  876.       Add('');
  877.  
  878.       // if port was resolved to a number then
  879.       if iResolve then
  880.       begin
  881.         Sock.Port:=iPort;              // set the port number
  882.         lService:=Sock.PortName;       // get the port name
  883.  
  884.         if lService <> '' then
  885.           Add('Found service ''' + lService + ''' at port ''' + Port + '''')
  886.         else
  887.           Add('Could not resolve service ''' + lService +
  888.               ''' at port ''' + Port + '''');
  889.       end
  890.       // otherwise manually resolve port name to a number
  891.       // and set the port number
  892.       else
  893.       begin
  894.         if Port = 'ftp' then
  895.           Sock.Port:=21
  896.         else if Port = 'gds_db' then
  897.           Sock.Port:=3050;
  898.       end;
  899.  
  900.       try
  901.         // connect to server via the specified service/port
  902.         Sock.Connect;
  903.       except
  904.         on E : ESocketError do
  905.         begin
  906.           // if a socket error occurs then set success flag to false
  907.           Add('Socket Error Trapped!');
  908.           iSuccess:=False;
  909.         end
  910.         else
  911.         begin
  912.           // otherwise some other error occured
  913.           Add('Failed to connect to host ''' + cbTCPIPServer.Text + ''',');
  914.           Add('on port ' + Port + '. Error Num: ' +
  915.               IntToStr(Sock.LastErrorNo) + '.');
  916.           iSuccess:=False;
  917.         end;
  918.       end;
  919.  
  920.       // if the connectin is successful
  921.       if Sock.Connected then
  922.       begin
  923.         Add('Connection established to host ''' + cbTCPIPServer.Text + ''',');
  924.         Add('on port ' + Port + '.');
  925.         Sock.Disconnect;
  926.       end;
  927.     end;
  928.   finally
  929.     with memTCPIPResults.Lines do
  930.     begin
  931.       Add('');
  932.       if iSuccess then
  933.         Add('TCP/IP Communication Test Passed!')
  934.       else
  935.         Add('TCP/IP Communication Test Failed!');
  936.     end;
  937.     // deallocate memory
  938.     Sock.Free;
  939.     Screen.Cursor := crDefault;
  940.   end;
  941. end;
  942.  
  943. // when the user presses the enter key then execute test task
  944. procedure TfrmCommDiag.FormKeyPress(Sender: TObject; var Key: Char);
  945. begin
  946.   if ord(key)=13 then
  947.   begin
  948.     btnTestClick(sender);
  949.     key:=char(0);
  950.   end;
  951. end;
  952.  
  953. {****************************************************************
  954. *
  955. *  F o r m C r e a t e
  956. *
  957. ****************************************************************
  958. *  Author: The Client Server Factory Inc.
  959. *  Date:   March 1, 1999
  960. *
  961. *  Input:  Tobject
  962. *
  963. *  Return: None
  964. *
  965. *  Description: Loads registered remote servers into the
  966. *               combo boxes (also stores their protocols).
  967. *
  968. *****************************************************************
  969. * Revisions:
  970. *
  971. *****************************************************************}
  972.  
  973. procedure TfrmCommDiag.FormCreate(Sender: TObject);
  974. var
  975.   lCount : Integer ;
  976.   iProtocol : Integer;
  977.   lServerAlias : TStringList;
  978.   lStr : String;
  979.   lRegServersKey : String;
  980. begin
  981.   inherited;
  982.   FRegistry := Nil;                    // initialize variables
  983.   FServers := Nil;
  984.   FProtocols := Nil;
  985.   lServerAlias :=Nil;
  986.   pgcDiagnostics.ActivePageIndex := 0;
  987.   try
  988.     FRegistry := TRegistry.Create;
  989.     FServers := TStringList.Create;
  990.     FProtocols := TStringList.Create;
  991.     lServerAlias := TStringList.Create;
  992.  
  993.     FRegistry.OpenKey('Software', False);
  994.     FRegistry.OpenKey('Borland', False);
  995.     FRegistry.OpenKey('Interbase', False);
  996.     FRegistry.OpenKey('IBConsole', False);
  997.     FRegistry.CreateKey('Servers');
  998.     lRegServersKey := Format('\%s\Servers\',[FRegistry.CurrentPath]);
  999.  
  1000.     // if server entries are found
  1001.     if FRegistry.OpenKey(lRegServersKey,False) then
  1002.     begin
  1003.       // get all server aliases
  1004.       FRegistry.GetKeyNames(lServerAlias);
  1005.       // loop through list of aliases to get server names
  1006.       for lCount := 0 to lServerAlias.Count - 1 do
  1007.       begin
  1008.         if FRegistry.OpenKey(Format('%s%s',[lRegServersKey,lServerAlias.Strings[lCount]]),False) then
  1009.         begin
  1010.           // get server names and protocols
  1011.           lStr := FRegistry.ReadString('ServerName');
  1012.           iProtocol := FRegistry.ReadInteger('Protocol');
  1013.  
  1014.           // Only add remote servers (and their protocol) to stringlists
  1015.           if lStr <> 'Local Server' then
  1016.           begin
  1017.             FServers.Add(lStr);
  1018.             FProtocols.Add(IntToStr(iProtocol));
  1019.           end;
  1020.         end;
  1021.       end;
  1022.     end;
  1023.  
  1024.     // add remote servers to all server combo boxes
  1025.     for lCount := 0 to FServers.Count - 1 do
  1026.     begin
  1027.         cbDBServer.Items.Add(FServers.Strings[lCount]);
  1028.         cbTCPIPServer.Items.Add(FServers.Strings[lCount]);
  1029.         cbNetBEUIServer.Items.Add(FServers.Strings[lCount]);
  1030.         cbSPXServer.Items.Add(FServers.Strings[lCount]);
  1031.     end;
  1032.   finally
  1033.     FRegistry.CloseKey;
  1034.     lServerAlias.Free;
  1035.   end;
  1036. end;
  1037.  
  1038. // deallocate registry and stringlists when form is closed
  1039. procedure TfrmCommDiag.FormDestroy(Sender: TObject);
  1040. begin
  1041.   FRegistry.Free;
  1042.   FServers.Free;
  1043.   FProtocols.Free;
  1044. end;
  1045.  
  1046. {****************************************************************
  1047. *
  1048. *  T e s t N e t B E U I
  1049. *
  1050. ****************************************************************
  1051. *  Author: The Client Server Factory Inc.
  1052. *  Date:   March 1, 1999
  1053. *
  1054. *  Input:  None
  1055. *
  1056. *  Return: None
  1057. *
  1058. *  Description:  Creates a pipes object and performs a
  1059. *                NetBEUI test using named pipes.
  1060. *
  1061. *****************************************************************
  1062. * Revisions:
  1063. *
  1064. *****************************************************************}
  1065.  
  1066. procedure TfrmCommDiag.TestNetBEUI;
  1067. var
  1068.   lPipe : TibcPipes;                   // named pipe
  1069.   lStr : String;
  1070. begin
  1071.   lPipe := Nil;                        // initialize variables
  1072.   lStr:='';
  1073.   Screen.Cursor := crHourGlass;
  1074.   try
  1075.     lPipe := TibcPipes.Create;         // create pipe
  1076.  
  1077.     // specify server name
  1078.     lPipe.Server := cbNetBEUIServer.Text;
  1079.     // specify pipe name
  1080.     lPipe.Path := '\pipe\interbas\server\gds_db';
  1081.     // specify number of attempts
  1082.     lPipe.Tries := 5;
  1083.  
  1084.     // test pipe
  1085.     lPipe.TestPipe(lStr, False);
  1086.  
  1087.     // assign results to NetBEUI results memo
  1088.     memNetBEUIResults.SetTextBuf(PChar(lStr));
  1089.   finally
  1090.     // deallocate memery
  1091.     lPipe.Free;
  1092.     Screen.Cursor := crDefault;
  1093.   end;
  1094. end;
  1095.  
  1096. {****************************************************************
  1097. *
  1098. *  T e s t S P X
  1099. *
  1100. ****************************************************************
  1101. *  Author: The Client Server Factory Inc.
  1102. *  Date:   March 1, 1999
  1103. *
  1104. *  Input:  None
  1105. *
  1106. *  Return: None
  1107. *
  1108. *  Description:  Creates a SPX object and performs a
  1109. *                test server connect using SPX.
  1110. *
  1111. *****************************************************************
  1112. * Revisions:
  1113. *
  1114. *****************************************************************}
  1115.  
  1116. procedure TfrmCommDiag.TestSPX;
  1117. var
  1118.   lspx : TibcSPX;
  1119.   lStr : String;
  1120. begin
  1121.   lspx := Nil;                         // initialize variables
  1122.   lStr:='';
  1123.  
  1124.   Screen.Cursor := crHourGlass;
  1125.  
  1126.   try
  1127.     lspx := TibcSPX.Create;
  1128.  
  1129.     // specify servername
  1130.     lspx.ServerName:=cbSPXServer.Text;
  1131.     // test SPX connection
  1132.     lspx.TestSPX(lStr);
  1133.  
  1134.     // assign results to SPX results memo
  1135.     memSPXResults.SetTextBuf(PChar(lStr));
  1136.   finally
  1137.     // deallocate memory
  1138.     lspx.Free;
  1139.     Screen.Cursor := crDefault;
  1140.   end;
  1141. end;
  1142.  
  1143. // assigns appropriate protocol for a selected server in the DB connection tab
  1144. procedure TfrmCommDiag.cbDBServerClick(Sender: TObject);
  1145. begin
  1146.   cbProtocol.ItemIndex :=
  1147.     StrToInt(FProtocols[FServers.IndexOf(cbDBServer.Text)]);
  1148. end;
  1149.  
  1150. procedure TfrmCommDiag.edtDatabaseChange(Sender: TObject);
  1151. begin
  1152.   edtDatabase.Hint := edtDatabase.Text;
  1153. end;
  1154.  
  1155. procedure TfrmCommDiag.WMNCLButtonDown( var Message: TWMNCLButtonDown );
  1156. var
  1157.   ScreenPt: TPoint;
  1158.   ClientPt: TPoint;
  1159. begin
  1160.   ScreenPt.X := Message.XCursor;
  1161.   ScreenPt.Y := Message.YCursor;
  1162.   ClientPt := ScreenToClient( ScreenPt );
  1163.   if( ClientPt.X > Width-45 )and (ClientPt.X < Width-29) then
  1164.    begin
  1165.     WinHelp(WindowHandle,CONTEXT_HELP_FILE,HELP_CONTEXT,FEATURES_DIAGNOSTICS);
  1166.     Message.Result := 0;
  1167.   end else
  1168.    inherited;
  1169. end;
  1170.  
  1171. end.
  1172.