/* * 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.IOException; import java.io.OutputStream; import javax.microedition.io.Connector; import javax.obex.ClientSession; import javax.obex.HeaderSet; import javax.obex.Operation; import javax.obex.ResponseCodes; /** * This class implements business card sending state. In this state a client * OBEX PUT operation is performed. No OBEX server commands are served. * * This class extends ExchangerState abstract class. * * @see bcexchanger.comm.ExchangerState Design Patterns: State */ public class SendState extends ExchangerState { // Instance variables private ClientSession connection = null; private String url = null; private Operation operation = null; private boolean cancelInvoked = false; /** * Constructor * * @param _parent - * the class which is nesting the current state of the state * machine * @param _url - * a URL of the remote OBEX service. This state is responsible * for establishing the connection */ public SendState(ExchangerStateParent _parent, String _url) { super(_parent); url = _url; } /* * SendState does not allow to start any other business card exchange * process. * * @see bcexchanger.comm.ExchangerState#startSending() */ public void startSending(int o) throws IOException { throw new IOException( "Sending is in progress. Sending has to be canceled before starting new sending process"); } /* * SendState allows to cancel sending process. * * @see bcexchanger.comm.ExchangerState#cancelSending() */ public void cancelSending() { cancelInvoked = true; try { // cancel any active OBEX operation operation.abort(); } catch (Exception e) { // catch NullPointer exception also // Ignore, aborting anyway } try { // send DISCONNECT to the remote peer connection.disconnect(null); } catch (Exception e1) { // catch NullPointer exception also // Ignore, disconnecting anyway } try { // close the connection connection.close(); // } catch (Exception e2) { // catch NullPointer exception also // Ignore, closing anyway } } /* * This method implements the logic for sending a * business card * */ public void doSend() { try { connection = (ClientSession) Connector.open(url); HeaderSet response = connection.connect(null); // Initiate the PUT request operation = connection.put(null); OutputStream out = operation.openOutputStream(); //getting the own card byte[] vCard = parent.getListener().getOwnBC(); 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); //sending data out.write(tmpBuf); out.close(); int responseCode = operation.getResponseCode(); operation.close(); if (cancelInvoked) { throw new Exception( "Cancel did not invoke any exception; throw exception then"); } // send is done try { parent.setState(new IdleState(parent)); } catch (Exception e) { } } catch (Exception e1) { parent.setState(new IdleState(parent)); if (cancelInvoked) { // if exception is caused by cancellation parent.getListener().onSendComplete(ExchangerComm.CANCELED); } else { // if exception is caused by error parent.setState(new IdleState(parent)); parent.getListener().onSendComplete(ExchangerComm.ERROR); } } finally { try { // finalizing operation operation.close(); } catch (IOException e3) { } try { // sending DISCONNECT command connection.disconnect(null); connection.close(); } catch (IOException e2) { // Ignore, disconnecting anyway } } } /* * Server OBEX GET command is supported only in IdleState * * @see bcexchanger.comm.ExchangerState#onGet(javax.obex.Operation) */ public int onGet(Operation op) { return ResponseCodes.OBEX_HTTP_CONFLICT; } /* * Server OBEX PUT command is supported only in IdleState * * @see bcexchanger.comm.ExchangerState#onPut(javax.obex.Operation) */ public int onPut(Operation op) { return ResponseCodes.OBEX_HTTP_CONFLICT; } }