/****************************************************************************** * Copyright (c) 2009 Remy Chi Jian Suen and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Remy Chi Jian Suen - initial API and implementation ******************************************************************************/ package org.eclipse.ecf.provider.datashare.nio; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.ObjectOutputStream; import java.nio.ByteBuffer; import java.nio.channels.Channel; import java.nio.channels.ReadableByteChannel; import java.nio.channels.WritableByteChannel; import org.eclipse.ecf.core.identity.ID; final class Util { static final String PLUGIN_ID = "org.eclipse.ecf.provider.datashare.nio"; //$NON-NLS-1$ static void closeChannel(Channel channel) { try { channel.close(); } catch (IOException e) { // ignored } } static byte[] serialize(ID id) throws IOException { ByteArrayOutputStream baos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(baos); oos.writeObject(id); oos.flush(); return baos.toByteArray(); } /** * Reads messages from the channel and returns the data, if any. * * @param channel * the channel to read the messages from * @param buffer * the buffer to use for reading the data into * @return the data from the channel and information about the channel, will * not be <code>null</code> * @throws IOException */ static ChannelData read(ReadableByteChannel channel, ByteBuffer buffer) throws IOException { // check how much data has been read int read = channel.read(buffer); if (read == -1) { return new ChannelData(null, false); } else if (read == 0) { return new ChannelData(null, true); } // the read data byte[] message = new byte[read]; // retrieve the contents from the buffer buffer.flip(); buffer.get(message, 0, read); buffer.clear(); // try reading more data read = channel.read(buffer); while (read > 0) { // create a temporary array, copy what's been read so far byte[] temp = new byte[read + message.length]; System.arraycopy(message, 0, temp, 0, message.length); // retrieve the contents from the buffer buffer.flip(); buffer.get(temp, message.length, read); buffer.clear(); // assign the temporary array back to the primary message = temp; // try reading more data read = channel.read(buffer); } // if we didn't read zero bytes that'd imply we've reached end-of-stream return new ChannelData(message, read == 0); } static void write(WritableByteChannel channel, ByteBuffer buffer, byte[] data) throws IOException { buffer.clear(); int remaining = data.length; int limit = buffer.limit(); if (remaining < limit) { buffer.put(data); buffer.flip(); channel.write(buffer); buffer.clear(); return; } int offset = 0; while (remaining > limit) { buffer.put(data, offset, limit); buffer.flip(); channel.write(buffer); buffer.clear(); offset += limit; remaining -= limit; } buffer.put(data, offset, remaining); buffer.flip(); channel.write(buffer); buffer.clear(); } }