IdleState.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.bcexchanger.comm;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import javax.obex.Operation;
import javax.obex.ResponseCodes;
/**
*
* This class implements idle state of the communication state machine. In idle
* state machine is waiting for external events (like incoming Bluetooth
* connections or user command to start business card exchange)
*
* This class extends ExchangerState abstract class.
*
* @see bcexchanger.comm.ExchangerState Design Patterns: State
*
*/
public class IdleState extends ExchangerState {
/**
* Constructor
*
* @param _parent -
* the class which is nesting the current state of the state
* machine
*/
public IdleState(ExchangerStateParent _parent) {
super(_parent);
}
public int onGet(Operation op) {
try {
OutputStream out = op.openOutputStream();
byte[] vCard = parent.getListener().getOwnBC(); // getting the
// own card
int vlen = vCard.length;
byte[] tmpBuf = new byte[vlen + 4];
System.arraycopy(vCard, 0, tmpBuf, 4, vlen);
tmpBuf[0] = (byte) ((vlen >>> 24) & 0xff);
tmpBuf[1] = (byte) ((vlen >>> 16) & 0xff);
tmpBuf[2] = (byte) ((vlen >>> 8) & 0xff);
tmpBuf[3] = (byte) ((vlen >>> 0) & 0xff);
out.write(tmpBuf); // sending data
op.close();
return ResponseCodes.OBEX_HTTP_OK;
} catch (Exception e) {
return ResponseCodes.OBEX_HTTP_INTERNAL_ERROR;
}
}
public int onPut(Operation op) {
try {
InputStream in = op.openInputStream();
byte[] fullResult = null;
{
byte[] buf = new byte[256];
ByteArrayOutputStream bout = new ByteArrayOutputStream(2048);
for (int len = in.read(buf); len >= 0; len = in.read(buf)) {
bout.write(buf, 0, len);
}
fullResult = bout.toByteArray();
}
ByteArrayInputStream bin = new ByteArrayInputStream(fullResult);
DataInputStream din = new DataInputStream(bin);
int size = din.readInt();
byte[] vCard = new byte[size];
din.read(vCard);
// card is received
op.close();
parent.getListener().onReceiveBC(vCard);
return ResponseCodes.OBEX_HTTP_OK;
} catch (Exception e) {
return ResponseCodes.OBEX_HTTP_INTERNAL_ERROR;
}
}
public void startSending(int oper) throws Exception {
parent.setState(new InquiryState(parent, oper));
}
public void cancelSending() {
// Internal error, but not fatal
}
}