// $ID$ package org.dcache.pool.movers; import java.io.ByteArrayOutputStream; import java.io.DataOutputStream; import java.io.IOException; import java.io.OutputStream; public class VspDataOutputStream extends DataOutputStream { private static final int IOCMD_WRITE = 1; private static final int IOCMD_READ = 2; private static final int IOCMD_SEEK = 3; private static final int IOCMD_CLOSE = 4; private static final int IOCMD_INTERRUPT = 5; private static final int IOCMD_ACK = 6; private static final int IOCMD_FIN = 7; private static final int IOCMD_DATA = 8; private static final int IOCMD_LOCATE = 9; private static final int IOCMD_STATUS = 10; private static final int IOCMD_SEEK_AND_READ = 11; private static final int IOCMD_SEEK_AND_WRITE = 11; private static final int IOCMD_SEEK_SET = 0; private static final int IOCMD_SEEK_CURRENT = 1; private static final int IOCMD_SEEK_END = 2; public VspDataOutputStream(OutputStream out){ super(out); } public void writeCmdData(byte [] data, int offset, int size) throws IOException { writeInt(4); writeInt(IOCMD_DATA); writeInt(size); write(data, offset, size); writeInt(-1); flush(); } public void writeCmdSeek(long offset, int whence) throws IOException { writeInt(16); writeInt(IOCMD_SEEK); writeLong(offset); writeInt(whence); flush(); } public void writeCmdLocate() throws IOException { writeInt(4); writeInt(IOCMD_LOCATE); flush(); } public void writeCmdWrite() throws IOException { writeInt(4); writeInt(IOCMD_WRITE); flush(); } public void writeCmdRead(long size) throws IOException { writeInt(12); writeInt(IOCMD_READ); writeLong(size); flush(); } public void writeCmdSeekAndRead(long offset, int whence, long size) throws IOException { writeInt(24); writeInt(IOCMD_SEEK_AND_READ); writeLong(offset); writeInt(whence); writeLong(size); flush(); } public void writeCmdClose() throws IOException { writeInt(4); writeInt(IOCMD_CLOSE); flush(); } public void writeACK(int command) throws IOException { writeInt(12); writeInt(IOCMD_ACK); writeInt(command); writeInt(0); flush(); } public void writeACK(int command, int returnCode, String message) throws IOException { ByteArrayOutputStream baos = new ByteArrayOutputStream(); DataOutputStream dos = new DataOutputStream(baos); dos.writeUTF(message); dos.flush(); dos.close(); byte [] msgBytes = baos.toByteArray(); int len = 4 + 4 + 4 + msgBytes.length; // len = ((len-1) / 8 + 1) * 8; writeInt(len); writeInt(IOCMD_ACK); writeInt(command); writeInt(returnCode); write(msgBytes,0,msgBytes.length); flush(); } public void writeACK(long location, long size) throws IOException { writeInt(4+4+4+8+8); writeInt(IOCMD_ACK); writeInt(IOCMD_LOCATE); writeInt(0); writeLong(location); writeLong(size); flush(); } public void writeACK(long location) throws IOException { writeInt(4+4+4+8); writeInt(IOCMD_ACK); writeInt(IOCMD_SEEK); writeInt(0); writeLong(location); flush(); } public void writeFIN(int command) throws IOException { writeInt(12); writeInt(IOCMD_FIN); writeInt(command); writeInt(0); flush(); } public void writeFIN(int command, int returnCode, String message) throws IOException { ByteArrayOutputStream baos = new ByteArrayOutputStream(); DataOutputStream dos = new DataOutputStream(baos); dos.writeUTF(message); dos.flush(); dos.close(); byte [] msgBytes = baos.toByteArray(); int len = 4 + 4 + 4 + msgBytes.length; // len = ((len-1) / 8 + 1) * 8; writeInt(len); writeInt(IOCMD_FIN); writeInt(command); writeInt(returnCode); write(msgBytes,0,msgBytes.length); flush(); } public void writeDATA_HEADER() throws IOException { writeInt(4); writeInt(IOCMD_DATA); flush(); } public void writeDATA_TRAILER() throws IOException { writeInt(-1); flush(); } public void writeDATA_BLOCK(byte [] data, int offset, int size) throws IOException{ writeInt(size); write(data, offset, size); flush(); } }