home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / sibdemo3.zip / SOURCE.DAT / SOURCE / ADDON / INET.PAS < prev    next >
Pascal/Delphi Source File  |  1998-05-02  |  95KB  |  2,701 lines

  1. Unit INet;
  2.  
  3. Interface
  4.  
  5. Uses SysUtils,Classes,Forms,Dialogs;
  6.  
  7. {$IFDEF OS2}
  8. Uses Os2Def,BseDos,PmWin;
  9. {$ENDIF}
  10.  
  11. {$IFDEF WIN95}
  12. Uses WinBase;
  13. {$ENDIF}
  14.  
  15. Const
  16.   //Common MIME pairs
  17.   MIME_IMAGE_GIF     ='image/gif';
  18.   MIME_IMAGE_JPEG    ='image/jpeg';
  19.   MIME_IMAGE_xBitmap ='image/x-xbitmap';
  20.   MIME_IMAGE_BMP     ='image/bmp';
  21.  
  22.   MIME_APP_PDF       ='application/pdf';
  23.  
  24. /* WX_* window messages */
  25. Const
  26.   WX_MOUSEMOVE           = WM_USER + 1000;
  27.   WX_BUTTONCLICK         = WM_USER + 1001;
  28.   WX_LOADRESULT          = WM_USER + 1004;
  29.   WX_LOADSTATUS          = WM_USER + 1005;
  30.   WX_PRINTRESULT         = WM_USER + 1006;
  31.   WX_MSGERROR            = WM_USER + 1007;
  32.   WX_MSGINFO             = WM_USER + 1008;
  33.   WX_MSGSTATUS           = WM_USER + 1009;
  34.   WX_DISPLAYDIALOG       = WM_USER + 1010;
  35.   WX_MSGSECURITY         = WM_USER + 1011;
  36.   WX_CHANGEEXPIREDPASSWD = WM_USER + 1012;
  37.   WX_SELNEWPRIVKEY       = WM_USER + 1013;
  38.  
  39. /* Error Messages */
  40. Const
  41.   WXENONE        =  0;
  42.   WXEINVAL       =  1;
  43.   WXEINPROGRESS  =  2;
  44.   WXEFILE        =  3;
  45.   WXENODOC       =  4;
  46.   WXEBUFSIZE     =  5;
  47.   WXENOPROXY     =  6;
  48.   WXENOSOCKS     =  7;
  49.   WXEMIME        =  8;
  50.   WXENOTFOUND    =  9;
  51.   WXEINTR        = 10;
  52.   WXENOANCHOR    = 11;
  53.  
  54. Type
  55.   {$M+}
  56.   THTTPPos = Record
  57.     Component:LongWord;
  58.     x:Word;
  59.     y:Word;
  60.   End;
  61.  
  62.   THTTPFontSize=(httpFontSmall,httpFontNormal,httpFontLarge,httpFontXLarge);
  63.  
  64.   THTTPGateway=(httpGatewayNone,httpGatewayProxy,httpGatewaySocks,httpGatewayProxySocks);
  65.  
  66.   THTTPLoadStatus=(httpLoadSuccess,httpLoadCancelled,httpLoadError);
  67.  
  68.   THTTPOnLoad=Procedure(Sender:TObject;Status:THTTPLoadStatus) Of Object;
  69.  
  70.   THTTPOnMouseEvent=Procedure(Sender:TObject;Const Pos:THTTPPos) Of Object;
  71.  
  72.   THTTPSearchOptions=(httpSearchForward,httpSearchBackward);
  73.  
  74.   THTTPAnchorState=(httpAnchorDefault,httpAnchorVisited);
  75.   {$M-}
  76.  
  77.   THTTPBrowser=Class(TControl)
  78.      Private
  79.          FInlineGraphicsAssigned:Boolean;
  80.          FInlineGraphics:Boolean;
  81.          FUnderlineAnchorsAssigned:Boolean;
  82.          FUnderlineAnchors:Boolean;
  83.          FHTTPFontSizeAssigned:Boolean;
  84.          FHTTPFontSize:THTTPFontSize;
  85.          FEmailAddress:PString;
  86.          FNewsServer:PString;
  87.          FProxyServer:PString;
  88.          FSocksServer:PString;
  89.          FGatewayAssigned:Boolean;
  90.          FGateway:THTTPGateway;
  91.          FEnableCacheAssigned:Boolean;
  92.          FEnableCache:Boolean;
  93.          FCacheDocLimitAssigned:Boolean;
  94.          FCacheDocLimit:LongInt;
  95.          FCacheImageLimitAssigned:Boolean;
  96.          FCacheImageLimit:LongInt;
  97.          FCacheDir:PString;
  98.  
  99.          FOnLoad:THTTPOnLoad;
  100.          FOnDocMouseClick:THTTPOnMouseEvent;
  101.          FOnDocMouseMove:THTTPOnMouseEvent;
  102.  
  103.          FLoaded:Boolean;
  104.          FLoadCancel:Boolean;
  105.          FURL:PString;
  106.          FDLLHandle:LongWord;
  107.          FWXViewQueryVersion:Function:Word;APIENTRY;
  108.          FWXViewQueryDisplayOpts:Function(hwndView:LongWord;Var wxDisplayOpts;
  109.                                           usSize:Word):LongWord;APIENTRY
  110.          FWXViewSetDisplayOpts:Function(hwndView:LongWord;Var wxDisplayOpts;
  111.                                         usSize:Word):LongWord;APIENTRY;
  112.          FWXViewLoad:Function(hwndView:LongWord;pcszURL:PChar;
  113.                               wxLoadFlags:LongWord;Const pwxAnchorData):LongWord;APIENTRY;
  114.          FWXViewQueryViewer:Function(hwndView:LongWord;pcszMIMEType:PChar;
  115.                                      Var Viewer;usSize:Word):LongWord;APIENTRY;
  116.          FWXViewSetViewer:Function(hwndView:LongWord;Var pwxViewer;
  117.                                    usSize:Word):LongWord;APIENTRY;
  118.          FWXViewQueryNetworkOpts:Function(hwndView:LongWord;Var Opts;
  119.                                           usSize:Word):LongInt;APIENTRY;
  120.          FWXViewSetNetworkOpts:Function(hwndView:LongWord;Var Opts;
  121.                                         usSize:Word):LongInt;APIENTRY;
  122.          FWXViewEnableGateway:Function(hwndView:LongWord;wxGateway:LongWord):LongInt;APIENTRY;
  123.          FWXViewQueryCacheOpts:Function(hwndView:LongWord;Var Opts;
  124.                                         usSize:Word):Longint;APIENTRY;
  125.          FWXViewSetCacheOpts:Function(hwndView:LongWord;Var Opts;
  126.                                       usSize:Word):Longint;APIENTRY;
  127.          FWXViewCancelLoad:Function(hwndView:LongWord):LongInt;APIENTRY;
  128.          FWXViewQueryDocTitle:Function(hwndView:LongWord;pszTitle:PChar;
  129.                                        usLen:Word):LongInt;APIENTRY;
  130.          FWXViewQueryAnchorData:Function(hwndView:LongWord;Const pwxPos;
  131.                                          var pwxAnchorData;usLen:Word):LongInt;APIENTRY;
  132.          FWXViewQueryAnchorDataLen:Function(hwndView:LongWord;Const pwxPos):Word;APIENTRY;
  133.          FWXViewQueryAnchor:Function(hwndView:LongWord;Const pwxPos;pszAnchor:PChar;
  134.                                      usLen:Word):LongInt;APIENTRY;
  135.          FWXViewQueryPos:Function(hwndView:LongWord;x,y:Word;
  136.                                   Const pwxPos):LongInt;APIENTRY;
  137.          FWXViewLoadToFile:Function(hwndView:LongWord;pcszURL,pcszFileName:PChar;
  138.                                     wxLoadFlags:LongWord;Const pwxAnchorData):LongInt;APIENTRY;
  139.          FWXViewQueryDocAnchor:Function(hwndView:LongWord;pszAnchor:PChar;
  140.                                         usLen:Word):LongInt;APIENTRY;
  141.          FWXViewSearch:Function(hwndView:LongWord;wxSearchOpts:LongWord;
  142.                                 Const pwStartPos;Var pwNextPos;
  143.                                 pcszSearchData:PChar):LongInt;APIENTRY;
  144.          FWXViewIsLoading:Function(hwndView:LongWord):BOOL;APIENTRY;
  145.          FWXViewQueryAnchorState:Function(hwndView:LongWord;pcszAnchor:PChar;
  146.                                  Var pwxAnchorOpts:LongWord):LongInt;APIENTRY;
  147.          FWXViewSetAnchorState:Function(hwndView:LongWord;pcszAnchor:PChar;
  148.                                         wxAnchorOpts:LongWord):LongInt;APIENTRY;
  149.          FWXViewQueryLastError:Function(hwndView:LongWord):LongInt;APIENTRY
  150.          FWXViewQueryLastLoadError:Function(hwndView:LongWord):LongInt;APIENTRY;
  151.  
  152.      Private
  153.          Function GetURL:String;
  154.          Procedure SetURL(NewValue:String);
  155.          Function GetVersion:Word;
  156.          Function GetInlineGraphics:Boolean;
  157.          Procedure SetInlineGraphics(NewValue:Boolean);
  158.          Function GetUnderlineAnchors:Boolean;
  159.          Procedure SetUnderlineAnchors(NewValue:Boolean);
  160.          Function GetHTTPFontSize:THTTPFontSize;
  161.          Procedure SetHTTPFontSize(NewValue:THTTPFontSize);
  162.          Function GetEmailAddress:String;
  163.          Procedure SetEmailAddress(NewValue:String);
  164.          Function GetNewsServer:String;
  165.          Procedure SetNewsServer(NewValue:String);
  166.          Function GetProxyServer:String;
  167.          Procedure SetProxyServer(NewValue:String);
  168.          Function GetSocksServer:String;
  169.          Procedure SetSocksServer(NewValue:String);
  170.          Function GetGateway:THTTPGateway;
  171.          Procedure SetGateway(NewValue:THTTPGateway);
  172.          Function GetEnableCache:Boolean;
  173.          Procedure SetEnableCache(NewValue:Boolean);
  174.          Function GetCacheDocLimit:LongInt;
  175.          Procedure SetCacheDocLimit(NewValue:LongInt);
  176.          Function GetCacheImageLimit:LongInt;
  177.          Procedure SetCacheImageLimit(NewValue:LongInt);
  178.          Function GetCacheDir:String;
  179.          Procedure SetCacheDir(NewValue:String);
  180.          Procedure SetLoaded(NewValue:Boolean);
  181.          Function GetDocTitle:String;
  182.          Function GetIsLoading:Boolean;
  183.          Function GetAnchorState(Const Anchor:String):THTTPAnchorState;
  184.          Procedure SetAnchorState(Const Anchor:String;NewValue:THTTPAnchorState);
  185.          Function GetLastLoadError:LongInt;
  186.          Function GetLastError:LongInt;
  187.      Protected
  188.          Procedure GetClassData(Var ClassData:TClassData);Override;
  189.          Procedure SetupShow;Override;
  190.          Procedure WXLoadResult(Var Msg:TMessage); message WX_LOADRESULT;
  191.          Procedure WXButtonClick(Var Msg:TMessage); message WX_BUTTONCLICK;
  192.          Procedure WXMouseMove(Var Msg:TMessage); message WX_MOUSEMOVE;
  193.          Procedure SetupComponent;Override;
  194.      Public
  195.          Destructor Destroy;Override;
  196.          Function GetMIMEViewer(MIMEPair:String):String;
  197.          Procedure SetMIMEViewer(MIMEPair,EXEProgram:String);
  198.          Procedure Load;
  199.          Procedure LoadWithAnchor(Var Anchor);
  200.          Function LoadToFile(Const FileName:String):Boolean;
  201.          Function LoadToFileWithAnchor(Const FileName:String;Var Anchor):Boolean;
  202.          Procedure CancelLoad;
  203.          Function GetAnchorDataLen(Const Pos:THTTPPos):LongWord;
  204.          Function GetAnchorData(Const Pos:THTTPPos;Var Buf;BufLen:LongWord):Boolean;
  205.          Function GetAnchor(Const Pos:THTTPPos):String;
  206.          Function GetDocAnchor:String;
  207.          Function Search(Const s:String;Const StartPos:THTTPPos;Options:THTTPSearchOptions):THTTPPos;
  208.      Public
  209.          Property Version:Word read GetVersion;
  210.          Property DocTitle:String read GetDocTitle;
  211.          Property IsLoading:Boolean read GetIsLoading;
  212.          Property AnchorState[Const Anchor:String]:THTTPAnchorState read GetAnchorState write SetAnchorState;
  213.          Property LastLoadError:LongInt read GetLastLoadError;
  214.          Property LastError:LongInt read GetLastError;
  215.      Published
  216.          Property Align;
  217.          Property DragCursor;
  218.          Property DragMode;
  219.          Property Enabled;
  220.          Property ParentShowHint;
  221.          Property PopupMenu;
  222.          Property ShowHint;
  223.          Property TabOrder;
  224.          Property TabStop;
  225.          Property Visible;
  226.          Property ZOrder;
  227.  
  228.          Property OnCanDrag;
  229.          Property OnDragDrop;
  230.          Property OnDragOver;
  231.          Property OnEndDrag;
  232.          Property OnEnter;
  233.          Property OnExit;
  234.          Property OnFontChange;
  235.          Property OnKeyPress;
  236.          Property OnScan;
  237.          Property OnSetupShow;
  238.          Property OnStartDrag;
  239.  
  240.          Property URL:String read GetURL write SetURL;
  241.          Property InlineGraphics:Boolean read GetInlineGraphics write SetInlineGraphics;
  242.          Property UnderlineAnchors:Boolean read GetUnderlineAnchors write SetUnderlineAnchors;
  243.          Property httpFontSize:THTTPFontSize read GetHTTPFontSize write SetHTTPFontSize;
  244.          Property EmailAddress:String read GetEmailAddress write SetEmailAddress;
  245.          Property NewsServer:String read GetNewsServer write SetNewsServer;
  246.          Property ProxyServer:String read GetProxyServer write SetProxyServer;
  247.          Property SocksServer:String read GetSocksServer write SetSocksServer;
  248.          Property Gateway:THTTPGateway read GetGateway write SetGateway;
  249.          Property EnableCache:Boolean read GetEnableCache write SetEnableCache;
  250.          Property CacheDocLimit:LongInt read GetCacheDocLimit write SetCacheDocLimit;
  251.          Property CacheImageLimit:LongInt read GetCacheImageLimit write SetCacheImageLimit;
  252.          Property CacheDir:String read GetCacheDir write SetCacheDir;
  253.          Property Loaded:Boolean read FLoaded write SetLoaded;
  254.  
  255.          Property OnLoad:THTTPOnLoad read FOnLoad write FOnLoad;
  256.          Property OnDocMouseClick:THTTPOnMouseEvent read FOnDocMouseClick write FOnDocMouseClick;
  257.          Property OnDocMouseMove:THTTPOnMouseEvent read FOnDocMouseMove write FOnDocMouseMove;
  258.   End;
  259.  
  260.   {$M+}
  261.   TFTPError=(ftpOk,ftpUnknownService,ftpUnkownHost,ftpSocketError,ftpCannotConnect,
  262.              ftpLoginFailed,ftpTransferAborted,ftpCannotOpenFile,ftpConnectionError,
  263.              fptCommandFailed,ftpProxyError,ftpNoPrimaryProxy,ftpNoTranslateTable,
  264.              ftpNotConnected,ftpOther);
  265.  
  266.   TOnFTPError=Procedure(Sender:TObject;Err:TFTPError;Const Description:String) Of Object;
  267.  
  268.   TFTPDirOptions=(ftpDirWide,ftpDirShort);
  269.  
  270.   TFTPTransferMode=(ftpAscii,ftpBinary);
  271.  
  272.   TFTPPingResult=(ftpPingOk,ftpPingHostDoesNotReply,ftpPingSocketError,
  273.                   ftpPingUnkownProtocol,ftpPingSendFailed,ftpPingReceiveFailed,
  274.                   ftpPingUnkownHost,ftpPingOther);
  275.  
  276.   TFTPOnTransferProgress=Procedure(Sender:TObject;TransferredBytes,TotalBytes:LongInt) Of Object;
  277.   {$M-}
  278.  
  279.   TFTP=Class(TComponent)
  280.      Private
  281.         FPassWord:PString;
  282.         FRemoteHost:PString;
  283.         FRemoteAccount:PString;
  284.         FUserId:PString;
  285.         FDLLHandle:LongWord;
  286.         FConnected:Boolean;
  287.         FTransferMode:TFTPTransferMode;
  288.         FOnFTPError:TOnFTPError;
  289.  
  290.         Fftplogoff:Procedure;APIENTRY;
  291.         Fftpget:Function(Const Host,UserId,Pwd,Account,Local,Remote,Mode:CString;
  292.                          TransferType:LongInt):Longint;APIENTRY;
  293.         Fftpput:Function(Const Host,UserId,Pwd,Account,Local,Remote:CString;
  294.                          TransferType:LongInt):LongInt;APIENTRY;
  295.         Fftpappend:Function(Const Host,UserId,Pwd,Account,Local,Remote:CString;
  296.                             TransferType:LongInt):Longint;APIENTRY;
  297.         Fftpputunique:Function(Const Host,UserId,Pwd,Account,Local,Remote:CString;
  298.                                TransferType:LongInt):LongInt;APIENTRY;
  299.         Fftpcd:Function(Const Host,UserId,Pwd,Account,Dir:CString):LongInt;APIENTRY;
  300.         Fftpmkd:Function(Const Host,UserId,Pwd,Account,Dir:CString):LongInt;APIENTRY;
  301.         Fftprmd:Function(Const Host,UserId,Pwd,Account,Dir:CString):LongInt;APIENTRY;
  302.         Fftpdelete:Function(Const Host,UserId,Pwd,Account,Name:CString):LongInt;APIENTRY;
  303.         Fftprename:Function(Const Host,UserId,Pwd,Account,NameFrom,NameTo:CString):LongInt;APIENTRY;
  304.         Fftpls:Function(Const Host,UserId,Pwd,Account,Local,Pattern:CString):LongInt;APIENTRY;
  305.         Fftpdir:Function(Const Host,UserId,Pwd,Account,Local,Pattern:CString):LongInt;APIENTRY;
  306.         Fftpquote:Function(Const Host,UserId,Pwd,Account,QuoteStr:CString):LongInt;APIENTRY;
  307.         Fftpping:Function(Const Host:CString;Len:LongInt;Var Addr:LongWord):LongInt;APIENTRY;
  308.         Fftppwd:Function(Const Host,UserId,Pwd,Account:CString;Var Buf:CString;BufLen:LongInt):LongInt;APIENTRY;
  309.         Fftpsys:Function(Const Host,UserId,Pwd,Account:CString;Var Buf:CString;BufLen:LongInt):LongInt;APIENTRY;
  310.         Fftpver:Function(Var Buf:CString;BufLen:LongInt):LongInt;APIENTRY;
  311.         FftpWindow:Procedure(Handle:LongWord);
  312.         Fftp_errno:Function:LongInt;APIENTRY;
  313.  
  314.         FNotifyControl:TControl;
  315.         FOnTransferProgress:TFTPOnTransferProgress;
  316.         FOnError:TOnFTPError;
  317.      Private
  318.         Function GetPassWord:String;
  319.         Procedure SetPassWord(NewValue:String);
  320.         Function GetRemoteHost:String;
  321.         Procedure SetRemoteHost(NewValue:String);
  322.         Function GetRemoteAccount:String;
  323.         Procedure SetRemoteAccount(NewValue:String);
  324.         Function GetUserID:String;
  325.         Procedure SetUserID(NewValue:String);
  326.         Function GetRemoteDirName:String;
  327.         Procedure SetRemoteDirName(NewValue:String);
  328.         Function GetFTPError:TFTPError;
  329.         Procedure SetConnected(NewValue:Boolean);
  330.         Function GetVersion:String;
  331.         Function GetSystem:String;
  332.      Protected
  333.         Procedure SetupComponent;Override;
  334.      Public
  335.         Destructor Destroy;Override;
  336.         Function Connect:TFTPError;
  337.         Procedure Disconnect;
  338.         Function GetRemoteDir(Const Pattern:String;Dir:TStrings;Options:TFTPDirOptions):TFTPError;
  339.         Function DeleteRemoteFile(Const FileName:String):TFTPError;
  340.         Function RenameRemoteFile(Const OldName,NewName:String):TFTPError;
  341.         Function MakeRemoteDir(Const DirName:String):TFTPError;
  342.         Function RemoveRemoteDir(Const DirName:String):TFTPError;
  343.         Function AppendToRemoteFile(Const RemoteFileName,LocalFileName:String):TFTPError;
  344.         Function GetRemoteFile(Const RemoteFileName,LocalFileName:String):TFTPError;
  345.         Function PutLocalFile(Const LocalFileName,RemoteFileName:String):TFTPError;
  346.         Function PutUniqueLocalFile(Const LocalFileName,RemoteFileName:String):TFTPError;
  347.         Function Quote(Const ftpstring:String):TFTPError;
  348.         Function Ping(Const HostName:String;PacketLen:LongInt;
  349.                       Var Address:LongWord;Var Milliseconds:LongInt):TFTPPingResult;
  350.         Procedure FTPError(Err:TFTPError);VIRTUAL;
  351.      Public
  352.         Property Connected:Boolean read FConnected write SetConnected;
  353.         Property Version:String read GetVersion;
  354.         Property System:String read GetSystem;
  355.      Published
  356.         Property Password:String read GetPassWord write SetPassWord;
  357.         Property RemoteHost:String read GetRemoteHost write SetRemoteHost;
  358.         Property RemoteAccount:String read GetRemoteAccount write SetRemoteAccount;
  359.         Property UserId:String read GetUserId write SetUserId;
  360.         Property RemoteDirName:String read GetRemoteDirName write SetRemoteDirName;
  361.         Property TransferMode:TFTPTransferMode read FTransferMode write FTransferMode;
  362.  
  363.         Property OnTransferProgress:TFTPOnTransferProgress read FOnTransferProgress write FOnTransferProgress;
  364.         Property OnError:TOnFTPError read FOnError write FOnError;
  365.   End;
  366.  
  367.   TTCPError=Procedure(Sender:TObject;ErrNumber:LongInt;Const Description:String) Of Object;
  368.   TTCPConnectionRequest=Procedure(Sender:TObject;PortID:LongInt;Const IP:String) Of Object;
  369.  
  370.   TTCPState=(sckClosed,sckListening,sckConnected,sckError);
  371.  
  372. //TTCP Error codes
  373. Const
  374.     SOCBASEERR              =10000;
  375.  
  376.     /* OS/2 SOCKET API definitions */
  377.     SOCEPERM                =SOCBASEERR+1;             /* Not owner */
  378.     SOCESRCH                =SOCBASEERR+3;             /* No such process */
  379.     SOCEINTR                =SOCBASEERR+4;             /* Interrupted system call */
  380.     SOCENXIO                =SOCBASEERR+6;             /* No such device or address */
  381.     SOCEBADF                =SOCBASEERR+9;             /* Bad file number */
  382.     SOCEACCES               =SOCBASEERR+13;            /* Permission denied */
  383.     SOCEFAULT               =SOCBASEERR+14;            /* Bad address */
  384.     SOCEINVAL               =SOCBASEERR+22;            /* Invalid argument */
  385.     SOCEMFILE               =SOCBASEERR+24;            /* Too many open files */
  386.     SOCEPIPE                =SOCBASEERR+32;            /* Broken pipe */
  387.  
  388.     SOCEOS2ERR              =SOCBASEERR+100;           /* OS/2 Error */
  389.  
  390.     /* OS/2 SOCKET API definitions of regular BSD error constants */
  391.     SOCEWOULDBLOCK          =SOCBASEERR+35;            /* Operation would block */
  392.     SOCEINPROGRESS          =SOCBASEERR+36;            /* Operation now in progress */
  393.     SOCEALREADY             =SOCBASEERR+37;            /* Operation already in progress */
  394.     SOCENOTSOCK             =SOCBASEERR+38;            /* Socket operation on non-socket */
  395.     SOCEDESTADDRREQ         =SOCBASEERR+39;            /* Destination address required */
  396.     SOCEMSGSIZE             =SOCBASEERR+40;            /* Message too long */
  397.     SOCEPROTOTYPE           =SOCBASEERR+41;            /* Protocol wrong type for socket */
  398.     SOCENOPROTOOPT          =SOCBASEERR+42;            /* Protocol not available */
  399.     SOCEPROTONOSUPPORT      =SOCBASEERR+43;            /* Protocol not supported */
  400.     SOCESOCKTNOSUPPORT      =SOCBASEERR+44;            /* Socket type not supported */
  401.     SOCEOPNOTSUPP           =SOCBASEERR+45;            /* Operation not supported on socket */
  402.     SOCEPFNOSUPPORT         =SOCBASEERR+46;            /* Protocol family not supported */
  403.     SOCEAFNOSUPPORT         =SOCBASEERR+47;            /* Address family not supported by protocol family */
  404.     SOCEADDRINUSE           =SOCBASEERR+48;            /* Address already in use */
  405.     SOCEADDRNOTAVAIL        =SOCBASEERR+49;            /* Can't assign requested address */
  406.     SOCENETDOWN             =SOCBASEERR+50;            /* Network is down */
  407.     SOCENETUNREACH          =SOCBASEERR+51;            /* Network is unreachable */
  408.     SOCENETRESET            =SOCBASEERR+52;            /* Network dropped connection on reset */
  409.     SOCECONNABORTED         =SOCBASEERR+53;            /* Software caused connection abort */
  410.     SOCECONNRESET           =SOCBASEERR+54;            /* Connection reset by peer */
  411.     SOCENOBUFS              =SOCBASEERR+55;            /* No buffer space available */
  412.     SOCEISCONN              =SOCBASEERR+56;            /* Socket is already connected */
  413.     SOCENOTCONN             =SOCBASEERR+57;            /* Socket is not connected */
  414.     SOCESHUTDOWN            =SOCBASEERR+58;            /* Can't send after socket shutdown */
  415.     SOCETOOMANYREFS         =SOCBASEERR+59;            /* Too many references: can't splice */
  416.     SOCETIMEDOUT            =SOCBASEERR+60;            /* Connection timed out */
  417.     SOCECONNREFUSED         =SOCBASEERR+61;            /* Connection refused */
  418.     SOCELOOP                =SOCBASEERR+62;            /* Too many levels of symbolic links */
  419.     SOCENAMETOOLONG         =SOCBASEERR+63;            /* File name too long */
  420.     SOCEHOSTDOWN            =SOCBASEERR+64;            /* Host is down */
  421.     SOCEHOSTUNREACH         =SOCBASEERR+65;            /* No route to host */
  422.     SOCENOTEMPTY            =SOCBASEERR+66;            /* Directory not empty */
  423.  
  424. Type
  425.   TTCP = Class(TComponent)
  426.      Private
  427.         FInSocket:LongInt;
  428.         FOutSocket:LongInt;
  429.         FAcceptSocket:LongInt;
  430.         FOnError:TTCPError;
  431.         FOnConnect:TNotifyEvent;
  432.         FOnConnectionRequest:TTCPConnectionRequest;
  433.         FOnClose:TNotifyEvent;
  434.         FOnSendComplete:TNotifyEvent;
  435.         FQueueLength:LongInt;
  436.         FLocalAddress:LongWord;
  437.         FDLLHandle:LongWord;
  438.         FTCPDLLHandle:LongWord;
  439.         FErrorCode:LongInt;
  440.         FLocalPort:LongInt;
  441.         FSockMode:LongWord;
  442.         FConnected:Boolean;
  443.         FState:TTCPState;
  444.  
  445.         FAccept:Function(p1:LONGINT;VAR sa;var p2:LONGINT):LongInt;APIENTRY;
  446.         FSock_Init:Function:LongInt;APIENTRY;
  447.         FSoClose:Function(p1:LongInt):LongInt;APIENTRY;
  448.         FINet_Addr:Function(Const c:CSTRING):LongWord;APIENTRY;
  449.         FBind:Function(p1:LongInt;Var sa;p2:LongInt):LongInt;APIENTRY;
  450.         FConnect:Function(p1:LongInt;Var sa;p2:LongInt):LongInt;APIENTRY;
  451.         FGethostname:Function(Var C:CString;Len:LongWord):LongInt;APIENTRY;
  452.         FGethostid:Function:LongInt;APIENTRY;
  453.         FGetpeername:Function(p1:LongInt;Var sa;Var p2:LongInt):LongInt;APIENTRY;
  454.         FGetsockname:Function(p1:LongInt;Var sa;Var p2:LongInt):LongInt;APIENTRY;
  455.         FGetsockopt:Function(p1,p2,p3:LongInt;Var c:CString;Var p4:LongInt):LongInt;APIENTRY;
  456.         Fioctl:Function(p1,p2:LongInt;Var c:CString;p3:LongInt):LongInt;APIENTRY;
  457.         FListen:Function(p1,p2:LongInt):LongInt;APIENTRY;
  458.         Frecvmsg:Function(p1:LongInt;Var mh;p2:LongInt):LongInt;APIENTRY;
  459.         Frecv:Function(p1:LongInt;Var c;p2,p3:LongInt):LongInt;APIENTRY;
  460.         Frecvfrom:Function(p1:LongInt;Var c;p2,p3:LongInt;Var sa;
  461.                            Var p4:LongInt):LongInt;APIENTRY;
  462.         Fselect:Function(Var p1:LongInt;p2,p3,p4,p5:LongInt):LongInt;APIENTRY;
  463.         Fsend:Function(p1:LONGINT;VAR c;p2,p3:LONGINT):LONGINT;APIENTRY;
  464.         Fsendmsg:Function(p1:LongInt;Var mh;p2:LongInt):LongInt;APIENTRY;
  465.         Fsendto:Function(p1:LongInt;Var c;p2,p3:LongInt;
  466.                          Var sa;p4:LongInt):LongInt;APIENTRY;
  467.         Fsetsockopt:Function(p1,p2,p3:LongInt;Var c:CString;p4:LongInt):LongInt;APIENTRY;
  468.         Fsock_errno:Function:LongInt;APIENTRY;
  469.         Fpsock_errno:Function(Const c:CString):LongInt;APIENTRY;
  470.         FSocket:Function(p1,p2,p3:LongInt):LongInt;APIENTRY;
  471.         Fsoabort:Function(p1:LongInt):LongInt;APIENTRY;
  472.         Fso_cancel:Function(p1:LongInt):LongInt;APIENTRY;
  473.         Freadv:Function(p1:LongInt;Var io;p2:LongInt):LongInt;APIENTRY;
  474.         Fwritev:Function(p1:LongInt;Var io;p2:LongInt):LongInt;APIENTRY;
  475.         Fshutdown:Function(p1,p2:LongInt):LongInt;APIENTRY;
  476.         Fgetinetversion:Function(Var c:CString):LongInt;APIENTRY;
  477.         FBswap:Function(p:Word):Word;APIENTRY;
  478.         Fgethostbyname:Function(Const c:CString):Pointer;APIENTRY;
  479.      Private
  480.         Function GetLocalHostName:String;
  481.         Function GetLocalIP:String;
  482.         Function GetLocalPort:LongInt;
  483.         Procedure SetLocalPort(NewValue:LongInt);
  484.      Protected
  485.         Procedure SetupComponent;Override;
  486.      Public
  487.         Procedure Connect(Const RemoteHost:String;RemotePort:LongInt);
  488.         Procedure Listen;
  489.         Procedure Accept(Var PortID:LongInt;Var IP:String);
  490.         Procedure SendData(Var Buf;BufLen:LongInt);
  491.         Procedure GetData(Var Buf;MaxLen:LongInt;Var Received:LongInt);
  492.         Procedure PeekData(Var Buf;MaxLen:LongInt;Var Received:LongInt);
  493.         Procedure Close;
  494.         Destructor Destroy;Override;
  495.         Procedure TCPError(Code:LongInt);Virtual;
  496.      Public
  497.         Property LocalHostName:String read GetLocalHostName;
  498.         Property LocalIP:String read GetLocalIP;
  499.         Property InSocketHandle:LongInt read FInSocket;
  500.         Property OutSocketHandle:LongInt read FOutSocket;
  501.         Property AcceptSocketHandle:LongInt read FAcceptSocket;
  502.         Function INetAddressFromName(Const Name:String):LongWord;
  503.         Property ErrorCode:LongInt read FErrorCode;
  504.         Property Connected:Boolean read FConnected;
  505.         Property State:TTCPState read FState;
  506.      Published
  507.         Property LocalPort:LongInt read GetLocalPort write SetLocalPort;
  508.         Property QueueLength:LongInt read FQueueLength write FQueueLength;
  509.         Property LocalAddress:LongWord read FLocalAddress write FLocalAddress;
  510.  
  511.         Property OnError:TTCPError read FOnError write FOnError;
  512.         Property OnConnect:TNotifyEvent read FOnConnect write FOnConnect;
  513.         Property OnConnectionRequest:TTCPConnectionRequest read FOnConnectionRequest write FOnConnectionRequest;
  514.         Property OnClose:TNotifyEvent read FOnClose write FOnClose;
  515.         Property OnSendComplete:TNotifyEvent read FOnSendComplete write FOnSendComplete;
  516.   End;
  517.  
  518.   TUDP=Class(TTCP)
  519.      Protected
  520.         Procedure SetupComponent;Override;
  521.      Public
  522.         Procedure SendTo(Const RemoteHost:String;RemotePort:LongInt;
  523.                          Var Buf;BufLen:LongInt);
  524.         Procedure ReceiveFrom(Const RemoteHost:String;RemotePort:LongInt;
  525.                               Var Buf;BufLen:LongWord);
  526.   End;
  527.  
  528. Implementation
  529.  
  530. {
  531. ╔═══════════════════════════════════════════════════════════════════════════╗
  532. ║                                                                           ║
  533. ║ Speed-Pascal/2 Version 2.0                                                ║
  534. ║                                                                           ║
  535. ║ Speed-Pascal Component Classes (SPCC)                                     ║
  536. ║                                                                           ║
  537. ║ This section: THTTPBrowser Class Implementation                            ║
  538. ║                                                                           ║
  539. ║ Last Modified: September 1995                                             ║
  540. ║                                                                           ║
  541. ║ (C) 1995 SpeedSoft. All rights reserved. Disclosure probibited !          ║
  542. ║                                                                           ║
  543. ╚═══════════════════════════════════════════════════════════════════════════╝
  544. }
  545.  
  546.  
  547. Type
  548.     EProcAddrError=Class(Exception);
  549.  
  550. Const
  551.     WC_WXVIEW:Cstring[9]='WXViewWC';
  552.  
  553. Const
  554.   WX_ERROR       = -1;
  555.   WX_SUCCESS     =  0;
  556.   WX_CANCELLED   =  1;
  557.  
  558. Type
  559.   WXFONTSIZE = LongWord;
  560.  
  561. Const
  562.   WXFONT_SMALL  = 0;
  563.   WXFONT_NORMAL = 1;
  564.   WXFONT_LARGE  = 2;
  565.   WXFONT_XLARGE = 3;
  566.  
  567.   WXSMALLSTRING  =   32;
  568.   WXMEDSTRING    =  256;
  569.   WXLARGESTRING  = 1024;
  570.  
  571.   WXGATEWAY_NONE          = 0;
  572.   WXGATEWAY_PROXY         = 1;          /* gateway flags can be OR'ed */
  573.   WXGATEWAY_SOCKS         = 2;
  574.  
  575.   WXSEARCH_FORWARD  = 0;
  576.   WXSEARCH_BACKWARD = 1;
  577.  
  578.   WXANCHOR_DEFAULT = 0;                 /* can be OR'ed together */
  579.   WXANCHOR_VISITED = 1;
  580.  
  581.   WM_FTPAPI_XFER_UPDATE    = WM_USER + 1000;
  582.  
  583. Type
  584.   PWXDISPLAYOPTS = ^WXDISPLAYOPTS;
  585.   WXDISPLAYOPTS = Record
  586.     szFontName: cstring[WXSMALLSTRING-1];
  587.     wxFontSize: WXFONTSIZE;
  588.     bUnderlineAnchors: BOOL;                /* use underline text for links */
  589.  
  590.     lClrText: LONG;                         /* text color */
  591.     lClrAnchor: LONG;                       /* link color */
  592.     lClrVisitedAnchor: LONG ;               /* seen link color */
  593.     lClrBackground: LONG ;                  /* bg view color */
  594.  
  595.     bInlineGraphics: BOOL;                  /* show inline images? */
  596.     bFastLoad: BOOL;                        /* load document ahead of images? */
  597.     bStreamingGraphics: BOOL;               /* scanline-at-a-time redraw? */
  598.     bFancyInterlace: BOOL;                  /* blur the ilaced GIF? */
  599.  
  600.     bInternalViewer: BOOL;                  /* view standalone imgs in view? */
  601.     bIgnoreImgErrors: BOOL;                 /* toggle display of red "X" on error */
  602.   End;
  603.  
  604.   WXVIEWER = Record
  605.     szMIMEType: CString[WXMEDSTRING-1];       /* MIME type to be viewed */
  606.     szProgram: CString[WXLARGESTRING-1];      /* program to use as a viewer */
  607.   End;
  608.   PWXVIEWER = ^WXVIEWER;
  609.  
  610.   WXGATEWAY = ULONG;
  611.  
  612.   WXNETWORKOPTS = Record
  613.     szEmailAddress: CString[WXLARGESTRING-1];     /* user@host smtp style address */
  614.     szNewsServer: CString[WXLARGESTRING-1];       /* news hostname/ip address */
  615.     wxGateway: WXGATEWAY;                       /* proxy or socks server state */
  616.     szHTTPProxyServer: CString[WXLARGESTRING-1];  /* proxy gw (http://..) */
  617.     szSocksServer: CString[WXLARGESTRING-1];      /* socks gw hostname/ip address */
  618.   End;
  619.   PWXNETWORKOPTS = ^WXNETWORKOPTS;
  620.  
  621.   WXCACHEOPTS = Record
  622.     bEnabled: BOOL;                         /* enable, disable cacheing */
  623.     bMemoryImageCacheing: BOOL;             /* keep cached images in memory */
  624.     lDocLimit: LONG;                        /* number of docs to cache */
  625.     lImageLimit: LONG;                      /* number of images to cache */
  626.     szCacheDir: Cstring[WXMEDSTRING-1];       /* directory for cacheing to disk */
  627.   End;
  628.   PWXCACHEOPTS = ^WXCACHEOPTS;
  629.  
  630.   WXFLAGS   = ULONG;
  631.  
  632.   WXBUTTONDATA = Record
  633.     usButtonNum: USHORT;
  634.     usClickNum: USHORT;
  635.     x: SHORT;
  636.     y: SHORT;
  637.     fsHitTestRes: USHORT;
  638.     fsFlags: USHORT;
  639.     wxflPosType: WXFLAGS;
  640.   End;
  641.   PWXBUTTONDATA = ^WXBUTTONDATA;
  642.  
  643.   WXMOUSEDATA = Record
  644.     x: USHORT;
  645.     y: USHORT;
  646.     uswHitTest: USHORT;
  647.     fsFlags: USHORT;
  648.     wxflPosType: WXFLAGS;
  649.   end;
  650.   PWXMOUSEDATA = ^WXMOUSEDATA;
  651.  
  652.  
  653. Function GetProcAddr(DllHandle:LongWord;Const ProcName:String):Pointer;
  654. Var S:cstring;
  655. Begin
  656.      S:=ProcName;
  657.      {$IFDEF OS2}
  658.      If DosQueryProcAddr(DllHandle,0,S,Result)<>0 Then Raise EProcAddrError.Create(ProcName);
  659.      {$ENDIF}
  660.      {$IFDEF Win95}
  661.      Result:=GetProcAddress(DllHandle,S);
  662.      If Result=Nil Then Raise EProcAddrError.Create(ProcName);
  663.      {$ENDIF}
  664. End;
  665.  
  666. Procedure THTTPBrowser.GetClassData(Var ClassData:TClassData);
  667. Begin
  668.    Inherited GetClassData(ClassData);
  669.    If FDLLHandle<>0 Then
  670.    Begin
  671.       ClassData.ClassULong:=0;
  672.       ClassData.ClassName:=WC_WXVIEW;
  673.       OwnerDraw:=False;
  674.    End;
  675. End;
  676.  
  677. Function THTTPBrowser.GetVersion:Word;
  678. Begin
  679.     If FDLLHandle<>0 Then Result:=FWXViewQueryVersion
  680.     Else Result:=0;
  681. End;
  682.  
  683. Procedure THTTPBrowser.SetupShow;
  684. Var Opts: WXDISPLAYOPTS;
  685. Begin
  686.     Inherited SetupShow;
  687.  
  688.     If FDLLHandle<>0 Then
  689.     Begin
  690.        If not FHTTPFontSizeAssigned Then
  691.        Begin
  692.           FWXViewQueryDisplayOpts(Handle,Opts,SizeOf(Opts));
  693.           Opts.WXFontSize := WXFONT_SMALL;
  694.           FWXViewSetDisplayOpts(Handle,Opts,SizeOf(Opts));
  695.        End;
  696.  
  697.        If FInlineGraphicsAssigned Then InlineGraphics:=FInlineGraphics;
  698.        If FUnderlineAnchorsAssigned Then UnderlineAnchors:=FUnderlineAnchors;
  699.        If FHTTPFontSizeAssigned Then HTTPFontSize:=FHTTPFontSize;
  700.        If FEmailAddress<>Nil Then
  701.        Begin
  702.          EmailAddress:=FEmailAddress^;
  703.          FreeMem(FEmailAddress,length(FEmailAddress^)+1);
  704.          FEmailAddress:=Nil;
  705.        End;
  706.        If FNewsServer<>Nil Then
  707.        Begin
  708.          NewsServer:=FNewsServer^;
  709.          FreeMem(FNewsServer,length(FNewsServer^)+1);
  710.          FNewsServer:=Nil;
  711.        End;
  712.        If FProxyServer<>Nil Then
  713.        Begin
  714.          ProxyServer:=FProxyServer^;
  715.          FreeMem(FProxyServer,length(FProxyServer^)+1);
  716.          FProxyServer:=Nil;
  717.        End;
  718.        If FSocksServer<>Nil Then
  719.        Begin
  720.          SocksServer:=FSocksServer^;
  721.          FreeMem(FSocksServer,length(FSocksServer^)+1);
  722.          FSocksServer:=Nil;
  723.        End;
  724.        If FGatewayAssigned Then Gateway:=FGateway;
  725.        If FEnableCacheAssigned Then EnableCache:=FEnableCache;
  726.        If FCacheDocLimitAssigned Then CacheDocLimit:=FCacheDocLimit;
  727.        If FCacheImageLimitAssigned Then CacheImageLimit:=FCacheImageLimit;
  728.        If FCacheDir<>Nil Then
  729.        Begin
  730.            CacheDir:=FCacheDir^;
  731.            FreeMem(FCacheDir,length(FCacheDir^)+1);
  732.            FCacheDir:=Nil;
  733.        End;
  734.     End;
  735. End;
  736.  
  737. Function THTTPBrowser.GetURL:String;
  738. Begin
  739.     If FURL<>Nil Then Result:=FURL^
  740.     Else Result:='';
  741. End;
  742.  
  743. Procedure THTTPBrowser.SetURL(NewValue:String);
  744. Begin
  745.     If FDLLHandle=0 Then exit;
  746.  
  747.     If FURL<>Nil Then FreeMem(FURL,length(FURL^)+1);
  748.     GetMem(FURL,length(NewValue)+1);
  749.     FURL^:=NewValue;
  750.     If Loaded Then Load;
  751. End;
  752.  
  753. Procedure THTTPBrowser.Load;
  754. Var C:CString;
  755. Begin
  756.     If FDLLHandle<>0 Then If Handle<>0 Then If URL<>'' Then
  757.     Begin
  758.         C:=FURL^;
  759.         If FWXViewLoad(Handle,@C,0,Nil)<>WX_SUCCESS Then
  760.          If FOnLoad<>Nil Then FOnLoad(Self,httpLoadError);;
  761.     End;
  762. End;
  763.  
  764. Procedure THTTPBrowser.LoadWithAnchor(Var Anchor);
  765. Var C:CString;
  766. Begin
  767.     If FDLLHandle<>0 Then If Handle<>0 Then If URL<>'' Then
  768.     Begin
  769.         C:=FURL^;
  770.         If FWXViewLoad(Handle,@C,0,Anchor)<>WX_SUCCESS Then
  771.          If FOnLoad<>Nil Then FOnLoad(Self,httpLoadError);
  772.     End;
  773. End;
  774.  
  775. Function THTTPBrowser.LoadToFile(Const FileName:String):Boolean;
  776. Var C,C1:CString;
  777. Begin
  778.     Result:=False;
  779.     If FDLLHandle<>0 Then If Handle<>0 Then If URL<>'' Then
  780.     Begin
  781.         C:=FURL^;
  782.         C1:=FileName;
  783.         Result:=FWXViewLoadToFile(Handle,@C,@C1,0,Nil)=WX_SUCCESS;
  784.         If not Result Then
  785.          If FOnLoad<>Nil Then FOnLoad(Self,httpLoadError);
  786.     End;
  787. End;
  788.  
  789. Function THTTPBrowser.LoadToFileWithAnchor(Const FileName:String;Var Anchor):Boolean;
  790. Var C,C1:CString;
  791. Begin
  792.     Result:=False;
  793.     If FDLLHandle<>0 Then If Handle<>0 Then If URL<>'' Then
  794.     Begin
  795.         C:=FURL^;
  796.         C1:=FileName;
  797.         Result:=FWXViewLoadToFile(Handle,@C,@C1,0,Anchor)=WX_SUCCESS;
  798.         If not Result Then
  799.          If FOnLoad<>Nil Then FOnLoad(Self,httpLoadError);
  800.     End;
  801. End;
  802.  
  803.  
  804. Procedure THTTPBrowser.CancelLoad;
  805. Begin
  806.      If FDLLHandle<>0 Then If Handle<>0 Then
  807.      Begin
  808.          FLoadCancel:=False;
  809.          If FWXViewCancelLoad(Handle)<>WX_ERROR Then
  810.          Begin
  811.              //wait for the cancel operation to complete
  812.              Repeat
  813.                  Application.HandleMessage;
  814.              Until FLoadCancel;
  815.          End;
  816.      End;
  817. End;
  818.  
  819. Procedure THTTPBrowser.SetupComponent;
  820. Var C,DllName:CString;
  821. Begin
  822.     Inherited SetupComponent;
  823.     Name:='HTTP';
  824.     Width:=300;
  825.     Height:=300;
  826.  
  827.     DllName:='WEBEXWIN';
  828.     {$IFDEF OS2}
  829.     If DosLoadModule(C,255,DllName,FDllHandle)<>0 Then
  830.     Begin
  831.          FDLLHandle:=0;
  832.          If ComponentState * [csWriting,csDesigning] = []
  833.            Then ErrorBox('DLL not found: WEBEXWIN.DLL !');
  834.          Exit;
  835.     End;
  836.     {$ENDIF}
  837.     {$IFDEF WIN32}
  838.     If ComponentState * [csWriting,csDesigning] = []
  839.       Then ErrorBox('THTTPBrowser currently not supported for Win32 !');
  840.     Exit;
  841.     {$ENDIF}
  842.  
  843.     Try
  844.        FWXViewQueryVersion:=Pointer(GetProcAddr(FDllHandle,'WXViewQueryVersion'));
  845.        FWXViewQueryDisplayOpts:=Pointer(GetProcAddr(FDllHandle,'WXViewQueryDisplayOpts'));
  846.        FWXViewSetDisplayOpts:=Pointer(GetProcAddr(FDllHandle,'WXViewSetDisplayOpts'));
  847.        FWXViewLoad:=Pointer(GetProcAddr(FDllHandle,'WXViewLoad'));
  848.        FWXViewQueryViewer:=(GetProcAddr(FDllHandle,'WXViewQueryViewer'));
  849.        FWXViewSetViewer:=(GetProcAddr(FDllHandle,'WXViewSetViewer'));
  850.        FWXViewQueryNetworkOpts:=(GetProcAddr(FDllHandle,'WXViewQueryNetworkOpts'));
  851.        FWXViewSetNetworkOpts:=(GetProcAddr(FDllHandle,'WXViewSetNetworkOpts'));
  852.        FWXViewEnableGateway:=(GetProcAddr(FDllHandle,'WXViewEnableGateway'));
  853.        FWXViewQueryCacheOpts:=(GetProcAddr(FDllHandle,'WXViewQueryCacheOpts'));
  854.        FWXViewSetCacheOpts:=(GetProcAddr(FDllHandle,'WXViewSetCacheOpts'));
  855.        FWXViewCancelLoad:=(GetProcAddr(FDllHandle,'WXViewCancelLoad'));
  856.        FWXViewQueryDocTitle:=(GetProcAddr(FDllHandle,'WXViewQueryDocTitle'));
  857.        FWXViewQueryAnchorData:=(GetProcAddr(FDllHandle,'WXViewQueryAnchorData'));
  858.        FWXViewQueryAnchorDataLen:=(GetProcAddr(FDllHandle,'WXViewQueryAnchorDataLen'));
  859.        FWXViewQueryAnchor:=(GetProcAddr(FDllHandle,'WXViewQueryAnchor'));
  860.        FWXViewQueryPos:=(GetProcAddr(FDllHandle,'WXViewQueryPos'));
  861.        FWXViewLoadToFile:=(GetProcAddr(FDllHandle,'WXViewLoadToFile'));
  862.        FWXViewQueryDocAnchor:=(GetProcAddr(FDllHandle,'WXViewQueryDocAnchor'));
  863.        FWXViewSearch:=(GetProcAddr(FDllHandle,'WXViewSearch'));
  864.        FWXViewIsLoading:=(GetProcAddr(FDllHandle,'WXViewIsLoading'));
  865.        FWXViewQueryAnchorState:=(GetProcAddr(FDllHandle,'WXViewQueryAnchorState'));
  866.        FWXViewSetAnchorState:=(GetProcAddr(FDllHandle,'WXViewSetAnchorState'));
  867.        FWXViewQueryLastError:=(GetProcAddr(FDllHandle,'WXViewQueryLastError'));
  868.        FWXViewQueryLastLoadError:=(GetProcAddr(FDllHandle,'WXViewQueryLastLoadError'));
  869.  
  870.        FWXViewQueryVersion; //Initialize and load window class
  871.     Except
  872.        {$IFDEF OS2}
  873.        DosFreeModule(FDLLHandle);
  874.        {$ENDIF}
  875.        FDLLHandle:=0;
  876.        On E:EProcAddrError Do
  877.        Begin
  878.          If ComponentState * [csWriting,csDesigning] = []
  879.            Then ErrorBox('Cannot retrieve procedure from WEBEXWIN:'+E.Message+' !');
  880.        End;
  881.        Else Raise;
  882.     End;
  883. End;
  884.  
  885. Destructor THTTPBrowser.Destroy;
  886. Begin
  887.     If FDLLHandle<>0 Then
  888.     Begin
  889.          {$IFDEF OS2}
  890.          DosFreeModule(FDLLHandle);
  891.          {$ENDIF}
  892.          FDLLHandle:=0;
  893.     End;
  894.     If FURL<>Nil Then
  895.     Begin
  896.        FreeMem(FURL,length(FURL^)+1);
  897.        FURL:=Nil;
  898.     End;
  899.  
  900.     If FEmailAddress<>Nil Then
  901.     Begin
  902.          FreeMem(FEmailAddress,length(FEmailAddress^)+1);
  903.          FEmailAddress:=Nil;
  904.     End;
  905.     If FNewsServer<>Nil Then
  906.     Begin
  907.          FreeMem(FNewsServer,length(FNewsServer^)+1);
  908.          FNewsServer:=Nil;
  909.     End;
  910.     If FProxyServer<>Nil Then
  911.     Begin
  912.          FreeMem(FProxyServer,length(FProxyServer^)+1);
  913.          FProxyServer:=Nil;
  914.     End;
  915.     If FSocksServer<>Nil Then
  916.     Begin
  917.          FreeMem(FSocksServer,length(FSocksServer^)+1);
  918.          FSocksServer:=Nil;
  919.     End;
  920.     If FCacheDir<>Nil Then
  921.     Begin
  922.          FreeMem(FCacheDir,length(FCacheDir^)+1);
  923.          FCacheDir:=Nil;
  924.     End;
  925.  
  926.     Inherited Destroy;
  927. End;
  928.  
  929. Function THTTPBrowser.GetInlineGraphics:Boolean;
  930. Var Opts: WXDISPLAYOPTS;
  931. Begin
  932.     If FDLLHandle=0 Then exit;
  933.     If Handle=0 Then
  934.     Begin
  935.        If FInlineGraphicsAssigned Then result:=FInlineGraphics
  936.        Else Result:=False;
  937.        exit
  938.     End;
  939.     FWXViewQueryDisplayOpts(Handle,Opts,SizeOf(Opts));
  940.     Result:=Opts.bInlineGraphics;
  941. End;
  942.  
  943. Procedure THTTPBrowser.SetInlineGraphics(NewValue:Boolean);
  944. Var Opts: WXDISPLAYOPTS;
  945.     RetErr:LongInt;
  946. Begin
  947.     If FDLLHandle=0 Then exit;
  948.     If Handle<>0 Then
  949.     Begin
  950.        RetErr:=FWXViewQueryDisplayOpts(Handle,Opts,SizeOf(Opts));
  951.        If RetErr<>WX_SUCCESS Then exit;
  952.        Opts.bInlineGraphics:=NewValue;
  953.        FWXViewSetDisplayOpts(Handle,Opts,SizeOf(Opts));
  954.     End
  955.     Else
  956.     Begin
  957.        FInlineGraphicsAssigned:=True;
  958.        FInlineGraphics:=NewValue;
  959.     End;
  960. End;
  961.  
  962. Function THTTPBrowser.GetUnderlineAnchors:Boolean;
  963. Var Opts: WXDISPLAYOPTS;
  964. Begin
  965.     If FDLLHandle=0 Then exit;
  966.     If Handle=0 Then
  967.     Begin
  968.         If FUnderlineAnchorsAssigned Then Result:=FUnderlineAnchors
  969.         Else Result:=False;
  970.         exit;
  971.     End;
  972.     FWXViewQueryDisplayOpts(Handle,Opts,SizeOf(Opts));
  973.     Result:=Opts.bUnderlineAnchors;
  974. End;
  975.  
  976. Procedure THTTPBrowser.SetUnderlineAnchors(NewValue:Boolean);
  977. Var Opts: WXDISPLAYOPTS;
  978.     RetErr:LongInt;
  979. Begin
  980.     If FDLLHandle=0 Then exit;
  981.     If Handle<>0 Then
  982.     Begin
  983.         RetErr:=FWXViewQueryDisplayOpts(Handle,Opts,SizeOf(Opts));
  984.         If RetErr<>WX_SUCCESS Then exit;
  985.         Opts.bUnderlineAnchors:=NewValue;
  986.         FWXViewSetDisplayOpts(Handle,Opts,SizeOf(Opts));
  987.     End
  988.     Else
  989.     Begin
  990.         FUnderlineAnchorsAssigned:=True;
  991.         FUnderlineAnchors:=NewValue;
  992.     End;
  993. End;
  994.  
  995. Function THTTPBrowser.GetHTTPFontSize:THTTPFontSize;
  996. Var Opts: WXDISPLAYOPTS;
  997. Begin
  998.     Result:=httpFontNormal;
  999.     If FDLLHandle=0 Then exit;
  1000.     If Handle=0 Then
  1001.     Begin
  1002.        If FHTTPFontSizeAssigned Then result:=FHTTPFontSize
  1003.        Else Result:=httpFontNormal;
  1004.        exit;
  1005.     End;
  1006.     FWXViewQueryDisplayOpts(Handle,Opts,SizeOf(Opts));
  1007.     Case Opts.wxFontSize Of
  1008.        WXFONT_SMALL:Result:=httpFontSmall;
  1009.        WXFONT_LARGE:Result:=httpFontLarge;
  1010.        WXFONT_XLARGE:Result:=httpFontXLarge;
  1011.        Else Result:=httpFontNormal;
  1012.     End;
  1013. End;
  1014.  
  1015. Procedure THTTPBrowser.SetHTTPFontSize(NewValue:THTTPFontSize);
  1016. Var Opts: WXDISPLAYOPTS;
  1017.     s:WXFONTSIZE;
  1018.     RetErr:LongInt;
  1019. Begin
  1020.     If FDLLHandle=0 Then exit;
  1021.     If Handle<>0 Then
  1022.     Begin
  1023.        RetErr:=FWXViewQueryDisplayOpts(Handle,Opts,SizeOf(Opts));
  1024.        If RetErr<>WX_SUCCESS Then exit;
  1025.        Case NewValue Of
  1026.           httpFontSmall:s:=WXFONT_SMALL;
  1027.           httpFontNormal:s:=WXFONT_NORMAL;
  1028.           httpFontLarge:s:=WXFONT_LARGE;
  1029.           httpFontXLarge:s:=WXFONT_XLARGE;
  1030.        End;
  1031.        Opts.wxFontSize:=s;
  1032.        FWXViewSetDisplayOpts(Handle,Opts,SizeOf(Opts));
  1033.     End
  1034.     Else
  1035.     Begin
  1036.        FHTTPFontSizeAssigned:=True;
  1037.        FHTTPFontSize:=NewValue;
  1038.     End;
  1039. End;
  1040.  
  1041. Function THTTPBrowser.GetMIMEViewer(MIMEPair:String):String;
  1042. Var Viewer:WXVIEWER;
  1043.     RetErr:LongInt;
  1044.     c:CString;
  1045. Begin
  1046.     Result:='';
  1047.     If FDLLHandle=0 Then exit;
  1048.     If Handle=0 Then exit;
  1049.     c:=MimePair;
  1050.     Viewer.szMIMEType:=c;
  1051.     Viewer.szProgram:='';
  1052.     RetErr:=FWXViewQueryViewer(Handle,@c,Viewer,sizeof(Viewer));
  1053.     If RetErr=WX_SUCCESS Then Result:=Viewer.szProgram
  1054.     Else Result:='';
  1055. End;
  1056.  
  1057. Procedure THTTPBrowser.SetMIMEViewer(MIMEPair,EXEProgram:String);
  1058. Var Viewer:WXVIEWER;
  1059. Begin
  1060.     If FDLLHandle=0 Then exit;
  1061.     If Handle=0 Then exit;
  1062.     Viewer.szMIMEType:=MIMEPair;
  1063.     Viewer.szProgram:=ExeProgram;
  1064.     FWXViewSetViewer(Handle,Viewer,sizeof(Viewer));
  1065. End;
  1066.  
  1067. Function THTTPBrowser.GetEmailAddress:String;
  1068. Var Opts:WXNETWORKOPTS;
  1069.     RetErr:LongInt;
  1070. Begin
  1071.      Result:='';
  1072.      If FDLLHandle=0 Then exit;
  1073.      If Handle=0 Then
  1074.      Begin
  1075.          If FEmailAddress<>Nil Then Result:=FEmailAddress^
  1076.          Else Result:='';
  1077.          exit;
  1078.      End;
  1079.      RetErr:=FWXViewQueryNetWorkOpts(Handle,Opts,sizeof(Opts));
  1080.      If RetErr<>WX_SUCCESS Then exit;
  1081.      result:=Opts.szEmailAddress;
  1082. End;
  1083.  
  1084. Procedure THTTPBrowser.SetEmailAddress(NewValue:String);
  1085. Var Opts:WXNETWORKOPTS;
  1086.     RetErr:LongInt;
  1087. Begin
  1088.      If FDLLHandle=0 Then exit;
  1089.      If Handle<>0 Then
  1090.      Begin
  1091.         RetErr:=FWXViewQueryNetWorkOpts(Handle,Opts,sizeof(Opts));
  1092.         If RetErr<>WX_SUCCESS Then exit;
  1093.         Opts.szEmailAddress:=NewValue;
  1094.         FWXViewSetNetWorkOpts(Handle,Opts,sizeof(Opts));
  1095.      End
  1096.      Else
  1097.      Begin
  1098.         GetMem(FEmailAddress,length(NewValue)+1);
  1099.         FEmailAddress^:=NewValue;
  1100.      End;
  1101. End;
  1102.  
  1103.  
  1104. Function THTTPBrowser.GetNewsServer:String;
  1105. Var Opts:WXNETWORKOPTS;
  1106.     RetErr:LongInt;
  1107. Begin
  1108.      Result:='';
  1109.      If FDLLHandle=0 Then exit;
  1110.      If Handle=0 Then
  1111.      Begin
  1112.         If FNewsServer<>Nil Then Result:=FNewsServer^
  1113.         Else Result:='';
  1114.         exit;
  1115.      End;
  1116.      RetErr:=FWXViewQueryNetWorkOpts(Handle,Opts,sizeof(Opts));
  1117.      If RetErr<>WX_SUCCESS Then exit;
  1118.      result:=Opts.szNewsServer;
  1119. End;
  1120.  
  1121. Procedure THTTPBrowser.SetNewsServer(NewValue:String);
  1122. Var Opts:WXNETWORKOPTS;
  1123.     RetErr:LongInt;
  1124. Begin
  1125.      If FDLLHandle=0 Then exit;
  1126.      If Handle<>0 Then
  1127.      Begin
  1128.         RetErr:=FWXViewQueryNetWorkOpts(Handle,Opts,sizeof(Opts));
  1129.         If RetErr<>WX_SUCCESS Then exit;
  1130.         Opts.szNewsServer:=NewValue;
  1131.         FWXViewSetNetWorkOpts(Handle,Opts,sizeof(Opts));
  1132.      End
  1133.      Else
  1134.      Begin
  1135.         GetMem(FNewsServer,length(NewValue)+1);
  1136.         FNewsServer^:=NewValue;
  1137.      End;
  1138. End;
  1139.  
  1140. Function THTTPBrowser.GetProxyServer:String;
  1141. Var Opts:WXNETWORKOPTS;
  1142.     RetErr:LongInt;
  1143. Begin
  1144.      Result:='';
  1145.      If FDLLHandle=0 Then exit;
  1146.      If Handle=0 Then
  1147.      Begin
  1148.         If FProxyServer<>Nil Then Result:=FProxyServer^
  1149.         Else Result:='';
  1150.         exit;
  1151.      End;
  1152.      RetErr:=FWXViewQueryNetWorkOpts(Handle,Opts,sizeof(Opts));
  1153.      If RetErr<>WX_SUCCESS Then exit;
  1154.      result:=Opts.szHTTPProxyServer;
  1155. End;
  1156.  
  1157. Procedure THTTPBrowser.SetProxyServer(NewValue:String);
  1158. Var Opts:WXNETWORKOPTS;
  1159.     RetErr:LongInt;
  1160. Begin
  1161.      If FDLLHandle=0 Then exit;
  1162.      If Handle<>0 Then
  1163.      Begin
  1164.         RetErr:=FWXViewQueryNetWorkOpts(Handle,Opts,sizeof(Opts));
  1165.         If RetErr<>WX_SUCCESS Then exit;
  1166.         Opts.szHTTPProxyServer:=NewValue;
  1167.         FWXViewSetNetWorkOpts(Handle,Opts,sizeof(Opts));
  1168.      End
  1169.      Else
  1170.      Begin
  1171.         GetMem(FProxyServer,length(NewValue)+1);
  1172.         FProxyServer^:=NewValue;
  1173.      End;
  1174. End;
  1175.  
  1176. Function THTTPBrowser.GetSocksServer:String;
  1177. Var Opts:WXNETWORKOPTS;
  1178.     RetErr:LongInt;
  1179. Begin
  1180.      Result:='';
  1181.      If FDLLHandle=0 Then exit;
  1182.      If Handle=0 Then
  1183.      Begin
  1184.          If FSocksServer<>Nil Then Result:=FSocksServer^
  1185.          Else Result:='';
  1186.          exit;
  1187.      End;
  1188.      RetErr:=FWXViewQueryNetWorkOpts(Handle,Opts,sizeof(Opts));
  1189.      If RetErr<>WX_SUCCESS Then exit;
  1190.      result:=Opts.szSocksServer;
  1191. End;
  1192.  
  1193. Procedure THTTPBrowser.SetSocksServer(NewValue:String);
  1194. Var Opts:WXNETWORKOPTS;
  1195.     RetErr:LongInt;
  1196. Begin
  1197.      If FDLLHandle=0 Then exit;
  1198.      If Handle<>0 Then
  1199.      Begin
  1200.          RetErr:=FWXViewQueryNetWorkOpts(Handle,Opts,sizeof(Opts));
  1201.          If RetErr<>WX_SUCCESS Then exit;
  1202.          Opts.szSocksServer:=NewValue;
  1203.          FWXViewSetNetWorkOpts(Handle,Opts,sizeof(Opts));
  1204.      End
  1205.      Else
  1206.      Begin
  1207.          GetMem(FSocksServer,length(NewValue)+1);
  1208.          FSocksServer^:=NewValue;
  1209.      End;
  1210. End;
  1211.  
  1212. Function THTTPBrowser.GetGateway:THTTPGateway;
  1213. Var Opts:WXNETWORKOPTS;
  1214.     RetErr:LongInt;
  1215. Begin
  1216.      Result:=httpGatewayNone;
  1217.      If FDLLHandle=0 Then exit;
  1218.      If Handle=0 Then
  1219.      Begin
  1220.        If FGatewayAssigned Then Result:=FGateway
  1221.        Else Result:=httpGatewayNone;
  1222.        exit;
  1223.      End;
  1224.      RetErr:=FWXViewQueryNetWorkOpts(Handle,Opts,sizeof(Opts));
  1225.      If RetErr<>WX_SUCCESS Then exit;
  1226.      Case Opts.wxGateway Of
  1227.         WXGATEWAY_PROXY:Result:=httpGatewayProxy;
  1228.         WXGATEWAY_SOCKS:Result:=httpGatewaySocks;
  1229.         WXGATEWAY_PROXY Or WXGATEWAY_SOCKS:Result:=httpGatewayProxySocks;
  1230.         Else Result:=httpGatewayNone;
  1231.      End;
  1232. End;
  1233.  
  1234. Procedure THTTPBrowser.SetGateway(NewValue:THTTPGateway);
  1235. Var gw:WXGATEWAY;
  1236. Begin
  1237.     If FDLLHandle=0 Then exit;
  1238.     If Handle<>0 Then
  1239.     Begin
  1240.        Case NewValue Of
  1241.           httpGatewayProxy:gw:=WXGATEWAY_PROXY;
  1242.           httpGatewaySocks:gw:=WXGATEWAY_SOCKS;
  1243.           httpGatewayProxySocks:gw:=WXGATEWAY_PROXY Or WXGATEWAY_SOCKS;
  1244.           Else gw:=WXGATEWAY_NONE;
  1245.        End;
  1246.        FWXViewEnableGateway(Handle,gw);
  1247.     End
  1248.     Else
  1249.     Begin
  1250.        FGatewayAssigned:=True;
  1251.        FGateway:=NewValue;
  1252.     End;
  1253. End;
  1254.  
  1255. Function THTTPBrowser.GetEnableCache:Boolean;
  1256. Var Opts:WXCACHEOPTS;
  1257.     RetErr:LongInt;
  1258. Begin
  1259.      Result:=False;
  1260.      If FDLLHandle=0 Then exit;
  1261.      If Handle=0 Then
  1262.      Begin
  1263.         If FEnableCacheAssigned Then Result:=FEnableCache
  1264.         Else Result:=False;
  1265.         exit;
  1266.      End;
  1267.      RetErr:=FWXViewQueryCacheOpts(Handle,Opts,sizeof(Opts));
  1268.      If RetErr<>WX_SUCCESS Then exit;
  1269.      result:=Opts.bEnabled;
  1270. End;
  1271.  
  1272. Procedure THTTPBrowser.SetEnableCache(NewValue:Boolean);
  1273. Var Opts:WXCACHEOPTS;
  1274.     RetErr:LongInt;
  1275. Begin
  1276.      If FDLLHandle=0 Then exit;
  1277.      If Handle<>0 Then
  1278.      Begin
  1279.         RetErr:=FWXViewQueryCacheOpts(Handle,Opts,sizeof(Opts));
  1280.         If RetErr<>WX_SUCCESS Then exit;
  1281.         Opts.bEnabled:=NewValue;
  1282.         FWXViewSetCacheOpts(Handle,Opts,sizeof(Opts));
  1283.      End
  1284.      Else
  1285.      Begin
  1286.         FEnableCacheAssigned:=True;
  1287.         FEnableCache:=NewValue;
  1288.      End;
  1289. End;
  1290.  
  1291. Function THTTPBrowser.GetCacheDocLimit:LongInt;
  1292. Var Opts:WXCACHEOPTS;
  1293.     RetErr:LongInt;
  1294. Begin
  1295.      Result:=0;
  1296.      If FDLLHandle=0 Then exit;
  1297.      If Handle=0 Then
  1298.      Begin
  1299.         If FCacheDocLimitAssigned Then Result:=FCacheDocLimit
  1300.         Else Result:=0;
  1301.         exit;
  1302.      End;
  1303.      RetErr:=FWXViewQueryCacheOpts(Handle,Opts,sizeof(Opts));
  1304.      If RetErr<>WX_SUCCESS Then exit;
  1305.      result:=Opts.lDocLimit;
  1306. End;
  1307.  
  1308. Procedure THTTPBrowser.SetCacheDocLimit(NewValue:LongInt);
  1309. Var Opts:WXCACHEOPTS;
  1310.     RetErr:LongInt;
  1311. Begin
  1312.      If FDLLHandle=0 Then exit;
  1313.      If Handle<>0 Then
  1314.      Begin
  1315.         RetErr:=FWXViewQueryCacheOpts(Handle,Opts,sizeof(Opts));
  1316.         If RetErr<>WX_SUCCESS Then exit;
  1317.         Opts.lDocLimit:=NewValue;
  1318.         FWXViewSetCacheOpts(Handle,Opts,sizeof(Opts));
  1319.      End
  1320.      Else
  1321.      Begin
  1322.         FCacheDocLimitAssigned:=True;
  1323.         FCacheDocLimit:=NewValue;
  1324.      End;
  1325. End;
  1326.  
  1327. Function THTTPBrowser.GetCacheImageLimit:LongInt;
  1328. Var Opts:WXCACHEOPTS;
  1329.     RetErr:LongInt;
  1330. Begin
  1331.      Result:=0;
  1332.      If FDLLHandle=0 Then exit;
  1333.      If Handle=0 Then
  1334.      Begin
  1335.         If FCacheImageLimitAssigned Then Result:=FCacheImageLimit
  1336.         Else Result:=0;
  1337.         exit;
  1338.      End;
  1339.      RetErr:=FWXViewQueryCacheOpts(Handle,Opts,sizeof(Opts));
  1340.      If RetErr<>WX_SUCCESS Then exit;
  1341.      result:=Opts.lImageLimit;
  1342. End;
  1343.  
  1344. Procedure THTTPBrowser.SetCacheImageLimit(NewValue:LongInt);
  1345. Var Opts:WXCACHEOPTS;
  1346.     RetErr:LongInt;
  1347. Begin
  1348.      If FDLLHandle=0 Then exit;
  1349.      If Handle<>0 Then
  1350.      Begin
  1351.         RetErr:=FWXViewQueryCacheOpts(Handle,Opts,sizeof(Opts));
  1352.         If RetErr<>WX_SUCCESS Then exit;
  1353.         Opts.lImageLimit:=NewValue;
  1354.         FWXViewSetCacheOpts(Handle,Opts,sizeof(Opts));
  1355.      End
  1356.      Else
  1357.      Begin
  1358.         FCacheImageLimitAssigned:=True;
  1359.         FCacheImageLimit:=NewValue;
  1360.      End;
  1361. End;
  1362.  
  1363. Function THTTPBrowser.GetCacheDir:String;
  1364. Var Opts:WXCACHEOPTS;
  1365.     RetErr:LongInt;
  1366. Begin
  1367.      Result:='';
  1368.      If FDLLHandle=0 Then exit;
  1369.      If Handle=0 Then
  1370.      Begin
  1371.          If FCacheDir<>Nil Then Result:=FCacheDir^
  1372.          Else Result:='';
  1373.          exit;
  1374.      End;
  1375.      RetErr:=FWXViewQueryCacheOpts(Handle,Opts,sizeof(Opts));
  1376.      If RetErr<>WX_SUCCESS Then exit;
  1377.      result:=Opts.szCacheDir;
  1378. End;
  1379.  
  1380. Procedure THTTPBrowser.SetCacheDir(NewValue:String);
  1381. Var Opts:WXCACHEOPTS;
  1382.     RetErr:LongInt;
  1383. Begin
  1384.      If FDLLHandle=0 Then exit;
  1385.      If Handle<>0 Then
  1386.      Begin
  1387.         RetErr:=FWXViewQueryCacheOpts(Handle,Opts,sizeof(Opts));
  1388.         If RetErr<>WX_SUCCESS Then exit;
  1389.         Opts.szCacheDir:=NewValue;
  1390.         FWXViewSetCacheOpts(Handle,Opts,sizeof(Opts));
  1391.      End
  1392.      Else
  1393.      Begin
  1394.         GetMem(FCacheDir,length(NewValue)+1);
  1395.         FCacheDir^:=NewValue;
  1396.      End;
  1397. End;
  1398.  
  1399. Procedure THTTPBrowser.SetLoaded(NewValue:Boolean);
  1400. Begin
  1401.     If NewValue Then Load
  1402.     Else CancelLoad;
  1403. End;
  1404.  
  1405. Procedure THTTPBrowser.WXLoadResult(Var Msg:TMessage);
  1406. Var s:THTTPLoadStatus;
  1407. Begin
  1408.     FLoaded:=Msg.Param2=WX_SUCCESS;
  1409.     Case Msg.Param2 Of
  1410.        WX_SUCCESS:s:=httpLoadSuccess;
  1411.        WX_CANCELLED:s:=httpLoadCancelled;
  1412.        Else s:=httpLoadError;
  1413.     End;
  1414.     If FOnLoad<>Nil Then FOnLoad(Self,s);
  1415.     FLoadCancel:=True; //indicate message received
  1416. End;
  1417.  
  1418. Function THTTPBrowser.GetDocTitle:String;
  1419. Var C:CString;
  1420. Begin
  1421.     If ((FDLLHandle=0)Or(Handle=0)) Then exit;
  1422.     If FWXViewQueryDocTitle(Handle,@c,250)<>WX_SUCCESS Then Result:=''
  1423.     Else Result:=c;
  1424. End;
  1425.  
  1426. Function THTTPBrowser.GetAnchorDataLen(Const Pos:THTTPPos):LongWord;
  1427. Begin
  1428.     If ((FDLLHandle=0)Or(Handle=0)) Then exit;
  1429.     Result:=FWXViewQueryAnchorDataLen(Handle,Pos);
  1430. End;
  1431.  
  1432. Function THTTPBrowser.GetAnchorData(Const Pos:THTTPPos;Var Buf;BufLen:LongWord):Boolean;
  1433. Begin
  1434.     If ((FDLLHandle=0)Or(Handle=0)) Then exit;
  1435.     Result:=FWXViewQueryAnchorData(Handle,Pos,Buf,BufLen)=WX_SUCCESS;
  1436. End;
  1437.  
  1438. Function THTTPBrowser.GetAnchor(Const Pos:THTTPPos):String;
  1439. Var c:CString;
  1440. Begin
  1441.     If ((FDLLHandle=0)Or(Handle=0)) Then exit;
  1442.     If FWXViewQueryAnchor(Handle,Pos,@c,250)=WX_SUCCESS Then Result:=c
  1443.     Else Result:='';
  1444. End;
  1445.  
  1446. Procedure THTTPBrowser.WXButtonClick(Var Msg:TMessage);
  1447. Var BData:PWXBUTTONDATA;
  1448.     Pos:THTTPPos;
  1449. Begin
  1450.     BData:=Pointer(Msg.Param2);
  1451.     If BData<>Nil Then If BData^.usButtonNum=1 Then //only for left button
  1452.     Begin
  1453.          If FWXViewQueryPos(Handle,BData^.x,BData^.y,Pos)=WX_SUCCESS Then
  1454.            If FOnDocMouseClick<>Nil Then FOnDocMouseClick(Self,Pos);
  1455.     End;
  1456. End;
  1457.  
  1458. Procedure THTTPBrowser.WXMouseMove(Var Msg:TMessage);
  1459. Var MData:PWXMOUSEDATA;
  1460.     Pos:THTTPPos;
  1461. Begin
  1462.     MData:=Pointer(Msg.Param2);
  1463.     If MData<>Nil Then
  1464.     Begin
  1465.          If FWXViewQueryPos(Handle,MData^.x,MData^.y,Pos)=WX_SUCCESS Then
  1466.            If FOnDocMouseMove<>Nil Then FOnDocMouseMove(Self,Pos);
  1467.     End;
  1468. End;
  1469.  
  1470. Function THTTPBrowser.GetDocAnchor:String;
  1471. Var c:CString;
  1472. Begin
  1473.      Result:='';
  1474.      If ((FDLLHandle=0)Or(Handle=0)) Then exit;
  1475.      If FWXViewQueryDocAnchor(Handle,@c,250)=WX_SUCCESS Then Result:=C;
  1476. End;
  1477.  
  1478. Function THTTPBrowser.Search(Const s:String;Const StartPos:THTTPPos;Options:THTTPSearchOptions):THTTPPos;
  1479. Var Opt:LongWord;
  1480.     C:CString;
  1481. Begin
  1482.      If ((FDLLHandle=0)Or(Handle=0)) Then exit;
  1483.      C:=s;
  1484.      If Options=httpSearchBackward Then Opt:=WXSEARCH_BACKWARD
  1485.      Else Opt:=WXSEARCH_FORWARD;
  1486.      If FWXViewSearch(Handle,Opt,StartPos,Result,@C)<>WX_SUCCESS Then
  1487.        FillChar(Result,sizeof(Result),0);
  1488. End;
  1489.  
  1490. Function THTTPBrowser.GetIsLoading:Boolean;
  1491. Begin
  1492.     Result:=False;
  1493.     If ((FDLLHandle=0)Or(Handle=0)) Then exit;
  1494.     Result:=FWXViewIsLoading(Handle);
  1495. End;
  1496.  
  1497. Function THTTPBrowser.GetAnchorState(Const Anchor:String):THTTPAnchorState;
  1498. Var C:CString;
  1499.     S:LongWord;
  1500. Begin
  1501.      result:=httpAnchorDefault;
  1502.      If ((FDLLHandle=0)Or(Handle=0)) Then exit;
  1503.      C:=Anchor;
  1504.      If FWXViewQueryAnchorState(Handle,@C,s)=WX_SUCCESS Then
  1505.      Begin
  1506.          If s=WXANCHOR_VISITED Then Result:=httpAnchorVisited
  1507.          Else result:=httpAnchorDefault;
  1508.      End;
  1509. End;
  1510.  
  1511. Procedure THTTPBrowser.SetAnchorState(Const Anchor:String;NewValue:THTTPAnchorState);
  1512. Var S:LongWord;
  1513.     C:CString;
  1514. Begin
  1515.      If ((FDLLHandle=0)Or(Handle=0)) Then exit;
  1516.      C:=Anchor;
  1517.      If NewValue=httpAnchorVisited Then s:=WXANCHOR_VISITED
  1518.      Else s:=WXANCHOR_DEFAULT;
  1519.      FWXViewSetAnchorState(Handle,@C,s);
  1520. End;
  1521.  
  1522. Function THTTPBrowser.GetLastLoadError:LongInt;
  1523. Begin
  1524.      Result:=0;
  1525.      If ((FDLLHandle=0)Or(Handle=0)) Then exit;
  1526.      Result:=FWXViewQueryLastLoadError(Handle);
  1527. End;
  1528.  
  1529. Function THTTPBrowser.GetLastError:LongInt;
  1530. Begin
  1531.      Result:=0;
  1532.      If ((FDLLHandle=0)Or(Handle=0)) Then exit;
  1533.      Result:=FWXViewQueryLastError(Handle);
  1534. End;
  1535.  
  1536. {
  1537. ╔═══════════════════════════════════════════════════════════════════════════╗
  1538. ║                                                                           ║
  1539. ║ Speed-Pascal/2 Version 2.0                                                ║
  1540. ║                                                                           ║
  1541. ║ Speed-Pascal Component Classes (SPCC)                                     ║
  1542. ║                                                                           ║
  1543. ║ This section: TFTP Class Implementation                                   ║
  1544. ║                                                                           ║
  1545. ║ Last Modified: September 1995                                             ║
  1546. ║                                                                           ║
  1547. ║ (C) 1995 SpeedSoft. All rights reserved. Disclosure probibited !          ║
  1548. ║                                                                           ║
  1549. ╚═══════════════════════════════════════════════════════════════════════════╝
  1550. }
  1551.  
  1552.  
  1553. Type
  1554.    TFTPNotifyControl=Class(TControl)
  1555.       Private
  1556.          FFTP:TFTP;
  1557.       Protected
  1558.          Procedure SetupComponent;Override;
  1559.          Procedure CreateWnd;Override;
  1560.          Procedure WMFTPUpdate(Var Msg:TMessage); message WM_FTPAPI_XFER_UPDATE;
  1561.    End;
  1562.  
  1563. Procedure TFTPNotifyControl.WMFTPUpdate(Var Msg:TMessage);
  1564. Begin
  1565.      If FFTP.OnTransferProgress<>Nil Then
  1566.       FFTP.OnTransferProgress(FFTP,Msg.Param1,Msg.Param2);
  1567. End;
  1568.  
  1569. Procedure TFTPNotifyControl.SetupComponent;
  1570. Begin
  1571.      Inherited SetupComponent;
  1572.      Include (ComponentState, csDetail);
  1573. End;
  1574.  
  1575. Procedure TFTPNotifyControl.CreateWnd; //dummy
  1576. Begin
  1577.      Inherited CreateWnd;
  1578. End;
  1579.  
  1580. Const
  1581.     FTPSERVICE    =1;    /* ftp: ftp/tcp: unknown service */
  1582.     FTPHOST       =2;    /* unknown host */
  1583.     FTPSOCKET     =3;    /* unable to obtain socket */
  1584.     FTPCONNECT    =4;    /* unable to connect to server */
  1585.     FTPLOGIN      =5;    /* login failed */
  1586.     FTPABORT      =6;    /* transfer aborted */
  1587.     FTPLOCALFILE  =7;    /* problem openning local file */
  1588.     FTPDATACONN   =8;    /* problem initializing data connection */
  1589.     FTPCOMMAND    =9;    /* command failed */
  1590.     FTPPROXYTHIRD =10;   /* proxy server does not support third party transfers */
  1591.     FTPNOPRIMARY  =11;   /* No primary connection for proxy transfer */
  1592.     FTPNOXLATETBL =12;   /* No code page translation table was loded */
  1593.  
  1594.     T_ASCII       =1;
  1595.     T_EBCDIC      =2;
  1596.     T_BINARY      =3;
  1597.  
  1598.     /* ping error codes */
  1599.     PINGREPLY     =-1;   /* host does not reply */
  1600.     PINGSOCKET    =-3;   /* unable to obtain socket */
  1601.     PINGPROTO     =-4;   /* unknown protcol ICMP */
  1602.     PINGSEND      =-5;   /* send failed */
  1603.     PINGRECV      =-6;   /* recv failed */
  1604.     PINGHOST      =-7;   /* can't resolve the host name */
  1605.  
  1606. Procedure TFTP.FTPError(Err:TFTPError);
  1607. Var Desc:String;
  1608. Begin
  1609.      Case Err Of
  1610.         ftpUnknownService:Desc:='Unknown service';
  1611.         ftpUnkownHost:Desc:='Unknown host';
  1612.         ftpSocketError:Desc:='Unable to obtain socket';
  1613.         ftpCannotConnect:Desc:='Unable to connect to server';
  1614.         ftpLoginFailed:Desc:='Login failed';
  1615.         ftpTransferAborted:Desc:='Transfer aborted';
  1616.         ftpCannotOpenFile:Desc:='Problem openning local file';
  1617.         ftpConnectionError:Desc:='Problem initializing data connection';
  1618.         fptCommandFailed:Desc:='Command failed';
  1619.         ftpProxyError:Desc:='Proxy server does not support third party transfers';
  1620.         ftpNoPrimaryProxy:Desc:='No primary connection for proxy transfer';
  1621.         ftpNoTranslateTable:Desc:='No code page translation table was loded';
  1622.         Else Desc:='Unkown FTP error';
  1623.      End; //case
  1624.      If FOnError<>Nil Then FOnError(Self,Err,Desc);
  1625. End;
  1626.  
  1627. Function TFTP.GetFTPError:TFTPError;
  1628. Var Value:LongInt;
  1629. Begin
  1630.   Value:=Fftp_errno;
  1631.   Case Value Of
  1632.     FTPSERVICE:Result:=ftpUnknownService;
  1633.     FTPHOST:Result:=ftpUnkownHost;
  1634.     FTPSOCKET:Result:=ftpSocketError;
  1635.     FTPCONNECT:Result:=ftpCannotConnect;
  1636.     FTPLOGIN:Result:=ftpLoginFailed;
  1637.     FTPABORT:Result:=ftpTransferAborted;
  1638.     FTPLOCALFILE:Result:=ftpCannotOpenFile;
  1639.     FTPDATACONN:Result:=ftpConnectionError;
  1640.     FTPCOMMAND:Result:=fptCommandFailed;
  1641.     FTPPROXYTHIRD:Result:=ftpProxyError;
  1642.     FTPNOPRIMARY:Result:=ftpNoPrimaryProxy;
  1643.     FTPNOXLATETBL:Result:=ftpNoTranslateTable;
  1644.     Else Result:=ftpOther;
  1645.   End;
  1646. End;
  1647.  
  1648. Function TFTP.GetPassWord:String;
  1649. Begin
  1650.    If FPassWord<>Nil Then Result:=FPassWord^
  1651.    Else Result:='';
  1652. End;
  1653.  
  1654. Procedure TFTP.SetPassWord(NewValue:String);
  1655. Begin
  1656.    If FPassWord<>Nil Then FreeMem(FPassWord,length(FPassWord^)+1);
  1657.    GetMem(FPassWord,length(NewValue)+1);
  1658.    FPassWord^:=NewValue;
  1659. End;
  1660.  
  1661. Function TFTP.GetRemoteHost:String;
  1662. Begin
  1663.    If FRemoteHost<>Nil Then Result:=FRemoteHost^
  1664.    Else Result:='';
  1665. End;
  1666.  
  1667. Procedure TFTP.SetRemoteHost(NewValue:String);
  1668. Begin
  1669.    If FRemoteHost<>Nil Then FreeMem(FRemoteHost,length(FRemoteHost^)+1);
  1670.    GetMem(FRemoteHost,length(NewValue)+1);
  1671.    FRemoteHost^:=NewValue;
  1672. End;
  1673.  
  1674. Function TFTP.GetRemoteAccount:String;
  1675. Begin
  1676.    If FRemoteAccount<>Nil Then Result:=FRemoteAccount^
  1677.    Else Result:='';
  1678. End;
  1679.  
  1680. Procedure TFTP.SetRemoteAccount(NewValue:String);
  1681. Begin
  1682.    If FRemoteAccount<>Nil Then FreeMem(FRemoteAccount,length(FRemoteAccount^)+1);
  1683.    GetMem(FRemoteAccount,length(NewValue)+1);
  1684.    FRemoteAccount^:=NewValue;
  1685. End;
  1686.  
  1687. Function TFTP.GetUserID:String;
  1688. Begin
  1689.     If FUserId<>Nil Then Result:=FUserId^
  1690.     Else Result:='';
  1691. End;
  1692.  
  1693. Procedure TFTP.SetUserID(NewValue:String);
  1694. Begin
  1695.     If FUserId<>Nil Then FreeMem(FUserId,length(FUserId^)+1);
  1696.     GetMem(FUserId,length(NewValue)+1);
  1697.     FUserId^:=NewValue;
  1698. End;
  1699.  
  1700. Procedure TFTP.SetupComponent;
  1701. Var C,DLLName:CString;
  1702. Begin
  1703.    Inherited SetupComponent;
  1704.    Name:='FTP';
  1705.    RemoteHost:='127.0.0.1';
  1706.    TransferMode:=ftpBinary;
  1707.  
  1708.    DllName:='FTPAPI';
  1709.    {$IFDEF OS2}
  1710.    If DosLoadModule(C,255,DllName,FDllHandle)<>0 Then
  1711.    Begin
  1712.         FDLLHandle:=0;
  1713.         If ComponentState * [csWriting,csDesigning] = [] Then
  1714.         Begin
  1715.            If ApplicationType=1 Then ErrorBox('DLL not found: FTPAPI.DLL !')
  1716.            Else Writeln('DLL not found: FTPAPI.DLL !');
  1717.         End;
  1718.         Exit;
  1719.    End;
  1720.    {$ENDIF}
  1721.    {$IFDEF WIN32}
  1722.    If ComponentState * [csWriting,csDesigning] = []
  1723.      Then ErrorBox('TFTP currently not supported for Win32 !');
  1724.    Exit;
  1725.    {$ENDIF}
  1726.    Try
  1727.       Fftplogoff:=Pointer(GetProcAddr(FDllHandle,'FTPLOGOFF'));
  1728.       Fftpget:=Pointer(GetProcAddr(FDllHandle,'FTPGET'));
  1729.       Fftpput:=Pointer(GetProcAddr(FDllHandle,'FTPPUT'));
  1730.       Fftpappend:=Pointer(GetProcAddr(FDllHandle,'FTPAPPEND'));
  1731.       Fftpputunique:=(GetProcAddr(FDllHandle,'FTPPUTUNIQUE'));
  1732.       Fftpcd:=(GetProcAddr(FDllHandle,'FTPCD'));
  1733.       Fftpmkd:=(GetProcAddr(FDllHandle,'FTPMKD'));
  1734.       Fftprmd:=(GetProcAddr(FDllHandle,'FTPRMD'));
  1735.       Fftpdelete:=(GetProcAddr(FDllHandle,'FTPDELETE'));
  1736.       Fftprename:=(GetProcAddr(FDllHandle,'FTPRENAME'));
  1737.       Fftpls:=(GetProcAddr(FDllHandle,'FTPLS'));
  1738.       Fftpdir:=(GetProcAddr(FDllHandle,'FTPDIR'));
  1739.       Fftpquote:=(GetProcAddr(FDllHandle,'FTPQUOTE'));
  1740.       Fftpping:=(GetProcAddr(FDllHandle,'FTPPING'));
  1741.       Fftppwd:=(GetProcAddr(FDllHandle,'FTPPWD'));
  1742.       Fftpsys:=(GetProcAddr(FDllHandle,'FTPSYS'));
  1743.       Fftpver:=(GetProcAddr(FDllHandle,'FTPVER'));
  1744.       FftpWindow:=(GetProcAddr(FDllHandle,'FTPWINDOW'));
  1745.       Fftp_errno:=(GetProcAddr(FDllHandle,'FTP_ERRNO'));
  1746.  
  1747.       If ApplicationType=1 Then
  1748.       Begin
  1749.          FNotifyControl:=TFTPNotifyControl.Create(Self);
  1750.          TFTPNotifyControl(FNotifyControl).FFTP:=Self;
  1751.          TFTPNotifyControl(FNotifyControl).CreateWnd;
  1752.       End;
  1753.  
  1754.       If FNotifyControl<>Nil Then FftpWindow(FNotifyControl.Handle);  //start FTP services
  1755.    Except
  1756.       {$IFDEF OS2}
  1757.       DosFreeModule(FDLLHandle);
  1758.       {$ENDIF}
  1759.       FDLLHandle:=0;
  1760.       ON E:EProcAddrError Do
  1761.       Begin
  1762.          If ComponentState * [csWriting,csDesigning] = [] Then
  1763.          Begin
  1764.            If ApplicationType=1 Then ErrorBox('Cannot retrieve procedure from FTPAPI:'+E.Message+' !')
  1765.            Else Writeln('Cannot retrieve procedure from FTPAPI:'+E.Message+' !');
  1766.          End;
  1767.       End;
  1768.       Else Raise;
  1769.    End;
  1770. End;
  1771.  
  1772. Function TFTP.GetRemoteDirName:String;
  1773. Var C:CString;
  1774. Begin
  1775.     Result:='';
  1776.     If FDLLHandle=0 Then exit
  1777.     Else If not FConnected Then exit
  1778.     Else
  1779.     Begin
  1780.         If Fftppwd(RemoteHost,UserId,Password,RemoteAccount,C,250)=0 Then Result:=C
  1781.         Else
  1782.         Begin
  1783.             Result:='';
  1784.             FTPError(GetFTPError);
  1785.         End;
  1786.     End;
  1787. End;
  1788.  
  1789. Procedure TFTP.SetRemoteDirName(NewValue:String);
  1790. Begin
  1791.     If FDLLHandle=0 Then exit
  1792.     Else If not Connected Then
  1793.     Begin
  1794.         FTPError(ftpNotConnected);
  1795.         exit;
  1796.     End
  1797.     Else
  1798.     Begin
  1799.         If Fftpcd(RemoteHost,UserId,Password,RemoteAccount,NewValue)<>0 Then
  1800.           FTPError(GetFTPError);
  1801.     End;
  1802. End;
  1803.  
  1804. Procedure SystemAssign(Var f:File;Const Name:String);
  1805. Begin
  1806.     System.Assign(f,Name);
  1807. End;
  1808.  
  1809. Function TFTP.GetRemoteDir(Const Pattern:String;Dir:TStrings;Options:TFTPDirOptions):TFTPError;
  1810. Var Res:LongInt;
  1811.     TempFile,s:String;
  1812.     f:TEXT;
  1813. Begin
  1814.     If FDLLHandle=0 Then Result:=ftpOther
  1815.     Else If not Connected Then Result:=ftpNotConnected
  1816.     Else
  1817.     Begin
  1818.          TempFile:=GetTempFileName;
  1819.          Dir.Clear;
  1820.          If Options=ftpDirShort Then
  1821.            Res:=Fftpls(RemoteHost,UserId,Password,RemoteAccount,TempFile,Pattern)
  1822.          Else
  1823.            Res:=Fftpdir(RemoteHost,UserId,Password,RemoteAccount,TempFile,Pattern);
  1824.          If Res<>0 Then Result:=GetFTPError
  1825.          Else
  1826.          Begin
  1827.              Result:=ftpOk;
  1828.              SystemAssign(f,TempFile);
  1829.              {$I-}
  1830.              Reset(f);
  1831.              {$I+}
  1832.              If IoResult<>0 Then Result:=ftpOther
  1833.              Else While not Eof(f) Do
  1834.              Begin
  1835.                   {$I-}
  1836.                   Readln(f,s);
  1837.                   {$I+}
  1838.                   If IoResult<>0 Then Break;
  1839.                   Dir.Add(s);
  1840.              End;
  1841.              {$I-}
  1842.              Close(f);
  1843.              {$I+}
  1844.          End;
  1845.          {$I-}
  1846.          SystemAssign(f,TempFile);
  1847.          Erase(f);
  1848.          {$I+}
  1849.     End;
  1850.     If Result<>ftpOk Then FTPError(Result);
  1851. End;
  1852.  
  1853. Function TFTP.Connect:TFTPError;
  1854. Begin
  1855.    If FDLLHandle=0 Then Result:=ftpOther
  1856.    Else If Connected Then Result:=ftpOk
  1857.    Else
  1858.    Begin
  1859.       If Fftpcd(RemoteHost,UserId,Password,RemoteAccount,'.')<>0 Then Result:=GetFTPError
  1860.       Else Result:=ftpOk;
  1861.       FConnected:=Result=ftpOk;
  1862.    End;
  1863.    If Result<>ftpOk Then FTPError(Result);
  1864. End;
  1865.  
  1866. Procedure TFTP.Disconnect;
  1867. Begin
  1868.     If not FConnected Then exit;
  1869.     If FDLLHandle=0 Then exit;
  1870.     FConnected:=False;
  1871. End;
  1872.  
  1873. Procedure TFTP.SetConnected(NewValue:Boolean);
  1874. Begin
  1875.      If NewValue Then Connect
  1876.      Else Disconnect;
  1877. End;
  1878.  
  1879. Destructor TFTP.Destroy;
  1880. Begin
  1881.     Disconnect;
  1882.     If FPassWord<>Nil Then FreeMem(FPassWord,length(FPassWord^)+1);
  1883.     If FRemoteHost<>Nil Then FreeMem(FRemoteHost,length(FRemoteHost^)+1);
  1884.     If FRemoteAccount<>Nil Then FreeMem(FRemoteAccount,length(FRemoteAccount^)+1);
  1885.     If FUserId<>Nil Then FreeMem(FUserId,length(FUserId^)+1);
  1886.     If FNotifyControl<>Nil Then FNotifyControl.Destroy;
  1887.     FNotifyControl:=Nil;
  1888.     If FDllHandle<>0 Then
  1889.     Begin
  1890.        {$IFDEF OS2}
  1891.        DosFreeModule(FDLLHandle);
  1892.        {$ENDIF}
  1893.        FDLLHandle:=0;
  1894.     End;
  1895.     Inherited Destroy;
  1896. End;
  1897.  
  1898. Function TFTP.GetVersion:String;
  1899. Var C:CString;
  1900. Begin
  1901.      If FDLLHandle=0 Then exit;
  1902.      Fftpver(C,250);
  1903.      Result:=C;
  1904. End;
  1905.  
  1906. Function TFTP.DeleteRemoteFile(Const FileName:String):TFTPError;
  1907. Begin
  1908.      If FDLLHandle=0 Then Result:=ftpOther
  1909.      Else If not Connected Then Result:=ftpNotConnected
  1910.      Else
  1911.      Begin
  1912.           If FftpDelete(RemoteHost,UserId,Password,RemoteAccount,FileName)=0 Then Result:=ftpOk
  1913.           Else Result:=GetFTPError;
  1914.      End;
  1915.      If Result<>ftpOk Then FTPError(Result);
  1916. End;
  1917.  
  1918. Function TFTP.RenameRemoteFile(Const OldName,NewName:String):TFTPError;
  1919. Begin
  1920.      If FDLLHandle=0 Then Result:=ftpOther
  1921.      Else If not Connected Then Result:=ftpNotConnected
  1922.      Else
  1923.      Begin
  1924.           If FftpRename(RemoteHost,UserId,Password,RemoteAccount,OldName,NewName)=0 Then Result:=ftpOk
  1925.           Else Result:=GetFTPError;
  1926.      End;
  1927.      If Result<>ftpOk Then FTPError(Result);
  1928. End;
  1929.  
  1930. Function TFTP.MakeRemoteDir(Const DirName:String):TFTPError;
  1931. Begin
  1932.      If FDLLHandle=0 Then Result:=ftpOther
  1933.      Else If not Connected Then Result:=ftpNotConnected
  1934.      Else
  1935.      Begin
  1936.           If Fftpmkd(RemoteHost,UserId,Password,RemoteAccount,DirName)=0 Then Result:=ftpOk
  1937.           Else Result:=GetFTPError;
  1938.      End;
  1939.      If Result<>ftpOk Then FTPError(Result);
  1940. End;
  1941.  
  1942. Function TFTP.RemoveRemoteDir(Const DirName:String):TFTPError;
  1943. Begin
  1944.      If FDLLHandle=0 Then Result:=ftpOther
  1945.      Else If not Connected Then Result:=ftpNotConnected
  1946.      Else
  1947.      Begin
  1948.           If Fftprmd(RemoteHost,UserId,Password,RemoteAccount,DirName)=0 Then Result:=ftpOk
  1949.           Else Result:=GetFTPError;
  1950.      End;
  1951.      If Result<>ftpOk Then FTPError(Result);
  1952. End;
  1953.  
  1954. Function TFTP.AppendToRemoteFile(Const RemoteFileName,LocalFileName:String):TFTPError;
  1955. Var tt:LongInt;
  1956. Begin
  1957.      If FDLLHandle=0 Then Result:=ftpOther
  1958.      Else If not Connected Then Result:=ftpNotConnected
  1959.      Else
  1960.      Begin
  1961.           If TransferMode=ftpAscii Then tt:=T_ASCII
  1962.           Else tt:=T_BINARY;
  1963.           If Fftpappend(RemoteHost,UserId,Password,RemoteAccount,
  1964.                         LocalFileName,RemoteFileName,tt)=0 Then Result:=ftpOk
  1965.           Else Result:=GetFTPError;
  1966.      End;
  1967.      If Result<>ftpOk Then FTPError(Result);
  1968. End;
  1969.  
  1970. Function TFTP.GetRemoteFile(Const RemoteFileName,LocalFileName:String):TFTPError;
  1971. Var tt:LongInt;
  1972. Begin
  1973.      If FDLLHandle=0 Then Result:=ftpOther
  1974.      Else If not Connected Then Result:=ftpNotConnected
  1975.      Else
  1976.      Begin
  1977.           If TransferMode=ftpAscii Then tt:=T_ASCII
  1978.           Else tt:=T_BINARY;
  1979.           If Fftpget(RemoteHost,UserId,Password,RemoteAccount,
  1980.                      LocalFileName,RemoteFileName,'w',tt)=0 Then Result:=ftpOk
  1981.           Else Result:=GetFTPError;
  1982.      End;
  1983.      If Result<>ftpOk Then FTPError(Result);
  1984. End;
  1985.  
  1986. Function TFTP.PutLocalFile(Const LocalFileName,RemoteFileName:String):TFTPError;
  1987. Var tt:LongInt;
  1988. Begin
  1989.      If FDLLHandle=0 Then Result:=ftpOther
  1990.      Else If not Connected Then Result:=ftpNotConnected
  1991.      Else
  1992.      Begin
  1993.           If TransferMode=ftpAscii Then tt:=T_ASCII
  1994.           Else tt:=T_BINARY;
  1995.           If Fftpput(RemoteHost,UserId,Password,RemoteAccount,
  1996.                     LocalFileName,RemoteFileName,tt)=0 Then Result:=ftpOk
  1997.           Else Result:=GetFTPError;
  1998.      End;
  1999.      If Result<>ftpOk Then FTPError(Result);
  2000. End;
  2001.  
  2002. Function TFTP.PutUniqueLocalFile(Const LocalFileName,RemoteFileName:String):TFTPError;
  2003. Var tt:LongInt;
  2004. Begin
  2005.      If FDLLHandle=0 Then Result:=ftpOther
  2006.      Else If not Connected Then Result:=ftpNotConnected
  2007.      Else
  2008.      Begin
  2009.           If TransferMode=ftpAscii Then tt:=T_ASCII
  2010.           Else tt:=T_BINARY;
  2011.           If Fftpputunique(RemoteHost,UserId,Password,RemoteAccount,
  2012.                            LocalFileName,RemoteFileName,tt)=0 Then Result:=ftpOk
  2013.           Else Result:=GetFTPError;
  2014.      End;
  2015.      If Result<>ftpOk Then FTPError(Result);
  2016. End;
  2017.  
  2018. Function TFTP.Quote(Const ftpstring:String):TFTPError;
  2019. Begin
  2020.      If FDLLHandle=0 Then Result:=ftpOther
  2021.      Else If not Connected Then Result:=ftpNotConnected
  2022.      Else
  2023.      Begin
  2024.           If Fftpquote(RemoteHost,UserId,Password,RemoteAccount,ftpString)=0 Then Result:=ftpOk
  2025.           Else Result:=GetFTPError;
  2026.      End;
  2027.      If Result<>ftpOk Then FTPError(Result);
  2028. End;
  2029.  
  2030. Function TFTP.GetSystem:String;
  2031. Var C:CString;
  2032. Begin
  2033.      If FDLLHandle=0 Then Result:=''
  2034.      Else If not Connected Then
  2035.      Begin
  2036.           Result:='';
  2037.           FTPError(ftpNotConnected);
  2038.      End
  2039.      Else
  2040.      Begin
  2041.           If Fftpsys(RemoteHost,UserId,Password,RemoteAccount,C,250)=0 Then Result:=C
  2042.           Else
  2043.           Begin
  2044.                Result:='';
  2045.                FTPError(GetFTPError);
  2046.           End;
  2047.      End;
  2048. End;
  2049.  
  2050. Function TFTP.Ping(Const HostName:String;PacketLen:LongInt;
  2051.                    Var Address:LongWord;Var Milliseconds:LongInt):TFTPPingResult;
  2052. Begin
  2053.      If FDLLHandle=0 Then Result:=ftpPingOther
  2054.      Else
  2055.      Begin
  2056.          Milliseconds:=FftpPing(HostName,PacketLen,Address);
  2057.          If Milliseconds<0 Then
  2058.          Begin
  2059.             Case Milliseconds Of
  2060.                PINGREPLY:Result:=ftpPingHostDoesNotReply;
  2061.                PINGSOCKET:Result:=ftpPingSocketError;
  2062.                PINGPROTO:Result:=ftpPingUnkownProtocol;
  2063.                PINGSEND:Result:=ftpPingSendFailed;
  2064.                PINGRECV:Result:=ftpPingReceiveFailed;
  2065.                PINGHOST:Result:=ftpPingUnkownHost;
  2066.                Else Result:=ftpPingOther;
  2067.             End; //case
  2068.          End
  2069.          Else Result:=ftpPingOk;
  2070.      End;
  2071. End;
  2072.  
  2073. {
  2074. ╔═══════════════════════════════════════════════════════════════════════════╗
  2075. ║                                                                           ║
  2076. ║ Speed-Pascal/2 Version 2.0                                                ║
  2077. ║                                                                           ║
  2078. ║ Speed-Pascal Component Classes (SPCC)                                     ║
  2079. ║                                                                           ║
  2080. ║ This section: TTCP Class Implementation                                   ║
  2081. ║                                                                           ║
  2082. ║ Last Modified: September 1995                                             ║
  2083. ║                                                                           ║
  2084. ║ (C) 1995 SpeedSoft. All rights reserved. Disclosure probibited !          ║
  2085. ║                                                                           ║
  2086. ╚═══════════════════════════════════════════════════════════════════════════╝
  2087. }
  2088.  
  2089. Const
  2090.     INADDR_ANY              =$00000000;
  2091.  
  2092.      /* Address families. */
  2093. Const
  2094.      AF_UNSPEC       =0;               /* unspecified */
  2095.      AF_UNIX         =1;               /* local to host (pipes, portals) */
  2096.      AF_INET         =2;               /* internetwork: UDP, TCP, etc. */
  2097.      AF_IMPLINK      =3;               /* arpanet imp addresses */
  2098.      AF_PUP          =4;               /* pup protocols: e.g. BSP */
  2099.      AF_CHAOS        =5;               /* mit CHAOS protocols */
  2100.      AF_NS           =6;               /* XEROX NS protocols */
  2101.      AF_NBS          =7;               /* nbs protocols */
  2102.      AF_ECMA         =8;               /* european computer manufacturers */
  2103.      AF_DATAKIT      =9;               /* datakit protocols */
  2104.      AF_CCITT        =10;              /* CCITT protocols, X.25 etc */
  2105.      AF_SNA          =11;              /* IBM SNA */
  2106.      AF_DECnet       =12;              /* DECnet */
  2107.      AF_DLI          =13;              /* Direct data link interface */
  2108.      AF_LAT          =14;              /* LAT */
  2109.      AF_HYLINK       =15;              /* NSC Hyperchannel */
  2110.      AF_APPLETALK    =16;              /* Apple Talk */
  2111.  
  2112.      AF_MAX          =17;
  2113.  
  2114.     /* Protocol families, same as address families for now. */
  2115. Const
  2116.      PF_UNSPEC       =AF_UNSPEC;
  2117.      PF_UNIX         =AF_UNIX;
  2118.      PF_INET         =AF_INET;
  2119.      PF_IMPLINK      =AF_IMPLINK;
  2120.      PF_PUP          =AF_PUP;
  2121.      PF_CHAOS        =AF_CHAOS;
  2122.      PF_NS           =AF_NS;
  2123.      PF_NBS          =AF_NBS;
  2124.      PF_ECMA         =AF_ECMA;
  2125.      PF_DATAKIT      =AF_DATAKIT;
  2126.      PF_CCITT        =AF_CCITT;
  2127.      PF_SNA          =AF_SNA;
  2128.      PF_DECnet       =AF_DECnet;
  2129.      PF_DLI          =AF_DLI;
  2130.      PF_LAT          =AF_LAT;
  2131.      PF_HYLINK       =AF_HYLINK;
  2132.      PF_APPLETALK    =AF_APPLETALK;
  2133.  
  2134.      PF_MAX          =AF_MAX;
  2135.  
  2136. Const
  2137.      SOCK_STREAM     =1;               /* stream socket */
  2138.      SOCK_DGRAM      =2;               /* datagram socket */
  2139.      SOCK_RAW        =3;               /* raw-protocol interface */
  2140.      SOCK_RDM        =4;               /* reliably-delivered message */
  2141.      SOCK_SEQPACKET  =5;               /* sequenced packet stream */
  2142.  
  2143.      MSG_PEEK        =2;
  2144.  
  2145. Type
  2146.     sockaddr=Record
  2147.                    sa_family:WORD;              /* address family */
  2148.                    sa_data:CSTRING[13];         /* up to 14 bytes of direct address */
  2149.     End;
  2150.  
  2151.     PCharArray=^TCharArray;
  2152.     TCharArray=Array[0..0] Of PChar;
  2153.  
  2154.     hostent=Record
  2155.        h_name:PChar;             /* official name of host */
  2156.        h_aliases:PCharArray;     /* alias list */
  2157.        h_addrtype:LongInt;       /* host address type */
  2158.        h_length:LongInt;         /* length of address */
  2159.        h_addr_list:PCharArray;   /* list of addresses from name server */
  2160.        //h_addr  h_addr_list[0]  /* address, for backward compatiblity */
  2161.     End;
  2162.     phostent=^hostent;
  2163.  
  2164.     in_addr=Record
  2165.        s_addr:LongWord;
  2166.     End;
  2167.  
  2168.     sockaddr_in=Record
  2169.         sin_family:SmallInt;
  2170.         sin_port:Word;
  2171.         sin_addr:in_addr;
  2172.         sin_zero:Array[0..7] Of Char;
  2173.     End;
  2174.  
  2175.  
  2176. Procedure TTCP.SetupComponent;
  2177. Var C,DLLName:CString;
  2178. Begin
  2179.    Inherited SetupComponent;
  2180.    Name:='TCP';
  2181.    LocalPort:=1024;
  2182.    LocalAddress:=INADDR_ANY;
  2183.    QueueLength:=1;
  2184.    FSockMode:=SOCK_STREAM;
  2185.    FState:=sckClosed;
  2186.  
  2187.    DllName:='SO32DLL';
  2188.    {$IFDEF OS2}
  2189.    If DosLoadModule(C,255,DllName,FDllHandle)<>0 Then
  2190.    Begin
  2191.         FDLLHandle:=0;
  2192.         If ComponentState * [csWriting,csDesigning] = [] Then
  2193.         Begin
  2194.           If ApplicationType=1 Then ErrorBox('DLL not found: SO32DLL.DLL !')
  2195.           Else Writeln('DLL not found: SO32DLL.DLL !');
  2196.         End;
  2197.         Exit;
  2198.    End;
  2199.    DllName:='TCP32DLL';
  2200.    If DosLoadModule(C,255,DllName,FTCPDllHandle)<>0 Then
  2201.    Begin
  2202.         {$IFDEF OS2}
  2203.         DosFreeModule(FDLLHandle);
  2204.         {$ENDIF}
  2205.         FDLLHandle:=0;
  2206.         FTCPDLLHandle:=0;
  2207.         If ComponentState * [csWriting,csDesigning] = [] Then
  2208.         Begin
  2209.           If ApplicationType=1 Then ErrorBox('DLL not found: TCP32DLL.DLL !')
  2210.           Else Writeln('DLL not found: TCP32DLL.DLL !');
  2211.         End;
  2212.         Exit;
  2213.    End;
  2214.    {$ENDIF}
  2215.    {$IFDEF WIN32}
  2216.    If ComponentState * [csWriting,csDesigning] = []
  2217.      Then ErrorBox('TTCP currently not supported for Win32 !');
  2218.    Exit;
  2219.    {$ENDIF}
  2220.    Try
  2221.       FAccept:=Pointer(GetProcAddr(FDllHandle,'ACCEPT'));
  2222.       FSock_Init:=Pointer(GetProcAddr(FDllHandle,'SOCK_INIT'));
  2223.       FSoClose:=Pointer(GetProcAddr(FDllHandle,'SOCLOSE'));
  2224.       FBind:=Pointer(GetProcAddr(FDllHandle,'BIND'));
  2225.       FConnect:=Pointer(GetProcAddr(FDllHandle,'CONNECT'));
  2226.       FGethostid:=Pointer(GetProcAddr(FDllHandle,'GETHOSTID'));
  2227.       FGetpeername:=Pointer(GetProcAddr(FDllHandle,'GETPEERNAME'));
  2228.       FGetsockname:=Pointer(GetProcAddr(FDllHandle,'GETSOCKNAME'));
  2229.       FGetsockopt:=Pointer(GetProcAddr(FDllHandle,'GETSOCKOPT'));
  2230.       Fioctl:=Pointer(GetProcAddr(FDllHandle,'IOCTL'));
  2231.       FListen:=Pointer(GetProcAddr(FDllHandle,'LISTEN'));
  2232.       Frecvmsg:=Pointer(GetProcAddr(FDllHandle,'RECVMSG'));
  2233.       Frecv:=Pointer(GetProcAddr(FDllHandle,'RECV'));
  2234.       Frecvfrom:=Pointer(GetProcAddr(FDllHandle,'RECVFROM'));
  2235.       Fselect:=Pointer(GetProcAddr(FDllHandle,'SELECT'));
  2236.       Fsend:=Pointer(GetProcAddr(FDllHandle,'SEND'));
  2237.       Fsendmsg:=Pointer(GetProcAddr(FDllHandle,'SENDMSG'));
  2238.       Fsendto:=Pointer(GetProcAddr(FDllHandle,'SENDTO'));
  2239.       Fsetsockopt:=Pointer(GetProcAddr(FDllHandle,'SETSOCKOPT'));
  2240.       Fsock_errno:=Pointer(GetProcAddr(FDllHandle,'SOCK_ERRNO'));
  2241.       Fpsock_errno:=Pointer(GetProcAddr(FDllHandle,'PSOCK_ERRNO'));
  2242.       FSocket:=Pointer(GetProcAddr(FDllHandle,'SOCKET'));
  2243.       Fsoabort:=Pointer(GetProcAddr(FDllHandle,'SOABORT'));
  2244.       Fso_cancel:=Pointer(GetProcAddr(FDllHandle,'SO_CANCEL'));
  2245.       Freadv:=Pointer(GetProcAddr(FDllHandle,'READV'));
  2246.       Fwritev:=Pointer(GetProcAddr(FDllHandle,'WRITEV'));
  2247.       Fshutdown:=Pointer(GetProcAddr(FDllHandle,'SHUTDOWN'));
  2248.       Fgetinetversion:=Pointer(GetProcAddr(FDllHandle,'GETINETVERSION'));
  2249.  
  2250.       FINet_Addr:=Pointer(GetProcAddr(FTCPDllHandle,'INET_ADDR'));
  2251.       Fgethostbyname:=Pointer(GetProcAddr(FTCPDllHandle,'GETHOSTBYNAME'));
  2252.       FBswap:=Pointer(GetProcAddr(FTCPDllHandle,'BSWAP'));
  2253.       Fgethostname:=Pointer(GetProcAddr(FTCPDllHandle,'GETHOSTNAME'));
  2254.  
  2255.       FSock_Init;
  2256.    Except
  2257.       {$IFDEF OS2}
  2258.       DosFreeModule(FDLLHandle);
  2259.       {$ENDIF}
  2260.       FDLLHandle:=0;
  2261.       {$IFDEF OS2}
  2262.       DosFreeModule(FTCPDLLHandle);
  2263.       {$ENDIF}
  2264.       FTCPDLLHandle:=0;
  2265.       ON E:EProcAddrError Do
  2266.       Begin
  2267.          If ComponentState * [csWriting,csDesigning] = [] Then
  2268.          Begin
  2269.            If ApplicationType=1 Then ErrorBox('Cannot retrieve procedure from SO32DLL or TCP32DLL:'+E.Message+' !')
  2270.            Else Writeln('Cannot retrieve procedure from SO32DLL or TCP32DLL:'+E.Message+' !');
  2271.          End;
  2272.       End;
  2273.       Else Raise;
  2274.    End;
  2275. End;
  2276.  
  2277. Procedure TTCP.Close;
  2278. Begin
  2279.     If FDLLHandle<>0 Then
  2280.     Begin
  2281.         If FInSocket<>0 Then FSoClose(FInSocket);
  2282.         FInSocket:=0;
  2283.         If FOutSocket<>0 Then FSoClose(FOutSocket);
  2284.         FOutSocket:=0;
  2285.         If FAcceptSocket<>0 Then FSoClose(FAcceptSocket);
  2286.         FAcceptSocket:=0;
  2287.     End;
  2288.     FConnected:=False;
  2289.     FState:=sckClosed;
  2290. End;
  2291.  
  2292. Destructor TTCP.Destroy;
  2293. Begin
  2294.     Close;
  2295.  
  2296.     If FDllHandle<>0 Then
  2297.     Begin
  2298.        {$IFDEF OS2}
  2299.        DosFreeModule(FDLLHandle);
  2300.        {$ENDIF}
  2301.        FDLLHandle:=0;
  2302.     End;
  2303.     If FTCPDllHandle<>0 Then
  2304.     Begin
  2305.        {$IFDEF OS2}
  2306.        DosFreeModule(FTCPDLLHandle);
  2307.        {$ENDIF}
  2308.        FTCPDLLHandle:=0;
  2309.     End;
  2310.     Inherited Destroy;
  2311. End;
  2312.  
  2313. Procedure TTCP.Listen; //Server starts this to listen for connection requests
  2314. Var Server,Server1:sockaddr_in;
  2315.     nameLen:LongInt;
  2316. Begin
  2317.     If FDllHandle=0 Then exit;
  2318.  
  2319.     If FInSocket=0 Then
  2320.     Begin
  2321.        /* Request a socket */
  2322.        FInSocket:=Fsocket(PF_INET, FSockMode, 0);
  2323.        If FInSocket<0 Then //Error
  2324.        Begin
  2325.           FErrorCode:=Fsock_errno;
  2326.           TCPError(FErrorCode);
  2327.           exit;
  2328.        End
  2329.        Else FErrorCode:=0;
  2330.  
  2331.        /* Bind the socket to the server address.*/
  2332.        FillChar(Server,sizeof(Server),0);
  2333.        Server.sin_family := AF_INET;
  2334.        Server.sin_port   := FBswap(LocalPort);
  2335.        Server.sin_addr.s_addr := LocalAddress;
  2336.  
  2337.        If Fbind(FInSocket,Server,sizeof(Server)) < 0 Then
  2338.        Begin //Error
  2339.           FErrorCode:=Fsock_errno;
  2340.           TCPError(FErrorCode);
  2341.           exit;
  2342.        End
  2343.        Else
  2344.        Begin
  2345.           FErrorCode:=0;
  2346.           //Find out what port is really assigned
  2347.           FillChar(Server1,sizeof(Server1),0);
  2348.           NameLen:=sizeof(Server1);
  2349.           If FGetSockName(FOutSocket,Server1,NameLen)=0 Then
  2350.             FLocalPort:=Fbswap(server1.sin_port);
  2351.        End;
  2352.     End;
  2353.  
  2354.     /* Listen for connections */
  2355.     FState:=sckListening;
  2356.     If Flisten(FInSocket,QueueLength)<>0 Then //Error
  2357.     Begin
  2358.         FErrorCode:=Fsock_errno;
  2359.         TCPError(FErrorCode);
  2360.         exit;
  2361.     End
  2362.     Else FErrorCode:=0;
  2363.  
  2364.     //Listen returns if connection attempt is made by client
  2365. End;
  2366.  
  2367. Function TTCP.INetAddressFromName(Const Name:String):LongWord;
  2368. Begin
  2369.     If FDLLHandle=0 Then exit;
  2370.     Result:=FINet_Addr(Name);
  2371. End;
  2372.  
  2373. Procedure TTCP.Connect(Const RemoteHost:String;RemotePort:LongInt);
  2374. Var hostnm:phostent;
  2375.     Server:sockaddr_in;
  2376.     IP:LongWord;
  2377. Type PLong=^LongWord;
  2378. Begin //Client starts this to connect to a server
  2379.     hostnm := Fgethostbyname(RemoteHost);
  2380.     If hostnm=Nil Then IP:=Finet_addr(RemoteHost)
  2381.     Else IP:=PLong(hostnm^.h_addr_list^[0])^;
  2382.  
  2383.     FillChar(Server,sizeof(Server),0);
  2384.     server.sin_family      := AF_INET;
  2385.     server.sin_port        := FBswap(RemotePort);
  2386.     server.sin_addr.s_addr := IP;
  2387.  
  2388.     If FOutSocket=0 Then
  2389.     Begin
  2390.          /* Get a stream socket. */
  2391.          FOutSocket := Fsocket(PF_INET, FSockMode, 0);
  2392.          If FOutSocket<0 Then //Error
  2393.          Begin
  2394.             FErrorCode:=Fsock_errno;
  2395.             TCPError(FErrorCode);
  2396.             FState:=sckError;
  2397.             exit;
  2398.          End
  2399.          Else FErrorCode:=0;
  2400.     End;
  2401.  
  2402.     /* Connect to the server. */
  2403.     If FConnect(FOutSocket,server,sizeof(server)) < 0 Then
  2404.     Begin //Error
  2405.         FErrorCode:=Fsock_errno;
  2406.         FState:=sckError;
  2407.         TCPError(FErrorCode);
  2408.         exit;
  2409.     End
  2410.     Else
  2411.     Begin
  2412.          FErrorCode:=0;
  2413.          If FOnConnect<>Nil Then FOnConnect(Self);
  2414.          FConnected:=True;
  2415.          FState:=sckConnected;
  2416.     End;
  2417. End;
  2418.  
  2419. Function TTCP.GetLocalHostName:String;
  2420. Var C:CString;
  2421. Begin
  2422.      If FDllHandle=0 Then exit;
  2423.      If Fgethostname(C,255)=0 Then Result:=C
  2424.      Else Result:='';
  2425. End;
  2426.  
  2427. Function TTCP.GetLocalIP:String;
  2428. Var l:LongWord;
  2429. Begin
  2430.      If FDllHandle=0 Then exit;
  2431.      l:=Fgethostid;
  2432.      Result:=tostr(l And 255);
  2433.      l:=l SHR 8;
  2434.      Result:=tostr(l And 255)+'.'+Result;
  2435.      l:=l SHR 8;
  2436.      Result:=tostr(l And 255)+'.'+Result;
  2437.      l:=l SHR 8;
  2438.      Result:=tostr(l And 255)+'.'+Result;
  2439. End;
  2440.  
  2441. Function TTCP.GetLocalPort:LongInt;
  2442. Begin
  2443.      Result:=FLocalPort;
  2444. End;
  2445.  
  2446. Procedure TTCP.SetLocalPort(NewValue:LongInt);
  2447. Begin
  2448.      FLocalPort:=NewValue;
  2449. End;
  2450.  
  2451. Procedure TTCP.Accept(Var PortID:LongInt;Var IP:String);
  2452. Var Client:sockaddr_in;
  2453.     NameLen:LongInt;
  2454.     l:LongWord;
  2455. Begin
  2456.      If FDllHandle=0 Then exit;
  2457.      If FAcceptSocket<>0 Then FSoClose(FAcceptSocket);
  2458.      FAcceptSocket:=0;
  2459.      Namelen:=sizeof(Client);
  2460.      FillChar(Client,sizeof(Client),0);
  2461.      FAcceptSocket:=Faccept(FInSocket,client,namelen);
  2462.      If FAcceptSocket=-1 Then //Error
  2463.      Begin
  2464.         FErrorCode:=Fsock_errno;
  2465.         PortID:=0;
  2466.         IP:='';
  2467.         TCPError(FErrorCode);
  2468.         FState:=sckError;
  2469.         exit;
  2470.      End
  2471.      Else
  2472.      Begin
  2473.          FErrorCode:=0;
  2474.          PortID:=Client.sin_port;
  2475.          l:=Client.sin_addr.s_addr;
  2476.          IP:=tostr(l And 255);
  2477.          l:=l SHR 8;
  2478.          IP:=IP+'.'+tostr(l And 255);
  2479.          l:=l SHR 8;
  2480.          IP:=IP+'.'+tostr(l And 255);
  2481.          l:=l SHR 8;
  2482.          IP:=IP+'.'+tostr(l And 255);
  2483.          If FOnConnectionRequest<>Nil Then FOnConnectionRequest(Self,PortId,IP);
  2484.          FConnected:=True;
  2485.          FState:=sckConnected;
  2486.      End;
  2487. End;
  2488.  
  2489. Procedure TTCP.SendData(Var Buf;BufLen:LongInt);
  2490. Var s:LongWord;
  2491. Begin
  2492.      If FDLLHandle=0 Then exit;
  2493.      If FAcceptSocket<>0 Then s:=FAcceptSocket
  2494.      Else If FOutSocket<>0 Then s:=FOutSocket
  2495.      Else s:=FInSocket;
  2496.  
  2497.      If Fsend(s,Buf,BufLen,0) < 0 Then //Error
  2498.      Begin
  2499.         FErrorCode:=Fsock_errno;
  2500.         TCPError(FErrorCode);
  2501.         exit;
  2502.      End
  2503.      Else
  2504.      Begin
  2505.           FErrorCode:=0;
  2506.           If FOnSendComplete<>Nil Then FOnSendComplete(Self);
  2507.      End;
  2508. End;
  2509.  
  2510. Procedure TTCP.GetData(Var Buf;MaxLen:LongInt;Var Received:LongInt);
  2511. Var s:LongWord;
  2512. Begin
  2513.      If FDLLHandle=0 Then exit;
  2514.      If FAcceptSocket<>0 Then s:=FAcceptSocket
  2515.      Else If FOutSocket<>0 Then s:=FOutSocket
  2516.      Else s:=FInSocket;
  2517.  
  2518.      Received:=Frecv(s,Buf,MaxLen,0);
  2519.      If Received = -1 Then
  2520.      Begin //Error
  2521.         FErrorCode:=Fsock_errno;
  2522.         TCPError(FErrorCode);
  2523.         exit;
  2524.      End
  2525.      Else FErrorCode:=0;
  2526. End;
  2527.  
  2528. Procedure TTCP.PeekData(Var Buf;MaxLen:LongInt;Var Received:LongInt);
  2529. Var s:LongWord;
  2530. Begin
  2531.      If FDLLHandle=0 Then exit;
  2532.      If FAcceptSocket<>0 Then s:=FAcceptSocket
  2533.      Else If FOutSocket<>0 Then s:=FOutSocket
  2534.      Else s:=FInSocket;
  2535.  
  2536.      Received:=Frecv(s,Buf,MaxLen,MSG_PEEK);
  2537.      If Received = -1 Then
  2538.      Begin //Error
  2539.         FErrorCode:=Fsock_errno;
  2540.         TCPError(FErrorCode);
  2541.         exit;
  2542.      End
  2543.      Else FErrorCode:=0;
  2544. End;
  2545.  
  2546. Procedure TTCP.TCPError(Code:LongInt);
  2547. Var s:String;
  2548. Begin
  2549.      Case Code Of
  2550.         SOCEPERM:s:='Not owner';
  2551.         SOCESRCH:s:='No such process';
  2552.         SOCEINTR:s:='Interrupted system call';
  2553.         SOCENXIO:s:='No such device or address';
  2554.         SOCEBADF:s:='Bad file number';
  2555.         SOCEACCES:s:='Permission denied';
  2556.         SOCEFAULT:s:='Bad address';
  2557.         SOCEINVAL:s:='Invalid argument';
  2558.         SOCEMFILE:s:='Too many open files';
  2559.         SOCEPIPE:s:='Broken pipe';
  2560.         SOCEOS2ERR:s:='OS/2 Error';
  2561.         SOCEWOULDBLOCK:s:='Operation would block';
  2562.         SOCEINPROGRESS:s:='Operation now in progress';
  2563.         SOCEALREADY:s:='Operation already in progress';
  2564.         SOCENOTSOCK:s:='Socket operation on non-socket';
  2565.         SOCEDESTADDRREQ:s:='Destination address required';
  2566.         SOCEMSGSIZE:s:='Message too long';
  2567.         SOCEPROTOTYPE:s:='Protocol wrong type for socket';
  2568.         SOCENOPROTOOPT:s:='Protocol not available';
  2569.         SOCEPROTONOSUPPORT:s:='Protocol not supported';
  2570.         SOCESOCKTNOSUPPORT:s:='Socket type not supported';
  2571.         SOCEOPNOTSUPP:s:='Operation not supported on socket';
  2572.         SOCEPFNOSUPPORT:s:='Protocol family not supported';
  2573.         SOCEAFNOSUPPORT:s:='Address family not supported by protocol family';
  2574.         SOCEADDRINUSE:s:='Address already in use';
  2575.         SOCEADDRNOTAVAIL:s:='Can'#39't assign requested address';
  2576.         SOCENETDOWN:s:='Network is down';
  2577.         SOCENETUNREACH:s:='Network is unreachable';
  2578.         SOCENETRESET:s:='Network dropped connection on reset';
  2579.         SOCECONNABORTED:s:='Software caused connection abort';
  2580.         SOCECONNRESET:s:='Connection reset by peer';
  2581.         SOCENOBUFS:s:='No buffer space available';
  2582.         SOCEISCONN:s:='Socket is already connected';
  2583.         SOCENOTCONN:s:='Socket is not connected';
  2584.         SOCESHUTDOWN:s:='Can'#39't send after socket shutdown';
  2585.         SOCETOOMANYREFS:s:='Too many references: can'#39't splice';
  2586.         SOCETIMEDOUT:s:='Connection timed out';
  2587.         SOCECONNREFUSED:s:='Connection refused';
  2588.         SOCELOOP:s:='Too many levels of symbolic links';
  2589.         SOCENAMETOOLONG:s:='File name too long';
  2590.         SOCEHOSTDOWN:s:='Host is down';
  2591.         SOCEHOSTUNREACH:s:='No route to host';
  2592.         SOCENOTEMPTY:s:='Directory not empty';
  2593.         Else s:='Unkown error';
  2594.      End; //case
  2595.      If FOnError<>Nil Then FOnError(Self,Code,s);
  2596. End;
  2597.  
  2598. {
  2599. ╔═══════════════════════════════════════════════════════════════════════════╗
  2600. ║                                                                           ║
  2601. ║ Speed-Pascal/2 Version 2.0                                                ║
  2602. ║                                                                           ║
  2603. ║ Speed-Pascal Component Classes (SPCC)                                     ║
  2604. ║                                                                           ║
  2605. ║ This section: TUDP Class Implementation                                   ║
  2606. ║                                                                           ║
  2607. ║ Last Modified: September 1995                                             ║
  2608. ║                                                                           ║
  2609. ║ (C) 1995 SpeedSoft. All rights reserved. Disclosure probibited !          ║
  2610. ║                                                                           ║
  2611. ╚═══════════════════════════════════════════════════════════════════════════╝
  2612. }
  2613.  
  2614. Procedure TUDP.SetupComponent;
  2615. Begin
  2616.    Inherited SetupComponent;
  2617.    FSockMode:=SOCK_DGRAM;
  2618. End;
  2619.  
  2620. Procedure TUDP.SendTo(Const RemoteHost:String;RemotePort:LongInt;
  2621.                       Var Buf;BufLen:LongInt);
  2622. Var server:sockaddr_in;
  2623.     s:LongWord;
  2624. Begin
  2625.      If FDllHandle=0 Then exit;
  2626.      server.sin_family      := AF_INET;
  2627.      server.sin_port        := FBswap(RemotePort);
  2628.      server.sin_addr.s_addr := Finet_addr(RemoteHost);
  2629.  
  2630.      If FAcceptSocket<>0 Then s:=FAcceptSocket
  2631.      Else If FOutSocket<>0 Then s:=FOutSocket
  2632.      Else If FInSocket<>0 Then s:=FInSocket
  2633.      Else
  2634.      Begin
  2635.           FOutSocket := Fsocket(PF_INET, FSockMode, 0);
  2636.           If FOutSocket<0 Then //Error
  2637.           Begin
  2638.              FErrorCode:=Fsock_errno;
  2639.              TCPError(FErrorCode);
  2640.              exit;
  2641.           End
  2642.           Else FErrorCode:=0;
  2643.           s:=FOutSocket;
  2644.      End;
  2645.      If FSendTo(s,Buf,BufLen,0,Server,Sizeof(Server))=0 Then FErrorCode:=0
  2646.      Else
  2647.      Begin
  2648.           FErrorCode:=Fsock_errno;
  2649.           TCPError(FErrorCode);
  2650.      End;
  2651. End;
  2652.  
  2653. Procedure TUDP.ReceiveFrom(Const RemoteHost:String;RemotePort:LongInt;
  2654.                            Var Buf;BufLen:LongWord);
  2655. Var server:sockaddr_in;
  2656.     s:LongWord;
  2657.     NameLen:LongInt;
  2658. Begin
  2659.      If FDllHandle=0 Then exit;
  2660.      server.sin_family      := AF_INET;
  2661.      server.sin_port        := FBswap(RemotePort);
  2662.      server.sin_addr.s_addr := Finet_addr(RemoteHost);
  2663.  
  2664.      If FAcceptSocket<>0 Then s:=FAcceptSocket
  2665.      Else If FInSocket<>0 Then s:=FInSocket
  2666.      Else If FOutSocket<>0 Then s:=FOutSocket
  2667.      Else
  2668.      Begin
  2669.           FInSocket := Fsocket(PF_INET, FSockMode, 0);
  2670.           If FInSocket<0 Then //Error
  2671.           Begin
  2672.              FErrorCode:=Fsock_errno;
  2673.              TCPError(FErrorCode);
  2674.              exit;
  2675.           End
  2676.           Else FErrorCode:=0;
  2677.           s:=FInSocket;
  2678.      End;
  2679.      NameLen:=sizeof(Server);
  2680.      If Frecvfrom(s,Buf,BufLen,0,Server,NameLen)=0 Then FErrorCode:=0
  2681.      Else
  2682.      Begin
  2683.           FErrorCode:=Fsock_errno;
  2684.           TCPError(FErrorCode);
  2685.      End;
  2686.  
  2687. End;
  2688.  
  2689. Initialization
  2690.    RegisterClasses([THTTPBrowser,TFTP,TUDP,TTCP]);
  2691. End.
  2692.  
  2693. (* Changes:
  2694.  
  2695.    16-Aug-97   Jörg: Fehler in WebExWin-Records gefixt.
  2696.                Alle Strukturen mit CSTRING[...STRING]
  2697.                waren falsch übersetzt. Jeweils -1
  2698.                eingefügt.
  2699.  
  2700. *)
  2701.