com.ibm.as400.access.DDMAS400MessageReply 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: DDMAS400MessageReply.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-2000 International Business Machines Corporation and
// others. All rights reserved.
//
///////////////////////////////////////////////////////////////////////////////
package com.ibm.as400.access;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Vector;
/**
*Represents the S38MSGRM DDM data stream. This reply stream is returned
*when an error has occurred for which there is an IBM i error message(s).
*Format:
* Bytes Description
* ---------- -------------------------------------------------------
* 0-5 Header
* 6-9 LL-CP for S38MSGRM
* The folowing items are optional and may or may not exist.
* ? LL-CP, 16-bit severity code
* ? LL-CP, 7-byte message id
* ? LL-CP, 2-byte msg type
* ? LL-CP, message file name
* ? LL-CP, server diagnostic info
* ? LL-CP, message replacement data
* ? LL-CP, message text
**/
class DDMAS400MessageReply extends DDMReplyDataStream
{
ConverterImplRemote conv; //@B5C
Vector messages_ = new Vector();
String msgId_ = null;
//String msgFile_ = null;
//String msgReplData_ = null;
String msgText_ = null;
//int msgType_ = -1; // Set msgType_ to -1 to indicate that it has not been set
//String srvDiagnostic_ = null;
int svrCode_ = -1; // Set svrCode_ to -1 to indicate that it has not been set
/**
*Constructs an S38MSGRM reply message data stream.
*@param system The system we are connected to.
*Used to determine CCSID/encoding for conversions.
*@param data the S38MSGRM data
**/
DDMAS400MessageReply(AS400ImplRemote system, byte[] data) //@B5C
throws AS400SecurityException,
InterruptedException,
IOException
{
super(data);
conv = ConverterImplRemote.getConverter(system.getCcsid(), system); //@B5C
parseMessageInfo();
}
/**
*Returns the first AS400Message object associated with this object.
*@return the first AS400Message object associated with this object.
**/
AS400Message getAS400Message()
{
return (messages_.size() > 0)? (AS400Message)messages_.elementAt(0): new AS400Message();
}
/**
*Returns the AS400Message objects associated with this object.
*@return the AS400Message objects associated with this object.
**/
AS400Message[] getAS400MessageList()
{
if (messages_.size() > 0)
{
AS400Message[] msgList = new AS400Message[messages_.size()];
messages_.copyInto(msgList);
return msgList;
}
return new AS400Message[0];
}
/**
*Extracts the AS400Messages from the data supplied on the constructor
*for this object.
**/
void parseMessageInfo()
{
int offset = 8; // Start after header
int length;
int codePoint;
while(offset < data_.length)
{ // Go through the data extracting AS400Messages
codePoint = get16bit(offset);
length = get16bit(offset - 2);
if (codePoint == DDMTerm.S38MSGRM)
{ // This is an AS400Message; extract it.
AS400Message msg = getMessage(offset + 2, length - 4);
messages_.addElement(msg);
}
offset += length;
}
}
/**
*Extracts the message details for a single AS400Message.
*@param offset the offset in data_ at which to start extracting.
*@param len the length of the data for this AS400Message.
*@return the AS400Message that the data represents.
**/
AS400Message getMessage(int offset, int len)
{
int end = offset + len;
boolean done = false;
int codePoint = get16bit(offset + 2);
int length;
while (!done && (offset < end))
{ // Extract the information we want (if it exists) from the message data
length = get16bit(offset); // Length of a particular piece of message info
codePoint = get16bit(offset + 2); // Code point indicating which particular
// piece of message info we are at.
switch(codePoint)
{
case DDMTerm.SVRCOD: // Severity code; we want it
svrCode_ = get16bit(offset + 4);
offset += length;
break;
case DDMTerm.S38MID: // Message id; we want it
msgId_ = conv.byteArrayToString(data_, offset + 4, length - 4);
offset += length;
break;
case DDMTerm.S38MTEXT: // Message text; we want it
msgText_ = conv.byteArrayToString(data_, offset + 6, get16bit(offset + 4));
offset += length;
break;
case DDMTerm.S38MTYPE: // Message type
case DDMTerm.S38MDATA: // Message substitution data (already in message text)
case DDMTerm.S38MFILE: // Message file
case DDMTerm.SRVDGN: // Server diagnostics
offset += length; // We don't want any of these
break;
default: // Done with this particular AS400Message
done = true;
break;
}
}
// Create an AS400Message object to add to our list of AS400Messages in this reply
// msgId_ and msgText_ may be null if no information was supplied by the
// server for these items (yes it does happen, see AS400File.close())
AS400Message msg = new AS400Message(msgId_, msgText_);
if (svrCode_ != -1)
{
msg.setSeverity(svrCode_);
}
return msg;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy