© BigSpeed Computing Inc. - Mastering algorithms
Public Class CFMain

  'Visual Basic 2005 sample of secure voice chat client
  'To keep this VB 2005 example simple, we are going to support
  'only the default user account (Guest)



Public Peers As New Collection
Friend ThePeer, SelPeer As CPeer

Dim FSettings As CFSettings
Dim FConnect As CFConnect
Dim FAlert As CFAlert



'Add a message to the log
Private Sub LogMsg(ByVal aText As String)
    Dim Line As String
    If txtLog.Text > "" Then
      Line = Chr(13) & Chr(10)
    Else
      Line = ""
    End If
    Line = Line & "[" & Now.ToLongTimeString & "] : "
    Line = Line & aText
    txtLog.SelectionStart = Len(txtLog.Text)
    txtLog.SelectedText = Line
End Sub



Friend Function PeerFromHandle(ByVal aHandle As Long) As CPeer
  Dim Pr As CPeer

  PeerFromHandle = Nothing
  For Each Pr In Peers   ' Iterate through elements.
    If Pr.Handle = aHandle Then
      PeerFromHandle = Pr
      Exit For   ' Exit loop.
   End If
Next
End Function



Public Function PickPeer(ByVal aHandle As Long) As Boolean
  ThePeer = PeerFromHandle(aHandle)
  PickPeer = Not (ThePeer Is Nothing)
End Function


Public Function SelectPeer() As Boolean
  SelectPeer = False
  If lvPeers.SelectedItems.Count = 0 Then Exit Function
  SelPeer = lvPeers.SelectedItems(0).Tag
  SelectPeer = Not (SelPeer Is Nothing)
End Function



'Update the button state and the status text
Private Sub UpdateStatus()
  If VoiCln.SessionOpen Then
    'already connected
    btnConnect.Enabled = False
    btnCancel.Enabled = False
    btnDisconnect.Enabled = True
    StatusBar.Panels(0).Text = " Session open"
    StatusBar.Panels(1).Text = " Server: " + VoiCln.ServerAddress + ":" + Str(VoiCln.ServerPort)
    If VoiCln.Username > "" Then
      StatusBar.Panels(2).Text = " User: " + VoiCln.Username
    Else
      StatusBar.Panels(2).Text = " User: Guest"
    End If
  Else
    StatusBar.Panels(1).Text = ""
    StatusBar.Panels(2).Text = ""

    If VoiCln.SessionOpening Then
      'now connecting
      btnConnect.Enabled = False
      btnCancel.Enabled = True
      btnDisconnect.Enabled = False
      StatusBar.Panels(0).Text = " Connecting to the server"
    Else
      'not connected
      btnConnect.Enabled = True
      btnCancel.Enabled = False
      btnDisconnect.Enabled = False
      StatusBar.Panels(0).Text = " Session closed"
    End If
  End If

  UpdateButtons()
End Sub


Private Sub UpdateButtons()
  btnAlert.Enabled = lvPeers.SelectedItems.Count > 0
  btnChat.Enabled = lvPeers.SelectedItems.Count > 0
  btnRemove.Enabled = lvPeers.SelectedItems.Count > 0

  btnMakeCall.Enabled = False
  If lvPeers.SelectedItems.Count > 0 Then
    If (VoiCln.GetCallingPeer = 0) And (VoiCln.GetCallPeer = 0) Then
      btnMakeCall.Enabled = True
    End If
  End If

  btnCancelCalling.Enabled = VoiCln.GetCallingPeer <> 0
  btnEndCall.Enabled = VoiCln.GetCallPeer <> 0
  chkMuteRecording.Enabled = btnEndCall.Enabled
  chkMutePlayback.Enabled = btnEndCall.Enabled
End Sub


  'Set the component properties
  Private Sub SetSettings()

    If FSettings.radSecret.Checked Then
      VoiCln.SecurityMode = 1
    Else
      If FSettings.radPublic.Checked Then
        VoiCln.SecurityMode = 2
      Else
        VoiCln.SecurityMode = 0
      End If
    End If

    VoiCln.SecretKey = FSettings.txtSecret.Text

    VoiCln.PublicKey = FSettings.txtPublic.Text
    VoiCln.PrivateKey = FSettings.txtPrivate.Text
    VoiCln.Fingerprints = FSettings.txtFingerprints.Text

    VoiCln.ListeningPort = Val(FSettings.txtPort.Text)
    VoiCln.BindAddress = FSettings.txtAddr.Text

  End Sub




Sub DeletePeer(ByVal aPeer As CPeer)
  If aPeer Is Nothing Then Exit Sub
  Peers.Remove(Str(aPeer.Handle))
  VoiCln.DisconnectPeer(aPeer.Handle)
  lvPeers.Items.Remove(aPeer.ListItem)
End Sub







  'Initializations
  Private Sub fMain_Load(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles MyBase.Load
    FSettings = New CFSettings   'create the settings form
    FSettings.FMain = Me
    FConnect = New CFConnect     'create the connection form
    SetSettings()
    FAlert = New CFAlert         'create the alert form
    UpdateStatus()
  End Sub



Private Sub lvPeers_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lvPeers.SelectedIndexChanged
  UpdateStatus()
End Sub


'Connecting to the server
Private Sub btnConnect_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnConnect.Click
    If FConnect.ShowDialog <> DialogResult.OK Then Exit Sub

    If Not VoiCln.OpenSession(FConnect.txtSrvAddr.Text, Val(FConnect.txtSrvPort.Text), FConnect.txtUsername.Text, FConnect.txtPassword.Text) Then
      MsgBox("Cannot initiate a new session: " + Str(VoiCln.LastError))
    End If

    UpdateStatus()
End Sub


'Disconnect from the server
Private Sub btnDisconnect_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDisconnect.Click
    VoiCln.CloseSession()
End Sub



Private Sub btnCancel_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCancel.Click
    If FSettings.ShowDialog <> DialogResult.OK Then Exit Sub
    SetSettings()
    UpdateStatus()
End Sub




Private Sub btnSettings_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSettings.Click
    If FSettings.ShowDialog <> DialogResult.OK Then Exit Sub
    SetSettings()
    UpdateStatus()
End Sub


Private Sub btnIP_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnIP.Click
    MsgBox(VoiCln.LocalIPList, , "My IP address")
End Sub


Private Sub btnExit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnExit.Click
    End
End Sub



  ' Events



  'Just connected to the server
  Private Sub VoiCln_OnSessionOpen(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles VoiCln.OnSessionOpen
    UpdateStatus()
    LogMsg("Connected to the server " + VoiCln.ServerAddress + ":" + Str(VoiCln.ServerPort))
  End Sub


  'Unsuccessful connection to the server
  Private Sub VoiCln_OnSessionRejected(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles VoiCln.OnSessionRejected
    LogMsg("Cannot open a session to" + FConnect.txtSrvAddr.Text + ":" + FConnect.txtSrvPort.Text + "   Error- " + ErrorText(VoiCln.LastError))
    MsgBox("Cannot open the session!  Error: " + ErrorText(VoiCln.LastError))
    UpdateStatus()
  End Sub


  'Just disconnected from the server
  Private Sub VoiCln_OnSessionClosed(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles VoiCln.OnSessionClosed
    UpdateStatus()
    LogMsg("Disconnected from the server")
  End Sub




  'A new peer is just connected
  Private Sub VoiCln_OnPeerConnected(ByVal sender As System.Object, ByVal e As AxbsVoiChatCln.IbsVoiChatClnXEvents_OnPeerConnectedEvent) Handles VoiCln.OnPeerConnected
    Dim Pr As New CPeer
    Dim LI As ListViewItem

    Pr.Handle = e.aHandle
    Peers.Add(Pr, Str(Pr.Handle))
    Pr.Username = NiceName(VoiCln.GetPeerName(Pr.Handle))

    'create the chat form
    Pr.FChat = New CFChat
    Pr.FChat.FMain = Me
    Pr.FChat.Peer = Pr
    Pr.FChat.Text = "Chat with " + Pr.Username

    LI = lvPeers.Items.Add(NiceName(VoiCln.GetPeerName(e.aHandle)))        'Name
    LI.SubItems.Add(VoiCln.GetPeerAddress(e.aHandle))                      'Address
    LI.SubItems.Add(VoiCln.GetPeerPort(e.aHandle))                      'port
    LI.SubItems.Add("Online")                                          'status
    LI.Tag = Pr
    Pr.ListItem = LI

    If lvPeers.SelectedItems.Count = 0 Then
      LI.Selected = True
    End If

    UpdateStatus()
    LogMsg("New peer at " + LI.SubItems(1).Text + ":" + LI.SubItems(2).Text)
  End Sub





  'A peer is just disconnected
Private Sub VoiCln_OnPeerDisconnected(ByVal sender As System.Object, ByVal e As AxbsVoiChatCln.IbsVoiChatClnXEvents_OnPeerDisconnectedEvent) Handles VoiCln.OnPeerDisconnected
  Dim Pr As CPeer
  Pr = PeerFromHandle(e.aHandle)
  If Pr Is Nothing Then Exit Sub
  LogMsg("Disconnected peer " + Pr.ListItem.Text + " " + Pr.ListItem.SubItems(1).Text + ":" + Pr.ListItem.SubItems(2).Text)
  DeletePeer(Pr)
End Sub




' *** Alert


  Private Sub btnAlert_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAlert.Click

  If Not SelectPeer() Then Exit Sub

  FAlert.txtMsg.Text = ""
  If lvPeers.SelectedItems.Count > 0 Then
    FAlert.radSingle.Text = "User " + lvPeers.SelectedItems(0).Text
    FAlert.radSingle.Enabled = True
    FAlert.radSingle.Checked = True
  Else
    FAlert.radAll.Checked = True
    FAlert.radSingle.Text = "Single user"
    FAlert.radSingle.Enabled = False
  End If

  If FAlert.ShowDialog <> DialogResult.OK Then Exit Sub

  If FAlert.radSingle.Checked Then
    VoiCln.SendAlertMessage(SelPeer.Handle, FAlert.txtMsg.Text)
  Else
    For Each Pr As CPeer In Peers
      VoiCln.SendAlertMessage(Pr.Handle, FAlert.txtMsg.Text)
    Next
  End If

  End Sub


  'An alert message is available
  Private Sub VoiCln_OnHaveAlertMessage(ByVal sender As System.Object, ByVal e As AxbsVoiChatCln.IbsVoiChatClnXEvents_OnHaveAlertMessageEvent) Handles VoiCln.OnHaveAlertMessage
    If Not PickPeer(e.aHandle) Then Exit Sub
    MsgBox(e.aText, , "Alert from " + ThePeer.Username)
  End Sub



' *** Chat

  Private Sub btnChat_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnChat.Click
    If Not SelectPeer() Then Exit Sub
    ShowForm(SelPeer.FChat)
  End Sub


  'A chat message is available
  Private Sub VoiCln_OnHaveChatMessage(ByVal sender As System.Object, ByVal e As AxbsVoiChatCln.IbsVoiChatClnXEvents_OnHaveChatMessageEvent) Handles VoiCln.OnHaveChatMessage
    If Not PickPeer(e.aHandle) Then Exit Sub
    ThePeer.FChat.HaveChatMessage(e.aText)
  End Sub



Private Sub btnRemove_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRemove.Click
    If Not SelectPeer() Then Exit Sub
    DeletePeer(SelPeer)
End Sub


Private Sub btnClear_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnClear.Click
  txtLog.Clear()
End Sub



Private Sub VoiCln_OnCallRequested(ByVal sender As System.Object, ByVal e As AxbsVoiChatCln.IbsVoiChatClnXEvents_OnCallRequestedEvent) Handles VoiCln.OnCallRequested
  Dim Pr As CPeer
  Pr = PeerFromHandle(e.aHandle)
  If Pr Is Nothing Then Exit Sub
  LogMsg("Call is requested from " + Pr.Username + " " + Pr.ListItem.SubItems(1).Text + ":" + Pr.ListItem.SubItems(2).Text)
  If MsgBox("Call is requested from " + Pr.Username + " " + Pr.ListItem.SubItems(1).Text + ":" + Pr.ListItem.SubItems(2).Text, MsgBoxStyle.OkCancel) = MsgBoxResult.Ok Then
    e.aOkay = True
  End If
End Sub



Private Sub VoiCln_OnCallTaken(ByVal sender As System.Object, ByVal e As AxbsVoiChatCln.IbsVoiChatClnXEvents_OnCallTakenEvent) Handles VoiCln.OnCallTaken
  Dim Pr As CPeer
  Pr = PeerFromHandle(e.aHandle)
  If Pr Is Nothing Then Exit Sub
  Pr.ListItem.SubItems(3).Text = "Talking"
  lblCaller.Text = Pr.ListItem.Text
  VoiCln.TriggerLevel = udTrigerLevel.Value
  UpdateButtons()
  LogMsg("Call from " + Pr.Username + " is taken")
End Sub



Private Sub VoiCln_OnCallAccepted(ByVal sender As System.Object, ByVal e As AxbsVoiChatCln.IbsVoiChatClnXEvents_OnCallAcceptedEvent) Handles VoiCln.OnCallAccepted
  Dim Pr As CPeer
  Pr = PeerFromHandle(e.aHandle)
  If Pr Is Nothing Then Exit Sub
  Pr.ListItem.SubItems(3).Text = "Talking"
  lblCaller.Text = Pr.ListItem.Text
  VoiCln.TriggerLevel = udTrigerLevel.Value
  UpdateButtons()
  LogMsg("Call from " + Pr.Username + " is accepted")
End Sub



Private Sub VoiCln_OnCallRejected(ByVal sender As System.Object, ByVal e As AxbsVoiChatCln.IbsVoiChatClnXEvents_OnCallRejectedEvent) Handles VoiCln.OnCallRejected
  Dim Pr As CPeer
  Pr = PeerFromHandle(e.aHandle)
  If Pr Is Nothing Then Exit Sub
  Pr.ListItem.SubItems(3).Text = "Online"
  UpdateButtons()
  MsgBox("Call from " + Pr.Username + " is rejected")
  LogMsg("Call from " + Pr.Username + " is rejected")
End Sub



Private Sub VoiCln_OnCallTerminated(ByVal sender As System.Object, ByVal e As AxbsVoiChatCln.IbsVoiChatClnXEvents_OnCallTerminatedEvent) Handles VoiCln.OnCallTerminated
  Dim Pr As CPeer
  Pr = PeerFromHandle(e.aHandle)
  If Pr Is Nothing Then Exit Sub
  lblCaller.Text = ""
  Pr.ListItem.SubItems(3).Text = "Online"
  UpdateButtons()
  MsgBox("Call from " + Pr.Username + " is terminated")
  LogMsg("Call from " + Pr.Username + " is terminated")
End Sub


Private Sub VoiCln_OnStartDelaying(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles VoiCln.OnStartDelaying
  lblDelaying.Visible = True
End Sub

Private Sub VoiCln_OnStopDelaying(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles VoiCln.OnStopDelaying
  lblDelaying.Visible = False
End Sub


Private Sub VoiCln_OnStartOverloading(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles VoiCln.OnStartOverloading
  lblOverloading.Visible = True
End Sub

Private Sub VoiCln_OnStopOverloading(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles VoiCln.OnStopOverloading
  lblOverloading.Visible = False
End Sub


Private Sub VoiCln_OnStartRecording(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles VoiCln.OnStartRecording
  lblRecording.Visible = True
End Sub

Private Sub VoiCln_OnStopRecording(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles VoiCln.OnStopRecording
  lblRecording.Visible = False
End Sub




Private Sub chkMuteRecording_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles chkMuteRecording.CheckedChanged
  VoiCln.MuteRecording = chkMuteRecording.Checked
End Sub


Private Sub chkMutePlayback_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles chkMutePlayback.CheckedChanged
  VoiCln.MutePlayback = chkMutePlayback.Checked
End Sub



Private Sub btnMakeCall_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnMakeCall.Click
  If Not SelectPeer() Then Exit Sub
  If VoiCln.MakeCall(SelPeer.Handle) Then
    lvPeers.SelectedItems(0).SubItems(3).Text = "Calling"
  Else
    MsgBox("Cannot make a call, code: " + Str(VoiCln.LastError))
  End If
  UpdateButtons()
End Sub


Private Sub btnEndCall_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnEndCall.Click

  VoiCln.TerminateCall(0)  'end the conversation with all peers
  lblCaller.Text = ""

  Dim i As Long
  For i = 0 To lvPeers.Items.Count - 1
    lvPeers.Items.Item(0).SubItems(3).Text = "Online"
  Next i
  UpdateButtons()
End Sub


Private Sub udTrigerLevel_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles udTrigerLevel.ValueChanged
  If Not Me.Visible Then Exit Sub

  If VoiCln Is Nothing Then Exit Sub
  If VoiCln.GetCallPeer = 0 Then Exit Sub
  VoiCln.TriggerLevel = udTrigerLevel.Value
End Sub

End Class
© BigSpeed Computing Inc. - Mastering algorithms