com.ibm.as400.access.IFSWriteReq Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of jt400 Show documentation
Show all versions of jt400 Show documentation
The Open Source version of the IBM Toolbox for Java
The newest version!
///////////////////////////////////////////////////////////////////////////////
//
// JTOpen (IBM Toolbox for Java - OSS version)
//
// Filename: IFSWriteReq.java
//
// The source code contained herein is licensed under the IBM Public License
// Version 1.0, which has been approved by the Open Source Initiative.
// Copyright (C) 1997-2004 International Business Machines Corporation and
// others. All rights reserved.
//
///////////////////////////////////////////////////////////////////////////////
package com.ibm.as400.access;
/**
"Write data" request.
**/
class IFSWriteReq extends IFSDataStreamReq
{
private static final int HEADER_LENGTH = 20;
private static final int FILE_HANDLE_OFFSET = 22;
private static final int BASE_OFFSET_OFFSET = 26;
private static final int RELATIVE_OFFSET_OFFSET = 30;
private static final int DATA_FLAGS_OFFSET = 34;
private static final int CCSID_OFFSET = 36;
// Additional fields if datastreamLevel >= 16:
private static final int LARGE_BASE_OFFSET_OFFSET = 38;
private static final int LARGE_RELATIVE_OFFSET_OFFSET = 46;
/**
Construct a write request.
@param fileHandle the file handle
@param fileOffset the offset (in bytes) in the file
@param data the data to write
@param dataOffset the offset (in bytes) in the data to write
@param dataLength the number of bytes to write
@param dataCCSID the code page and character set of data (0xffff if unknown)
@param forceToStorage if the data must be written to disk before the server replies
@param datastreamLevel the datastream level of the server
**/
IFSWriteReq(int fileHandle,
long fileOffset,
byte[] data,
int dataOffset,
int dataLength,
int dataCCSID,
boolean forceToStorage,
int datastreamLevel)
{
super(HEADER_LENGTH + getTemplateLength(datastreamLevel) + 6 + dataLength);
setLength(data_.length);
setTemplateLen(getTemplateLength(datastreamLevel));
setReqRepID(0x0004);
set32bit(fileHandle, FILE_HANDLE_OFFSET);
// Set the beginning data offset. Use a base offset of zero.
setOffsetFields(fileOffset, datastreamLevel);
// Request a reply.
// If forceToStorage is true, need a sync write, thus both bits
// need to be turned on. Otherwise, only bit 1 needs to be on.
set16bit( (forceToStorage) ? 3 : 2 , DATA_FLAGS_OFFSET);
// Set data CCSID
set16bit(dataCCSID, CCSID_OFFSET);
// Set the data LL.
set32bit(dataLength + 6, getFileDataLLOffset(datastreamLevel));
// Set the code point.
set16bit(0x0020, getFileDataCPOffset(datastreamLevel));
// Copy the data to be written, into the "file data" field of the request.
System.arraycopy(data, dataOffset, data_, getFileDataOffset(datastreamLevel), dataLength);
}
private final static int getTemplateLength(int datastreamLevel)
{
return (datastreamLevel < 16 ? 18 : 34);
}
// Determine offset (from beginning of request) to the 4-byte File Data "LL" field.
private final static int getFileDataLLOffset(int datastreamLevel)
{
return (datastreamLevel < 16 ? 38 : 54);
}
// Determine offset (from beginning of request) to the 2-byte File Data "CP" field.
private final static int getFileDataCPOffset(int datastreamLevel)
{
return (datastreamLevel < 16 ? 42 : 58);
}
// Determine offset (from beginning of request) to the File Data value field (follows LL/CP).
private final static int getFileDataOffset(int datastreamLevel)
{
return (datastreamLevel < 16 ? 44 : 60);
}
// Sets the values of the fields relating to data offset.
private final void setOffsetFields(long fileOffset, int datastreamLevel)
{
if (datastreamLevel < 16)
{ // Just set the old fields.
if (fileOffset > (long)Integer.MAX_VALUE)
{
if (Trace.traceOn_) Trace.log(Trace.WARNING, "Specified fileOffset value ("+fileOffset+") exceeds maximum file length supported by system.");
fileOffset = (long)Integer.MAX_VALUE; // set to maximum possible 'int' value
}
set32bit(0, BASE_OFFSET_OFFSET);
set32bit((int)fileOffset, RELATIVE_OFFSET_OFFSET);
}
else
{
// Old fields must be zero.
set32bit(0, BASE_OFFSET_OFFSET);
set32bit(0, RELATIVE_OFFSET_OFFSET);
// Also set the new "large" fields.
set64bit(0L, LARGE_BASE_OFFSET_OFFSET);
set64bit(fileOffset, LARGE_RELATIVE_OFFSET_OFFSET);
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy