package org.cups;
import java.util.*;
public class IPPAttribute
{
int group_tag;
int value_tag;
String name;
List values;
public IPPAttribute( int p_group_tag, int p_value_tag,
String p_name )
{
group_tag = p_group_tag;
value_tag = p_value_tag;
name = p_name;
values = new ArrayList();
}
public boolean addBoolean( boolean p_bool )
{
IPPValue val = new IPPValue( p_bool );
values.add(val);
return(true);
}
public boolean addBooleans( boolean p_bools[] )
{
if (p_bools.length < 1)
return(false);
for (int i=0; i < p_bools.length; i++ )
{
IPPValue val = new IPPValue( p_bools[i] );
values.add(val);
}
return(true);
}
public boolean addEnum( int p_int )
{
IPPValue val = new IPPValue( p_int, true );
values.add(val);
return(true);
}
public boolean addInteger( int p_int )
{
IPPValue val = new IPPValue( p_int );
values.add(val);
return(true);
}
public boolean addIntegers( int p_ints[] )
{
if (p_ints.length < 1)
return(false);
for (int i=0; i < p_ints.length; i++ )
{
IPPValue val = new IPPValue( p_ints[i] );
values.add(val);
}
return(true);
}
public boolean addString( String p_charset, String p_text )
{
String l_value;
String final_value;
if ((value_tag == IPPDefs.TAG_LANGUAGE) && (p_text == "C"))
{
l_value = "en";
}
else
{
l_value = p_text;
}
if ((value_tag == IPPDefs.TAG_LANGUAGE) ||
(value_tag == IPPDefs.TAG_CHARSET))
{
StringBuffer temp = new StringBuffer(l_value.length());
char c;
for (int i = 0; i < l_value.length(); i++)
{
c = l_value.charAt(i);
if (c == '_')
c = '-';
else if (Character.isUpperCase(c))
c = Character.toLowerCase(c);
temp.append(c);
}
final_value = temp.toString();
}
else
{
final_value = l_value;
}
IPPValue val = new IPPValue( p_charset, final_value );
values.add(val);
return(true);
}
public boolean addStrings( String p_charset, String p_texts[] )
{
if (p_texts.length < 1)
return(false);
for (int i=0; i < p_texts.length; i++ )
{
addString( p_charset, p_texts[i] );
}
return(true);
}
public boolean addDate( char p_date[] )
{
IPPValue val = new IPPValue( p_date );
values.add(val);
return(true);
}
public boolean addRange( int p_lower, int p_upper )
{
IPPValue val = new IPPValue( p_lower, p_upper );
values.add(val);
return(true);
}
public boolean addRanges( int p_lower[], int p_upper[] )
{
if (p_lower.length != p_upper.length)
return(false);
for (int i=0; i < p_lower.length; i++ )
addRange( p_lower[i], p_upper[i] );
return(true);
}
public boolean addResolution( byte p_units, int p_xres, int p_yres )
{
IPPValue val = new IPPValue( p_units, p_xres, p_yres );
values.add(val);
return(true);
}
public boolean addResolutions( byte p_units, int p_xres[], int p_yres[] )
{
if (p_xres.length != p_yres.length)
return(false);
for (int i=0; i < p_xres.length; i++)
addResolution( p_units, p_xres[i], p_yres[i] );
return(true);
}
public boolean addSeparator()
{
value_tag = IPPDefs.TAG_ZERO;
group_tag = IPPDefs.TAG_ZERO;
return(true);
}
public int sizeInBytes(int last_group)
{
IPPValue val;
int bytes = 0;
if (last_group != group_tag)
bytes ++;
bytes ++; bytes += 2; bytes += name.length();
for (int i=0; i < values.size(); i++ )
{
val = (IPPValue)values.get(i);
if (i > 0)
{
bytes += 3;
}
switch (value_tag)
{
case IPPDefs.TAG_INTEGER :
case IPPDefs.TAG_ENUM :
bytes += 2;
bytes += 4;
break;
case IPPDefs.TAG_BOOLEAN :
bytes += 2;
bytes ++;
break;
case IPPDefs.TAG_TEXT:
case IPPDefs.TAG_NAME:
case IPPDefs.TAG_KEYWORD:
case IPPDefs.TAG_STRING:
case IPPDefs.TAG_URI:
case IPPDefs.TAG_URISCHEME:
case IPPDefs.TAG_CHARSET:
case IPPDefs.TAG_LANGUAGE:
case IPPDefs.TAG_MIMETYPE:
bytes += 2;
bytes += val.text.length();
break;
case IPPDefs.TAG_DATE :
bytes += 2;
bytes += 11;
break;
case IPPDefs.TAG_RESOLUTION :
bytes += 2;
bytes += 9;
break;
case IPPDefs.TAG_RANGE :
bytes += 2;
bytes += 8;
break;
case IPPDefs.TAG_TEXTLANG :
case IPPDefs.TAG_NAMELANG :
bytes += 6; bytes += val.charset.length() +
val.text.length();
break;
default :
bytes += 2;
if (val.data != null)
bytes += val.data.length;
break;
}
}
return(bytes);
}
public byte[] getBytes( int sz, int last_group )
{
IPPValue val;
int i,j, n;
int bi = 0; byte[] bytes = new byte[sz];
if (group_tag != last_group)
{
bytes[bi++] = (byte)group_tag;
last_group = group_tag;
}
bytes[bi++] = (byte)value_tag;
bytes[bi++] = (byte)((name.length() & 0xff00) >> 8);
bytes[bi++] = (byte)(name.length() & 0xff);
for (j=0; j < name.length(); j++)
bytes[bi++] = (byte)name.charAt(j);
for (i=0; i < values.size(); i++ )
{
if (i > 0)
{
bytes[bi++] = (byte)value_tag;
bytes[bi++] = (byte)0;
bytes[bi++] = (byte)0;
}
val = (IPPValue)values.get(i);
switch (value_tag)
{
case IPPDefs.TAG_INTEGER :
case IPPDefs.TAG_ENUM :
bytes[bi++] = (byte)0;
bytes[bi++] = (byte)4;
bytes[bi++] = (byte)((val.integer_value & 0xff000000) >> 24);
bytes[bi++] = (byte)((val.integer_value & 0xff0000) >> 16);
bytes[bi++] = (byte)((val.integer_value & 0xff00) >> 8);
bytes[bi++] = (byte)(val.integer_value & 0xff);
break;
case IPPDefs.TAG_BOOLEAN :
bytes[bi++] = (byte)0;
bytes[bi++] = (byte)1;
if (val.boolean_value)
bytes[bi++] = (byte)1;
else
bytes[bi++] = (byte)0;
break;
case IPPDefs.TAG_TEXT :
case IPPDefs.TAG_NAME :
case IPPDefs.TAG_KEYWORD :
case IPPDefs.TAG_STRING :
case IPPDefs.TAG_URI :
case IPPDefs.TAG_URISCHEME :
case IPPDefs.TAG_CHARSET :
case IPPDefs.TAG_LANGUAGE :
case IPPDefs.TAG_MIMETYPE :
bytes[bi++] = (byte)((val.text.length() & 0xff00) >> 8);
bytes[bi++] = (byte)(val.text.length() & 0xff);
for (j=0; j < val.text.length(); j++)
{
bytes[bi++] = (byte)val.text.charAt(j);
}
break;
case IPPDefs.TAG_DATE:
bytes[bi++] = (byte)0;
bytes[bi++] = (byte)11;
for (j=0; j < 11; j++)
bytes[bi++] = (byte)val.date_value[j];
break;
case IPPDefs.TAG_RESOLUTION :
bytes[bi++] = (byte)0;
bytes[bi++] = (byte)9;
bytes[bi++] = (byte)((val.xres & 0xff000000) >> 24);
bytes[bi++] = (byte)((val.xres & 0xff0000) >> 16);
bytes[bi++] = (byte)((val.xres & 0xff00) >> 8);
bytes[bi++] = (byte)(val.xres & 0xff);
bytes[bi++] = (byte)((val.yres & 0xff000000) >> 24);
bytes[bi++] = (byte)((val.yres & 0xff0000) >> 16);
bytes[bi++] = (byte)((val.yres & 0xff00) >> 8);
bytes[bi++] = (byte)(val.yres & 0xff);
bytes[bi++] = (byte)val.units;
break;
case IPPDefs.TAG_RANGE :
bytes[bi++] = (byte)0;
bytes[bi++] = (byte)8;
bytes[bi++] = (byte)((val.lower & 0xff000000) >> 24);
bytes[bi++] = (byte)((val.lower & 0xff0000) >> 16);
bytes[bi++] = (byte)((val.lower & 0xff00) >> 8);
bytes[bi++] = (byte)(val.lower & 0xff);
bytes[bi++] = (byte)((val.upper & 0xff000000) >> 24);
bytes[bi++] = (byte)((val.upper & 0xff0000) >> 16);
bytes[bi++] = (byte)((val.upper & 0xff00) >> 8);
bytes[bi++] = (byte)(val.upper & 0xff);
break;
case IPPDefs.TAG_TEXTLANG :
case IPPDefs.TAG_NAMELANG :
n = val.charset.length() +
val.text.length() + 4;
bytes[bi++] = (byte)((n & 0xff00) >> 8);
bytes[bi++] = (byte)(n & 0xff);
n = val.charset.length();
bytes[bi++] = (byte)((n & 0xff00) >> 8);
bytes[bi++] = (byte)(n & 0xff);
for (j=0; j < val.charset.length(); j++)
bytes[bi++] = (byte)val.charset.charAt(j);
n = val.text.length();
bytes[bi++] = (byte)((n & 0xff00) >> 8);
bytes[bi++] = (byte)(n & 0xff);
for (j=0; j < (byte)val.text.length(); j++)
bytes[bi++] = (byte)val.text.charAt(j);
break;
default :
if (val.data != null)
{
n = val.data.length;
bytes[bi++] = (byte)((n & 0xff00) >> 8);
bytes[bi++] = (byte)(n & 0xff);
for (j=0; j < val.data.length; j++)
bytes[bi++] = (byte)val.data[j];
}
break;
}
}
return(bytes);
}
public void dump_values()
{
IPPValue val;
if ((values == null) || (values.size() < 1))
{
System.out.println( " ---- Separator ---- \n");
return;
}
for (int i=0; i < values.size(); i++ )
{
val = (IPPValue)values.get(i);
System.out.println("ATTR GTAG: " + group_tag );
System.out.println("ATTR VTAG: " + value_tag );
System.out.println("ATTR NAME: " + name );
switch (value_tag)
{
case IPPDefs.TAG_INTEGER :
case IPPDefs.TAG_ENUM :
System.out.println( " INTEGER: " + val.integer_value );
break;
case IPPDefs.TAG_BOOLEAN :
System.out.println( " BOOLEAN: " + val.boolean_value );
break;
case IPPDefs.TAG_TEXT :
case IPPDefs.TAG_NAME :
case IPPDefs.TAG_KEYWORD :
case IPPDefs.TAG_STRING :
case IPPDefs.TAG_URI :
case IPPDefs.TAG_URISCHEME :
case IPPDefs.TAG_CHARSET :
case IPPDefs.TAG_LANGUAGE :
case IPPDefs.TAG_MIMETYPE :
System.out.println( " CHARSET: " + val.charset +
" TEXT: " + val.text );
break;
case IPPDefs.TAG_DATE :
System.out.println( " DATE: " + val.unix_time );
break;
case IPPDefs.TAG_RESOLUTION :
System.out.println( " UNITS: " + val.units +
" XRES: " + val.xres +
" YRES: " + val.yres );
break;
case IPPDefs.TAG_RANGE :
System.out.println( " LOWER: " + val.lower +
" UPPER: " + val.upper );
break;
case IPPDefs.TAG_TEXTLANG :
case IPPDefs.TAG_NAMELANG :
System.out.println( " CHARSET: " + val.charset +
" TEXT: " + val.text );
break;
case IPPDefs.TAG_ZERO:
System.out.println( " ---- Separator ---- \n");
break;
default :
break;
}
}
return;
}
}