ClientForm.java
/*
* Copyright © 2011 Nokia Corporation. All rights reserved.
* Nokia and Nokia Connecting People are registered trademarks of Nokia Corporation.
* Oracle and Java are trademarks or registered trademarks of Oracle and/or its
* affiliates. Other product and company names mentioned herein may be trademarks
* or trade names of their respective owners.
* See LICENSE.TXT for license information.
*/
package com.nokia.example.btsppecho;
import java.util.Vector;
import javax.bluetooth.BluetoothStateException;
import javax.bluetooth.LocalDevice;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Form;
import javax.microedition.lcdui.StringItem;
import javax.microedition.lcdui.TextField;
import com.nokia.example.btsppecho.client.ClientConnectionHandler;
import com.nokia.example.btsppecho.client.ClientConnectionHandlerListener;
public class ClientForm
extends Form
implements CommandListener, ClientConnectionHandlerListener {
private final MIDletApplication midlet;
private final StringItem numConnectionsField;
private final TextField sendDataField;
private final StringItem receivedDataField;
private final StringItem statusField;
private final Command sendCommand;
private final Command quitCommand;
private final Command logCommand;
private final Vector handlers = new Vector();
private StringItem btAddressField = null;
private volatile int numReceivedMessages = 0;
private volatile int numSentMessages = 0;
private int sendMessageId = 0;
public ClientForm(MIDletApplication midlet) {
super("Client");
this.midlet = midlet;
try {
String address = LocalDevice.getLocalDevice().getBluetoothAddress();
btAddressField = new StringItem("My address", address);
append(btAddressField);
} catch (BluetoothStateException e) {
// nothing we can do, don't add field
}
numConnectionsField = new StringItem("Connections", "0");
append(numConnectionsField);
statusField = new StringItem("Status", "listening");
append(statusField);
sendDataField = new TextField("Send data",
"Client says: 'Hello, world.'",
64,
TextField.ANY);
append(sendDataField);
receivedDataField = new StringItem("Last received data", null);
append(receivedDataField);
sendCommand = new Command("Send", Command.SCREEN, 1);
quitCommand = new Command("Exit", Command.EXIT, 1);
logCommand = new Command("View log", Command.SCREEN, 2);
addCommand(quitCommand);
addCommand(logCommand);
setCommandListener(this);
}
void closeAll() {
for (int i = 0; i < handlers.size(); i++) {
ClientConnectionHandler handler =
(ClientConnectionHandler) handlers.elementAt(i);
handler.close();
}
}
public void commandAction(Command cmd, Displayable disp) {
if (cmd == logCommand) {
midlet.clientFormViewLog(this);
}
if (cmd == sendCommand) {
String sendData = sendDataField.getString();
try {
sendMessageToAllClients(++sendMessageId, sendData);
} catch (IllegalArgumentException e) {
// Message length longer than
// ServerConnectionHandler.MAX_MESSAGE_LENGTH
String errorMessage =
"IllegalArgumentException while trying "
+ "to send a message: " + e.getMessage();
handleError(null, errorMessage);
}
} else if (cmd == quitCommand) {
// the MIDlet aborts the ConnectionService, etc.
midlet.clientFormExitRequest();
}
}
public void removeHandler(ClientConnectionHandler handler) {
// Note: we assume the caller has aborted/closed/etc.
// the handler if that needed to be done. This method
// simply removes it from the list of handlers maintained
// by the ConnectionService.
handlers.removeElement(handler);
}
public void sendMessageToAllClients(int sendMessageId, String sendData)
throws IllegalArgumentException {
Integer id = new Integer(sendMessageId);
for (int i = 0; i < handlers.size(); i++) {
ClientConnectionHandler handler =
(ClientConnectionHandler) handlers.elementAt(i);
// throws IllegalArgumentException if message length
// > ServerConnectionHandler.MAX_MESSAGE_LENGTH
handler.queueMessageForSending(
id,
sendData.getBytes());
}
}
// interface L2CAPConnectionListener
public void handleAcceptAndOpen(ClientConnectionHandler handler) {
handlers.addElement(handler);
// start the reader and writer, it also causes underlying
// InputStream and OutputStream to be opened.
handler.start();
statusField.setText("'Accept and open' for new connection");
}
public void handleStreamsOpen(ClientConnectionHandler handler) {
// first connection
if (handlers.size() == 1) {
addCommand(sendCommand);
}
String str = Integer.toString(handlers.size());
numConnectionsField.setText(str);
statusField.setText("I/O streams opened on connection");
}
public void handleStreamsOpenError(ClientConnectionHandler handler,
String errorMessage) {
handlers.removeElement(handler);
String str = Integer.toString(handlers.size());
numConnectionsField.setText(str);
statusField.setText("Error opening I/O streams: "
+ errorMessage);
}
public void handleReceivedMessage(ClientConnectionHandler handler,
byte[] messageBytes) {
numReceivedMessages++;
String msg = new String(messageBytes);
receivedDataField.setText(msg);
statusField.setText(
"# messages read: " + numReceivedMessages + " "
+ "sent: " + numSentMessages);
}
public void handleQueuedMessageWasSent(
ClientConnectionHandler handler,
Integer id) {
numSentMessages++;
statusField.setText("# messages read: "
+ numReceivedMessages + " "
+ "sent: " + numSentMessages);
}
public void handleClose(ClientConnectionHandler handler) {
removeHandler(handler);
if (handlers.size() == 0) {
removeCommand(sendCommand);
}
String str = Integer.toString(handlers.size());
numConnectionsField.setText(str);
statusField.setText("Connection closed");
}
public void handleErrorClose(ClientConnectionHandler handler,
String errorMessage) {
removeHandler(handler);
if (handlers.size() == 0) {
removeCommand(sendCommand);
}
statusField.setText("Error: (close)\"" + errorMessage + "\"");
}
public void handleError(ClientConnectionHandler hander,
String errorMessage) {
statusField.setText("Error: \"" + errorMessage + "\"");
}
}