pbx
Class PBXClient

java.lang.Object
  extended by java.lang.Thread
      extended by pbx.PBXClient
All Implemented Interfaces:
java.lang.Runnable

public class PBXClient
extends java.lang.Thread

Encapsulates rudimentary functionality of a PBX to list and invite users (peers) to secure calls. The instances of PBXClient class expect to be connected to plain public chat server that distributes (broadcasts their messages (terminated by the new-line) to all other connected users (possible kryptofon peers). Communication with the upper layer (which owns instance of the PBXClient) is done using call-backs over the PBXClient.Context interface.

Author:
Mikica B Kocic

Nested Class Summary
static class PBXClient.CMType
          PBX Signaling Messages' Types
static interface PBXClient.Context
          Provides a call-back context for the instance of PBXClient.
 class PBXClient.ControlMessage
          PBX signaling message sent via call-back to the upper layer
 
Nested classes/interfaces inherited from class java.lang.Thread
java.lang.Thread.State, java.lang.Thread.UncaughtExceptionHandler
 
Field Summary
private  PBXClient.Context context
          Event (call-back) context for this instance of the PBXClient
private  java.lang.String host
          Host name or IP address of the remote chat server
private static java.lang.String INFO
          HTML CSS class for info messages
private  java.lang.String myID
          Chat client ID when presented to user (== host + ":" + port)
private  java.io.PrintWriter out
          Output stream to remote server
private  int port
          TCP port where to connect to on remote chat server
private  boolean running
          Indicates/enables the thread to be running
private  java.net.Socket socket
          Instance of the TCP socket to chat server.
private static java.lang.String WARN
          HTML CSS class for warning and error messages
 
Fields inherited from class java.lang.Thread
MAX_PRIORITY, MIN_PRIORITY, NORM_PRIORITY
 
Constructor Summary
PBXClient(java.lang.String host, int port, PBXClient.Context context)
          Creates new instance of PBXClient that posts messages to specified Context.
 
Method Summary
 void close()
          Closes the connection gracefully
 java.lang.String getLocalAddress()
          Returns local IP address.
private  void parseControlMessage(java.lang.String remoteUserId, java.lang.String[] args, java.lang.String original)
          Parses control messages.
private  void parseInputMessage(java.lang.String message)
          Parses input message.
private  void report(java.lang.String style, java.lang.String str)
          Reports a system message to log
private  void reportIncomingTextMessage(java.lang.String userId, java.lang.String message)
          Reports incoming message
 void run()
          Connects socket, then reads messages from server while running flag is enabled.
 void send(java.lang.String message)
          Sends message (appended with new-line) to chat server
 void send(java.lang.String message, java.lang.String userId)
          Sends message (appended with new-line) to chat server prefixed with userId
 void sendAccept(java.lang.String remoteUserId, java.lang.String localIpAddress, int localUdpPort, java.lang.String publicKey)
          Broadcasts ACCEPT message
 void sendBye(java.lang.String remoteUserId, java.lang.String localIpAddress, int localUdpPort)
          Broadcasts BYE message
 void sendInstantMessage(java.lang.String remoteUserId, java.lang.String encryptedMessage)
          Broadcasts IMSG message
 void sendInvite(java.lang.String remoteUserId, java.lang.String localIpAddress, int localUdpPort, java.lang.String publicKey)
          Broadcasts INVITE message
 void sendListPeers(java.lang.String regex)
          Broadcasts LIST message (to list potential peers)
 void sendRing(java.lang.String remoteUserId, java.lang.String localIpAddress, int localUdpPort, java.lang.String publicKey)
          Broadcasts RING message
 void start()
          Starts the thread.
 
Methods inherited from class java.lang.Thread
activeCount, checkAccess, clone, countStackFrames, currentThread, destroy, dumpStack, enumerate, getAllStackTraces, getContextClassLoader, getDefaultUncaughtExceptionHandler, getId, getName, getPriority, getStackTrace, getState, getThreadGroup, getUncaughtExceptionHandler, holdsLock, interrupt, interrupted, isAlive, isDaemon, isInterrupted, join, join, join, resume, setContextClassLoader, setDaemon, setDefaultUncaughtExceptionHandler, setName, setPriority, setUncaughtExceptionHandler, sleep, sleep, stop, stop, suspend, toString, yield
 
Methods inherited from class java.lang.Object
equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

Field Detail

WARN

private static final java.lang.String WARN
HTML CSS class for warning and error messages

See Also:
Constant Field Values

INFO

private static final java.lang.String INFO
HTML CSS class for info messages

See Also:
Constant Field Values

host

private java.lang.String host
Host name or IP address of the remote chat server


port

private int port
TCP port where to connect to on remote chat server


myID

private java.lang.String myID
Chat client ID when presented to user (== host + ":" + port)


out

private java.io.PrintWriter out
Output stream to remote server


socket

private java.net.Socket socket
Instance of the TCP socket to chat server.


running

private volatile boolean running
Indicates/enables the thread to be running


context

private PBXClient.Context context
Event (call-back) context for this instance of the PBXClient

Constructor Detail

PBXClient

public PBXClient(java.lang.String host,
                 int port,
                 PBXClient.Context context)
Creates new instance of PBXClient that posts messages to specified Context.

Parameters:
host - host name or IP address of the chat server
port - TCP port
context - where to log messages (also error and info messages)
Method Detail

getLocalAddress

public java.lang.String getLocalAddress()
Returns local IP address.


start

public void start()
Starts the thread.

Overrides:
start in class java.lang.Thread

send

public void send(java.lang.String message)
Sends message (appended with new-line) to chat server

Parameters:
message - message to be sent

send

public void send(java.lang.String message,
                 java.lang.String userId)
Sends message (appended with new-line) to chat server prefixed with userId

Parameters:
message - message to be sent
userId - user identifier

close

public void close()
Closes the connection gracefully


report

private void report(java.lang.String style,
                    java.lang.String str)
Reports a system message to log


reportIncomingTextMessage

private void reportIncomingTextMessage(java.lang.String userId,
                                       java.lang.String message)
Reports incoming message


parseInputMessage

private void parseInputMessage(java.lang.String message)
Parses input message. Syntax:
      [ [ <userId> ] : ] <text-or-control>
  
where default \a userId is [Anonymous]. If the \a text-or-control begins with "[$]" it represents control message and it will not be displayed to the user.


parseControlMessage

private void parseControlMessage(java.lang.String remoteUserId,
                                 java.lang.String[] args,
                                 java.lang.String original)
Parses control messages. TODO Format messages in XML instead. (It would be too much to do for IP1 course.) Syntax:
     [$] INVITE    local-name   remote-ip-address   remote-udp-port  [ public-key ]   
     [$] RING      local-name   remote-ip-address   remote-udp-port  [ public-key ]
     [$] ACCEPT    local-name   remote-ip-address   remote-udp-port  [ secret-key ]
     [$] BYE       local-name [ remote-ip-address [ remote-udp-port ] ]
     [$] IMSG      local-name   encrypted-message
     [$] LIST    [ username-regex ]
     [$] ALIVE
  


sendInvite

public void sendInvite(java.lang.String remoteUserId,
                       java.lang.String localIpAddress,
                       int localUdpPort,
                       java.lang.String publicKey)
Broadcasts INVITE message


sendRing

public void sendRing(java.lang.String remoteUserId,
                     java.lang.String localIpAddress,
                     int localUdpPort,
                     java.lang.String publicKey)
Broadcasts RING message


sendAccept

public void sendAccept(java.lang.String remoteUserId,
                       java.lang.String localIpAddress,
                       int localUdpPort,
                       java.lang.String publicKey)
Broadcasts ACCEPT message


sendBye

public void sendBye(java.lang.String remoteUserId,
                    java.lang.String localIpAddress,
                    int localUdpPort)
Broadcasts BYE message


sendInstantMessage

public void sendInstantMessage(java.lang.String remoteUserId,
                               java.lang.String encryptedMessage)
Broadcasts IMSG message


sendListPeers

public void sendListPeers(java.lang.String regex)
Broadcasts LIST message (to list potential peers)


run

public void run()
Connects socket, then reads messages from server while running flag is enabled. Finally, closes connection in graceful manner. Incoming messages are dispatched to the owner via the call-back context (see PBXClient.Context).

Specified by:
run in interface java.lang.Runnable
Overrides:
run in class java.lang.Thread