/* * 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 } }