IdleState.java

/*
 * Copyright © 2013 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
            // Changed for error in Evo device after successful transfer
            out.close();
            
            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
    }
}