]>
git.ipfire.org Git - thirdparty/cups.git/blob - scripting/java/src/com/easysw/cups/IPPAttribute.java
269a438855695df4c61ab81db86c8ea032b48592
1 package com
.easysw
.cups
;
4 * @version 1.00 06-NOV-2002
5 * @author Easy Software Products
7 * Internet Printing Protocol definitions for the Common UNIX Printing
10 * Copyright 1997-2002 by Easy Software Products.
12 * These coded instructions, statements, and computer programs are the
13 * property of Easy Software Products and are protected by Federal
14 * copyright law. Distribution and use rights are outlined in the file
15 * "LICENSE.txt" which should have been included with this file. If this
16 * file is missing or damaged please contact Easy Software Products
19 * Attn: CUPS Licensing Information
20 * Easy Software Products
21 * 44141 Airport View Drive, Suite 204
22 * Hollywood, Maryland 20636-3111 USA
24 * Voice: (301) 373-9603
25 * EMail: cups-info@cups.org
26 * WWW: http://www.cups.org
29 * An <code>IPPAttribute</code> object hold attributes for communicating
30 * messages to / from the CUPS server.
38 public class IPPAttribute
47 public IPPAttribute( int p_group_tag
, int p_value_tag
,
50 group_tag
= p_group_tag
;
51 value_tag
= p_value_tag
;
53 values
= new ArrayList();
55 } // End of IPPAttribute constructor.
59 // Add a boolean value to the objects values list.
61 public boolean addBoolean( boolean p_bool
)
63 IPPValue val
= new IPPValue( p_bool
);
70 // Add a set of boolean values to the objects values list.
72 public boolean addBooleans( boolean p_bools
[] )
74 if (p_bools
.length
< 1)
77 for (int i
=0; i
< p_bools
.length
; i
++ )
79 IPPValue val
= new IPPValue( p_bools
[i
] );
87 // Add an enum value to the objects values list.
89 public boolean addEnum( int p_int
)
91 IPPValue val
= new IPPValue( p_int
, true );
98 // Add an integer value to the objects values list.
100 public boolean addInteger( int p_int
)
102 IPPValue val
= new IPPValue( p_int
);
109 // Add a set of integer values to the objects values list.
111 public boolean addIntegers( int p_ints
[] )
113 if (p_ints
.length
< 1)
116 for (int i
=0; i
< p_ints
.length
; i
++ )
118 IPPValue val
= new IPPValue( p_ints
[i
] );
126 // Add a string value to the objects values list.
128 public boolean addString( String p_charset
, String p_text
)
134 // Force the value to English for POSIX locale.
136 if ((value_tag
== IPPDefs
.TAG_LANGUAGE
) && (p_text
== "C"))
147 // Convert language values to lowercase and _ to - as needed.
149 if ((value_tag
== IPPDefs
.TAG_LANGUAGE
) ||
150 (value_tag
== IPPDefs
.TAG_CHARSET
))
152 StringBuffer temp
= new StringBuffer(l_value
.length());
154 for (int i
= 0; i
< l_value
.length(); i
++)
156 c
= l_value
.charAt(i
);
159 else if (Character
.isUpperCase(c
))
160 c
= Character
.toLowerCase(c
);
163 final_value
= temp
.toString();
167 final_value
= l_value
;
169 IPPValue val
= new IPPValue( p_charset
, final_value
);
176 // Add a set of strings to the objects values list.
178 public boolean addStrings( String p_charset
, String p_texts
[] )
180 if (p_texts
.length
< 1)
184 // Just call the singular string method to save on coding.
186 for (int i
=0; i
< p_texts
.length
; i
++ )
188 addString( p_charset
, p_texts
[i
] );
194 // Add an ipp date value to the objects values list.
196 public boolean addDate( char p_date
[] )
198 IPPValue val
= new IPPValue( p_date
);
204 // Add a range value to the objects values list.
206 public boolean addRange( int p_lower
, int p_upper
)
208 IPPValue val
= new IPPValue( p_lower
, p_upper
);
215 // Add a set of range values to the objects values list.
217 public boolean addRanges( int p_lower
[], int p_upper
[] )
220 // Avoid index out of bounds errors.
222 if (p_lower
.length
!= p_upper
.length
)
225 for (int i
=0; i
< p_lower
.length
; i
++ )
226 addRange( p_lower
[i
], p_upper
[i
] );
232 // Add a resolution value to the objects values list.
234 public boolean addResolution( byte p_units
, int p_xres
, int p_yres
)
236 IPPValue val
= new IPPValue( p_units
, p_xres
, p_yres
);
243 // Add a set of resolution values to the objects values list.
245 public boolean addResolutions( byte p_units
, int p_xres
[], int p_yres
[] )
247 if (p_xres
.length
!= p_yres
.length
)
250 for (int i
=0; i
< p_xres
.length
; i
++)
251 addResolution( p_units
, p_xres
[i
], p_yres
[i
] );
257 // Set the attribute as a separator.
259 public boolean addSeparator()
261 value_tag
= IPPDefs
.TAG_ZERO
;
262 group_tag
= IPPDefs
.TAG_ZERO
;
269 // Calculate the size in bytes for an IPP requests attributes.
271 public int sizeInBytes(int last_group
)
274 int bytes
= 0; // Start with one for the group tag.
277 // Add 1 if first time, or group tag changes.
279 if (last_group
!= group_tag
)
282 bytes
++; // Add 1 for the value tag.
283 bytes
+= 2; // Add 2 for the name length field.
284 bytes
+= name
.length(); // Add the length of the name.
286 for (int i
=0; i
< values
.size(); i
++ )
288 val
= (IPPValue
)values
.get(i
);
292 // If an array of values, add 1 for another value tag, plus
293 // 2 for zero length name.
300 case IPPDefs
.TAG_INTEGER
:
301 case IPPDefs
.TAG_ENUM
:
306 case IPPDefs
.TAG_BOOLEAN
:
311 case IPPDefs
.TAG_TEXT
:
312 case IPPDefs
.TAG_NAME
:
313 case IPPDefs
.TAG_KEYWORD
:
314 case IPPDefs
.TAG_STRING
:
315 case IPPDefs
.TAG_URI
:
316 case IPPDefs
.TAG_URISCHEME
:
317 case IPPDefs
.TAG_CHARSET
:
318 case IPPDefs
.TAG_LANGUAGE
:
319 case IPPDefs
.TAG_MIMETYPE
:
321 bytes
+= val
.text
.length();
324 case IPPDefs
.TAG_DATE
:
329 case IPPDefs
.TAG_RESOLUTION
:
334 case IPPDefs
.TAG_RANGE
:
339 case IPPDefs
.TAG_TEXTLANG
:
340 case IPPDefs
.TAG_NAMELANG
:
341 bytes
+= 6; // 2 overall len, 2 charset len, 2 text len
342 bytes
+= val
.charset
.length() +
348 if (val
.data
!= null)
349 bytes
+= val
.data
.length
;
354 // bytes++; // 1 byte for end of values tag.
358 } // End of IPPAttribute.sizeInBytes()
362 // Get the characters of an attribute
364 public byte[] getBytes( int sz
, int last_group
)
369 int bi
= 0; // Start with one for the group tag.
370 byte[] bytes
= new byte[sz
];
372 if (group_tag
!= last_group
)
374 bytes
[bi
++] = (byte)group_tag
;
375 last_group
= group_tag
;
377 bytes
[bi
++] = (byte)value_tag
;
379 bytes
[bi
++] = (byte)((name
.length() & 0xff00) >> 8);
380 bytes
[bi
++] = (byte)(name
.length() & 0xff);
381 for (j
=0; j
< name
.length(); j
++)
382 bytes
[bi
++] = (byte)name
.charAt(j
);
384 for (i
=0; i
< values
.size(); i
++ )
388 bytes
[bi
++] = (byte)value_tag
;
389 bytes
[bi
++] = (byte)0;
390 bytes
[bi
++] = (byte)0;
393 val
= (IPPValue
)values
.get(i
);
396 case IPPDefs
.TAG_INTEGER
:
397 case IPPDefs
.TAG_ENUM
:
398 bytes
[bi
++] = (byte)0;
399 bytes
[bi
++] = (byte)4;
400 bytes
[bi
++] = (byte)((val
.integer_value
& 0xff000000) >> 24);
401 bytes
[bi
++] = (byte)((val
.integer_value
& 0xff0000) >> 16);
402 bytes
[bi
++] = (byte)((val
.integer_value
& 0xff00) >> 8);
403 bytes
[bi
++] = (byte)(val
.integer_value
& 0xff);
406 case IPPDefs
.TAG_BOOLEAN
:
407 bytes
[bi
++] = (byte)0;
408 bytes
[bi
++] = (byte)1;
409 if (val
.boolean_value
)
410 bytes
[bi
++] = (byte)1;
412 bytes
[bi
++] = (byte)0;
415 case IPPDefs
.TAG_TEXT
:
416 case IPPDefs
.TAG_NAME
:
417 case IPPDefs
.TAG_KEYWORD
:
418 case IPPDefs
.TAG_STRING
:
419 case IPPDefs
.TAG_URI
:
420 case IPPDefs
.TAG_URISCHEME
:
421 case IPPDefs
.TAG_CHARSET
:
422 case IPPDefs
.TAG_LANGUAGE
:
423 case IPPDefs
.TAG_MIMETYPE
:
424 bytes
[bi
++] = (byte)((val
.text
.length() & 0xff00) >> 8);
425 bytes
[bi
++] = (byte)(val
.text
.length() & 0xff);
426 for (j
=0; j
< val
.text
.length(); j
++)
428 bytes
[bi
++] = (byte)val
.text
.charAt(j
);
432 case IPPDefs
.TAG_DATE
:
433 bytes
[bi
++] = (byte)0;
434 bytes
[bi
++] = (byte)11;
435 for (j
=0; j
< 11; j
++)
436 bytes
[bi
++] = (byte)val
.date_value
[j
];
439 case IPPDefs
.TAG_RESOLUTION
:
440 bytes
[bi
++] = (byte)0;
441 bytes
[bi
++] = (byte)9;
442 bytes
[bi
++] = (byte)((val
.xres
& 0xff000000) >> 24);
443 bytes
[bi
++] = (byte)((val
.xres
& 0xff0000) >> 16);
444 bytes
[bi
++] = (byte)((val
.xres
& 0xff00) >> 8);
445 bytes
[bi
++] = (byte)(val
.xres
& 0xff);
446 bytes
[bi
++] = (byte)((val
.yres
& 0xff000000) >> 24);
447 bytes
[bi
++] = (byte)((val
.yres
& 0xff0000) >> 16);
448 bytes
[bi
++] = (byte)((val
.yres
& 0xff00) >> 8);
449 bytes
[bi
++] = (byte)(val
.yres
& 0xff);
450 bytes
[bi
++] = (byte)val
.units
;
453 case IPPDefs
.TAG_RANGE
:
454 bytes
[bi
++] = (byte)0;
455 bytes
[bi
++] = (byte)8;
456 bytes
[bi
++] = (byte)((val
.lower
& 0xff000000) >> 24);
457 bytes
[bi
++] = (byte)((val
.lower
& 0xff0000) >> 16);
458 bytes
[bi
++] = (byte)((val
.lower
& 0xff00) >> 8);
459 bytes
[bi
++] = (byte)(val
.lower
& 0xff);
460 bytes
[bi
++] = (byte)((val
.upper
& 0xff000000) >> 24);
461 bytes
[bi
++] = (byte)((val
.upper
& 0xff0000) >> 16);
462 bytes
[bi
++] = (byte)((val
.upper
& 0xff00) >> 8);
463 bytes
[bi
++] = (byte)(val
.upper
& 0xff);
466 case IPPDefs
.TAG_TEXTLANG
:
467 case IPPDefs
.TAG_NAMELANG
:
468 n
= val
.charset
.length() +
469 val
.text
.length() + 4;
470 bytes
[bi
++] = (byte)((n
& 0xff00) >> 8);
471 bytes
[bi
++] = (byte)(n
& 0xff);
473 n
= val
.charset
.length();
474 bytes
[bi
++] = (byte)((n
& 0xff00) >> 8);
475 bytes
[bi
++] = (byte)(n
& 0xff);
476 for (j
=0; j
< val
.charset
.length(); j
++)
477 bytes
[bi
++] = (byte)val
.charset
.charAt(j
);
479 n
= val
.text
.length();
480 bytes
[bi
++] = (byte)((n
& 0xff00) >> 8);
481 bytes
[bi
++] = (byte)(n
& 0xff);
482 for (j
=0; j
< (byte)val
.text
.length(); j
++)
483 bytes
[bi
++] = (byte)val
.text
.charAt(j
);
488 if (val
.data
!= null)
491 bytes
[bi
++] = (byte)((n
& 0xff00) >> 8);
492 bytes
[bi
++] = (byte)(n
& 0xff);
493 for (j
=0; j
< val
.data
.length
; j
++)
494 bytes
[bi
++] = (byte)val
.data
[j
];
502 } // End of IPPAttribute.getBytes()
510 public void dump_values()
514 if ((values
== null) || (values
.size() < 1))
516 System
.out
.println( " ---- Separator ---- \n");
520 for (int i
=0; i
< values
.size(); i
++ )
522 val
= (IPPValue
)values
.get(i
);
524 System
.out
.println("ATTR GTAG: " + group_tag
);
525 System
.out
.println("ATTR VTAG: " + value_tag
);
526 System
.out
.println("ATTR NAME: " + name
);
528 // switch (value_tag & ~IPPDefs.TAG_COPY)
531 case IPPDefs
.TAG_INTEGER
:
532 case IPPDefs
.TAG_ENUM
:
533 System
.out
.println( " INTEGER: " + val
.integer_value
);
536 case IPPDefs
.TAG_BOOLEAN
:
537 System
.out
.println( " BOOLEAN: " + val
.boolean_value
);
540 case IPPDefs
.TAG_TEXT
:
541 case IPPDefs
.TAG_NAME
:
542 case IPPDefs
.TAG_KEYWORD
:
543 case IPPDefs
.TAG_STRING
:
544 case IPPDefs
.TAG_URI
:
545 case IPPDefs
.TAG_URISCHEME
:
546 case IPPDefs
.TAG_CHARSET
:
547 case IPPDefs
.TAG_LANGUAGE
:
548 case IPPDefs
.TAG_MIMETYPE
:
549 System
.out
.println( " CHARSET: " + val
.charset
+
550 " TEXT: " + val
.text
);
553 case IPPDefs
.TAG_DATE
:
554 System
.out
.println( " DATE: " + val
.unix_time
);
557 case IPPDefs
.TAG_RESOLUTION
:
558 System
.out
.println( " UNITS: " + val
.units
+
559 " XRES: " + val
.xres
+
560 " YRES: " + val
.yres
);
563 case IPPDefs
.TAG_RANGE
:
564 System
.out
.println( " LOWER: " + val
.lower
+
565 " UPPER: " + val
.upper
);
568 case IPPDefs
.TAG_TEXTLANG
:
569 case IPPDefs
.TAG_NAMELANG
:
570 System
.out
.println( " CHARSET: " + val
.charset
+
571 " TEXT: " + val
.text
);
574 case IPPDefs
.TAG_ZERO
:
575 System
.out
.println( " ---- Separator ---- \n");
589 } // End of IPPAttribute class