]> git.ipfire.org Git - thirdparty/cups.git/blobdiff - scripting/java/src/com/easysw/cups/IPPAttribute.java
Load cups into easysw/current.
[thirdparty/cups.git] / scripting / java / src / com / easysw / cups / IPPAttribute.java
diff --git a/scripting/java/src/com/easysw/cups/IPPAttribute.java b/scripting/java/src/com/easysw/cups/IPPAttribute.java
new file mode 100644 (file)
index 0000000..269a438
--- /dev/null
@@ -0,0 +1,593 @@
+package com.easysw.cups;
+
+/**
+ * @version 1.00 06-NOV-2002
+ * @author  Easy Software Products
+ *
+ *   Internet Printing Protocol definitions for the Common UNIX Printing
+ *   System (CUPS).
+ *
+ *   Copyright 1997-2002 by Easy Software Products.
+ *
+ *   These coded instructions, statements, and computer programs are the
+ *   property of Easy Software Products and are protected by Federal
+ *   copyright law.  Distribution and use rights are outlined in the file
+ *   "LICENSE.txt" which should have been included with this file.  If this
+ *   file is missing or damaged please contact Easy Software Products
+ *   at:
+ *
+ *       Attn: CUPS Licensing Information
+ *       Easy Software Products
+ *       44141 Airport View Drive, Suite 204
+ *       Hollywood, Maryland 20636-3111 USA
+ *
+ *       Voice: (301) 373-9603
+ *       EMail: cups-info@cups.org
+ *         WWW: http://www.cups.org
+ */
+/**
+ * An <code>IPPAttribute</code> object hold attributes for communicating
+ * messages to / from the CUPS server.
+ *
+ * @author     TDB
+ * @version    1.0
+ * @since      JDK1.3
+ */
+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();
+
+  }  // End of IPPAttribute constructor.
+
+
+  //
+  //  Add a boolean value to the objects values list.
+  //
+  public boolean addBoolean( boolean p_bool )
+  {
+    IPPValue val = new IPPValue( p_bool );
+    values.add(val);
+    return(true);
+  }
+
+
+  //
+  //  Add a set of boolean values to the objects values list.
+  //
+  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);
+  }
+
+
+  //
+  //  Add an enum value to the objects values list.
+  //
+  public boolean addEnum( int p_int )
+  {
+    IPPValue val = new IPPValue( p_int, true );
+    values.add(val);
+    return(true);
+  }
+
+
+  //
+  //  Add an integer value to the objects values list.
+  //
+  public boolean addInteger( int p_int )
+  {
+    IPPValue val = new IPPValue( p_int );
+    values.add(val);
+    return(true);
+  }
+
+
+  //
+  //  Add a set of integer values to the objects values list.
+  //
+  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);
+  }
+
+
+  //
+  //  Add a string value to the objects values list.
+  //
+  public boolean addString( String p_charset, String p_text )
+  {
+    String l_value;
+    String final_value;
+
+    //
+    //  Force the value to English for POSIX locale.
+    //
+    if ((value_tag == IPPDefs.TAG_LANGUAGE) && (p_text == "C"))
+    {
+      l_value = "en";
+    }
+    else
+    {
+      l_value = p_text;
+    }
+
+    
+    //
+    //  Convert language values to lowercase and _ to - as needed.
+    //
+    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);
+  }
+
+
+  //
+  //  Add a set of strings to the objects values list.
+  //
+  public boolean addStrings( String p_charset, String p_texts[] )
+  {
+    if (p_texts.length < 1)
+      return(false);
+
+    //
+    //  Just call the singular string method to save on coding.
+    //
+    for (int i=0; i < p_texts.length; i++ )
+    {
+      addString( p_charset, p_texts[i] );
+    }
+    return(true);
+  }
+
+  //
+  //  Add an ipp date value to the objects values list.
+  //
+  public boolean addDate( char p_date[] )
+  {
+    IPPValue val = new IPPValue( p_date );
+    values.add(val);
+    return(true);
+  }
+
+  //
+  //  Add a range value to the objects values list.
+  //
+  public boolean addRange( int p_lower, int p_upper )
+  {
+    IPPValue val = new IPPValue( p_lower, p_upper );
+    values.add(val);
+    return(true);
+  }
+
+
+  //
+  //  Add a set of range values to the objects values list.
+  //
+  public boolean addRanges( int p_lower[], int p_upper[] )
+  {
+    //
+    // Avoid index out of bounds errors.
+    //
+    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);
+  }
+
+
+  //
+  //  Add a resolution value to the objects values list.
+  //
+  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);
+  }
+
+
+  //
+  //  Add a set of resolution values to the objects values list.
+  //
+  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);
+  }
+
+
+  //
+  //  Set the attribute as a separator.
+  //
+  public boolean addSeparator()
+  {
+    value_tag = IPPDefs.TAG_ZERO;
+    group_tag = IPPDefs.TAG_ZERO;
+    return(true);
+  }
+
+
+
+  //
+  //  Calculate the size in bytes for an IPP requests attributes.
+  //
+  public int sizeInBytes(int last_group)
+  {
+    IPPValue val;
+    int      bytes = 0;          // Start with one for the group tag.
+   
+    //
+    //  Add 1 if first time, or group tag changes.
+    //
+    if (last_group != group_tag)
+      bytes ++;
+
+    bytes ++;                    // Add 1 for the value tag.
+    bytes += 2;                  // Add 2 for the name length field.
+    bytes += name.length();      // Add the length of the name.
+    for (int i=0; i < values.size(); i++ )
+    {
+      val = (IPPValue)values.get(i);
+
+      if (i > 0)
+      {
+        //  If an array of values, add 1 for another value tag, plus
+        //  2 for zero length name.
+        //
+        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;  // 2 overall len, 2 charset len, 2 text len
+           bytes += val.charset.length() +
+                    val.text.length();
+           break;
+
+        default :
+            bytes += 2;
+            if (val.data != null)
+              bytes += val.data.length;
+           break;
+      }
+    }
+
+    // bytes++;   // 1 byte for end of values tag.
+
+    return(bytes);
+
+  }  // End of IPPAttribute.sizeInBytes()
+
+
+  //
+  //  Get the characters of an attribute
+  //
+  public byte[] getBytes( int sz, int last_group  )
+  {
+    IPPValue val;
+
+    int    i,j, n;
+    int    bi    = 0;          // Start with one for the group tag.
+    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);
+
+  }  // End of IPPAttribute.getBytes()
+
+
+
+
+  //
+  // 
+  //
+  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 & ~IPPDefs.TAG_COPY)
+      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;
+
+  }  
+
+
+
+
+}  // End of IPPAttribute class
+
+
+
+