' Chat Client by William Yu 
' This is the easy part!  Once you've connected, voila, instant chat (almost)! 

' Brief Overview of QSocket (Client-side) 
' 
'  Connect(ServerName AS STRING, PortNum AS INTEGER) AS INTEGER 
'      -- Connect to the server (can be a name or IP Number) at the specified 
'         Port number.  Returns a socket file descriptor. 
'  IsServerReady(SocketNum AS INTEGER) AS INTEGER 
'      -- Non-blocking function call that determines if the server has sent 
'         some data to the client. 

$APPTYPE GUI
$TYPECHECK ON

CONST DELAY = 500
CONST False = 0
CONST True = NOT False

DECLARE SUB SendButtonClick
DECLARE SUB ButtonClick
DECLARE SUB TimerExpired

DIM Socket AS QSocket
DIM SockNum AS INTEGER
    SockNum = 0

CREATE MainForm AS QForm
  Height = 280
  Width = 300
  Caption = "Chat Client"
  Center
  CREATE Label1 AS QLabel
    Top = 12
    Left = 5
    Caption = "Server:"
  END CREATE
  CREATE Label2 AS QLabel
    Top = 39
    Left = 5
    Caption = "Port:"
  END CREATE
  CREATE Edit1 AS QEdit
    Left = 50
    Top = 10
    Width = 220
    Height = 20
    Text = "localhost"
  END CREATE
  CREATE Edit2 AS QEdit
    Left = 50
    Top = 37
    Width = 220
    Height = 20
    Text = "5000"
  END CREATE
  CREATE Button AS QButton
    Left = 50
    Top = 65
    Height = 20
    Width = 220
    Caption = "Connect"
    OnClick = ButtonClick
  END CREATE
  CREATE ListBox AS QListBox
    Top = 95
    Left = 50
    Width = 220
    Height = 140
  END CREATE
  CREATE Label3 AS QLabel
    Top = 98
    Caption = "Message"
  END CREATE
  CREATE Label4 AS QLabel
    Top = 242
    Left = 6
    Caption = "Text:"
  END CREATE
  CREATE Edit3 AS QEdit
    Left = 50
    Top = 240
    Width = 170
    Height = 20
  END CREATE
  CREATE SendButton AS QButton
    Left = 225
    Top = 240
    Height = 20
    Width = 50
    Caption = "Send"
    OnClick = SendButtonClick
  END CREATE
END CREATE

DIM Timer1 AS QTimer
    Timer1.Interval = DELAY
    Timer1.OnTimer = TimerExpired

SUB TimerExpired
  Timer1.Enabled = False
  Timer1.Interval = DELAY
  IF SockNum <= 0 THEN
    Timer1.Enabled = True
    EXIT SUB
  END IF
  IF Socket.IsServerReady(SockNum) THEN
    ListBox.InsertItem 0, Socket.ReadLine(SockNum)
    IF Socket.Transferred  < 0 THEN
      SockNum = 0
      ShowMessage "Server disconnected!"
    END IF
  END IF
  Timer1.Enabled = True
END SUB

SUB SendButtonClick
  IF SockNum <= 0 THEN
    ShowMessage "You must be connected to a server first!"
  ELSE
    IF Socket.WriteLine(SockNum, Edit3.Text) = -1 THEN
      Button.Caption = "Disconnect"
      ShowMessage "ERROR: Disconnected from Server!"
    END IF
  END IF
END SUB

SUB ButtonClick
  IF Button.Caption = "Disconnect" THEN
    Timer1.Enabled = False
    Button.Caption = "Connect"
    Socket.Close(SockNum)
    SockNum = 0
    Timer1.Enabled = True
    EXIT SUB
  END IF
  SockNum = Socket.Connect(Edit1.Text, VAL(Edit2.Text))
  IF SockNum > 0 THEN  
    Button.Caption = "Disconnect"
    ListBox.InsertItem 0, Socket.ReadLine(SockNum)
  ELSE
    SockNum = 0
    ShowMessage "Unable to connect to: "+Edit1.Text+" on port "+Edit2.Text
  END IF
END SUB

MainForm.ShowModal