www.pudn.com > bluecove-1.2.1-src.zip > BluetoothStreamConnectionNotifier.java, change:2007-01-07,size:4578b


/*
 Copyright 2004 Intel Corporation

 This file is part of Blue Cove.

 Blue Cove is free software; you can redistribute it and/or modify
 it under the terms of the GNU Lesser General Public License as published by
 the Free Software Foundation; either version 2.1 of the License, or
 (at your option) any later version.

 Blue Cove is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU Lesser General Public License for more details.

 You should have received a copy of the GNU Lesser General Public License
 along with Blue Cove; if not, write to the Free Software
 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */
package com.intel.bluetooth;

import java.io.IOException;

import javax.bluetooth.DataElement;
import javax.bluetooth.LocalDevice;
import javax.bluetooth.ServiceRecord;
import javax.bluetooth.UUID;
import javax.microedition.io.StreamConnection;
import javax.microedition.io.StreamConnectionNotifier;

public class BluetoothStreamConnectionNotifier implements
		StreamConnectionNotifier {
	private int socket;

	private int handle;

	ServiceRecord serviceRecord;

	private boolean closed;

	public BluetoothStreamConnectionNotifier(UUID uuid, boolean authenticate,
			boolean encrypt, String name) throws IOException {
		/*
		 * open socket
		 */

		BluetoothPeer peer = ((LocalDevice) LocalDevice.getLocalDevice())
				.getBluetoothPeer();

		socket = peer.socket(authenticate, encrypt);

		peer.listen(socket);

		/*
		 * create service record
		 */

		serviceRecord = new ServiceRecordImpl(null, 0);

		/*
		 * service handle (direct insert to avoid IllegalArgumentException from
		 * setAttributeValue)
		 */

		((ServiceRecordImpl) serviceRecord).attributes.put(new Integer(
				ServiceRecord.ServiceRecordHandle), new DataElement(
				DataElement.U_INT_4, 0x00010020));

		/*
		 * service class ID list
		 */

		DataElement serviceClassIDList = new DataElement(DataElement.DATSEQ);
		serviceClassIDList.addElement(new DataElement(DataElement.UUID, uuid));

		serviceRecord.setAttributeValue(ServiceRecord.ServiceClassIDList,
				serviceClassIDList);

		/*
		 * protocol descriptor list
		 */

		DataElement protocolDescriptorList = new DataElement(DataElement.DATSEQ);

		DataElement L2CAPDescriptor = new DataElement(DataElement.DATSEQ);
		L2CAPDescriptor.addElement(new DataElement(DataElement.UUID,
				UUID.L2CAP_PROTOCOL_UUID));
		protocolDescriptorList.addElement(L2CAPDescriptor);

		DataElement RFCOMMDescriptor = new DataElement(DataElement.DATSEQ);
		RFCOMMDescriptor.addElement(new DataElement(DataElement.UUID,
				UUID.RFCOMM_PROTOCOL_UUID));
		RFCOMMDescriptor.addElement(new DataElement(DataElement.U_INT_1, peer
				.getsockchannel(socket)));
		protocolDescriptorList.addElement(RFCOMMDescriptor);

		serviceRecord.setAttributeValue(ServiceRecord.ProtocolDescriptorList,
				protocolDescriptorList);

		/*
		 * name
		 */

		if (name != null)
			serviceRecord.setAttributeValue(0x0100, new DataElement(
					DataElement.STRING, name));

		/*
		 * register service
		 */

		handle = peer.registerService(((ServiceRecordImpl) serviceRecord)
				.toByteArray());
	}

	/*
	 * Close the connection. When a connection has been closed, access to any of
	 * its methods except this close() will cause an an IOException to be
	 * thrown. Closing an already closed connection has no effect. Streams
	 * derived from the connection may be open when method is called. Any open
	 * streams will cause the connection to be held open until they themselves
	 * are closed. In this latter case access to the open streams is permitted,
	 * but access to the connection is not.
	 * 
	 * Throws: IOException - If an I/O error occurs
	 */

	public void close() throws IOException {
		if (!closed) {
			BluetoothPeer peer = ((LocalDevice) LocalDevice.getLocalDevice())
					.getBluetoothPeer();

			/*
			 * close socket
			 */

			peer.close(socket);

			/*
			 * unregister service
			 */

			peer.unregisterService(handle);

			closed = true;
		}
	}

	/*
	 * Returns a StreamConnection that represents a server side socket
	 * connection. Returns: A socket to communicate with a client. Throws:
	 * IOException - If an I/O error occurs.
	 */

	public StreamConnection acceptAndOpen() throws IOException {
		return new BluetoothConnection(((LocalDevice) LocalDevice
				.getLocalDevice()).getBluetoothPeer().accept(socket));
	}

	public ServiceRecord getServiceRecord() {
		return serviceRecord;
	}
}