/*******************************************************************************
* This file is protected by Copyright.
* Please refer to the COPYRIGHT file distributed with this source distribution.
*
* This file is part of REDHAWK IDE.
*
* 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
*******************************************************************************/
package gov.redhawk.datalist.ui.internal;
import gov.redhawk.bulkio.util.BulkIOType;
import gov.redhawk.datalist.ui.DataListPlugin;
import gov.redhawk.datalist.ui.Sample;
import gov.redhawk.ide.snapshot.capture.IDataReceiver;
import gov.redhawk.ide.snapshot.writer.IDataWriter;
import gov.redhawk.ide.snapshot.writer.IDataWriterSettings;
import java.io.IOException;
import java.lang.reflect.Array;
import java.util.Iterator;
import java.util.List;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import BULKIO.PrecisionUTCTime;
public class DataCourierReceiver implements IDataReceiver {
private DataCourier courier;
public DataCourierReceiver(DataCourier courier) {
this.courier = courier;
}
private IDataWriter writer;
@Override
public void setDataWriter(IDataWriter writer) {
this.writer = writer;
}
@Override
public IDataWriter getDataWriter() {
return writer;
}
@Override
public IStatus run(IProgressMonitor monitor) {
int dimensions = courier.getDimensions();
BulkIOType type = courier.getType();
IDataWriterSettings settings = writer.getSettings();
settings.setType(type);
writer.setSettings(settings);
List<Sample> buffer = courier.getBuffer();
int length = buffer.size();
Object data = Array.newInstance(type.getJavaType(), length);
PrecisionUTCTime time = buffer.get(0).getTime();
Iterator<Sample> iterator = buffer.iterator();
for (int i = 0; i < length; i++) {
Sample s = iterator.next();
if (dimensions == 1) {
Array.set(data, i, s.getData());
} else {
System.arraycopy(s.getData(), 0, data, i * dimensions, dimensions);
}
}
try {
writer.pushSRI(this.courier.getStreamSRI());
writer.open();
try {
switch (type) {
case CHAR:
writer.pushPacket((char[]) data, 0, length, time);
break;
case DOUBLE:
writer.pushPacket((double[]) data, 0, length, time);
break;
case FLOAT:
writer.pushPacket((float[]) data, 0, length, time);
break;
case LONG:
writer.pushPacket((int[]) data, 0, length, time);
break;
case LONG_LONG:
writer.pushPacket((long[]) data, 0, length, time);
break;
case OCTET:
writer.pushPacket((byte[]) data, 0, length, time);
break;
case SHORT:
writer.pushPacket((short[]) data, 0, length, time);
break;
case ULONG:
writer.pushPacket((int[]) data, 0, length, time);
break;
case ULONG_LONG:
writer.pushPacket((long[]) data, 0, length, time);
break;
case USHORT:
writer.pushPacket((short[]) data, 0, length, time);
break;
default:
return new Status(Status.ERROR, DataListPlugin.PLUGIN_ID, "Unknown data type: " + type, null);
}
} catch (IOException e) {
return new Status(Status.ERROR, DataListPlugin.PLUGIN_ID, "Failed to write packet data", e);
}
} catch (IOException e) {
return new Status(Status.ERROR, DataListPlugin.PLUGIN_ID, "Failed to open writer", e);
} finally {
try {
writer.close();
} catch (IOException e) {
return new Status(Status.ERROR, DataListPlugin.PLUGIN_ID, "Failed to close writer", e);
}
}
return Status.OK_STATUS;
}
}