]>
git.ipfire.org Git - thirdparty/cups.git/blob - scripting/java/src/com/easysw/cups/IPPAttribute.java
1 package com
.easysw
.cups
;
4 * @version 1.00 06-NOV-2002
7 * Internet Printing Protocol definitions for the Common UNIX Printing
10 * Copyright 2007 by Apple Inc.
11 * Copyright 1997-2002 by Easy Software Products.
13 * These coded instructions, statements, and computer programs are the
14 * property of Apple Inc. and are protected by Federal copyright
15 * law. Distribution and use rights are outlined in the file "LICENSE.txt"
16 * which should have been included with this file. If this file is
17 * file is missing or damaged, see the license at "http://www.cups.org/".
20 * An <code>IPPAttribute</code> object hold attributes for communicating
21 * messages to / from the CUPS server.
29 public class IPPAttribute
38 public IPPAttribute( int p_group_tag
, int p_value_tag
,
41 group_tag
= p_group_tag
;
42 value_tag
= p_value_tag
;
44 values
= new ArrayList();
46 } // End of IPPAttribute constructor.
50 // Add a boolean value to the objects values list.
52 public boolean addBoolean( boolean p_bool
)
54 IPPValue val
= new IPPValue( p_bool
);
61 // Add a set of boolean values to the objects values list.
63 public boolean addBooleans( boolean p_bools
[] )
65 if (p_bools
.length
< 1)
68 for (int i
=0; i
< p_bools
.length
; i
++ )
70 IPPValue val
= new IPPValue( p_bools
[i
] );
78 // Add an enum value to the objects values list.
80 public boolean addEnum( int p_int
)
82 IPPValue val
= new IPPValue( p_int
, true );
89 // Add an integer value to the objects values list.
91 public boolean addInteger( int p_int
)
93 IPPValue val
= new IPPValue( p_int
);
100 // Add a set of integer values to the objects values list.
102 public boolean addIntegers( int p_ints
[] )
104 if (p_ints
.length
< 1)
107 for (int i
=0; i
< p_ints
.length
; i
++ )
109 IPPValue val
= new IPPValue( p_ints
[i
] );
117 // Add a string value to the objects values list.
119 public boolean addString( String p_charset
, String p_text
)
125 // Force the value to English for POSIX locale.
127 if ((value_tag
== IPPDefs
.TAG_LANGUAGE
) && (p_text
== "C"))
138 // Convert language values to lowercase and _ to - as needed.
140 if ((value_tag
== IPPDefs
.TAG_LANGUAGE
) ||
141 (value_tag
== IPPDefs
.TAG_CHARSET
))
143 StringBuffer temp
= new StringBuffer(l_value
.length());
145 for (int i
= 0; i
< l_value
.length(); i
++)
147 c
= l_value
.charAt(i
);
150 else if (Character
.isUpperCase(c
))
151 c
= Character
.toLowerCase(c
);
154 final_value
= temp
.toString();
158 final_value
= l_value
;
160 IPPValue val
= new IPPValue( p_charset
, final_value
);
167 // Add a set of strings to the objects values list.
169 public boolean addStrings( String p_charset
, String p_texts
[] )
171 if (p_texts
.length
< 1)
175 // Just call the singular string method to save on coding.
177 for (int i
=0; i
< p_texts
.length
; i
++ )
179 addString( p_charset
, p_texts
[i
] );
185 // Add an ipp date value to the objects values list.
187 public boolean addDate( char p_date
[] )
189 IPPValue val
= new IPPValue( p_date
);
195 // Add a range value to the objects values list.
197 public boolean addRange( int p_lower
, int p_upper
)
199 IPPValue val
= new IPPValue( p_lower
, p_upper
);
206 // Add a set of range values to the objects values list.
208 public boolean addRanges( int p_lower
[], int p_upper
[] )
211 // Avoid index out of bounds errors.
213 if (p_lower
.length
!= p_upper
.length
)
216 for (int i
=0; i
< p_lower
.length
; i
++ )
217 addRange( p_lower
[i
], p_upper
[i
] );
223 // Add a resolution value to the objects values list.
225 public boolean addResolution( byte p_units
, int p_xres
, int p_yres
)
227 IPPValue val
= new IPPValue( p_units
, p_xres
, p_yres
);
234 // Add a set of resolution values to the objects values list.
236 public boolean addResolutions( byte p_units
, int p_xres
[], int p_yres
[] )
238 if (p_xres
.length
!= p_yres
.length
)
241 for (int i
=0; i
< p_xres
.length
; i
++)
242 addResolution( p_units
, p_xres
[i
], p_yres
[i
] );
248 // Set the attribute as a separator.
250 public boolean addSeparator()
252 value_tag
= IPPDefs
.TAG_ZERO
;
253 group_tag
= IPPDefs
.TAG_ZERO
;
260 // Calculate the size in bytes for an IPP requests attributes.
262 public int sizeInBytes(int last_group
)
265 int bytes
= 0; // Start with one for the group tag.
268 // Add 1 if first time, or group tag changes.
270 if (last_group
!= group_tag
)
273 bytes
++; // Add 1 for the value tag.
274 bytes
+= 2; // Add 2 for the name length field.
275 bytes
+= name
.length(); // Add the length of the name.
277 for (int i
=0; i
< values
.size(); i
++ )
279 val
= (IPPValue
)values
.get(i
);
283 // If an array of values, add 1 for another value tag, plus
284 // 2 for zero length name.
291 case IPPDefs
.TAG_INTEGER
:
292 case IPPDefs
.TAG_ENUM
:
297 case IPPDefs
.TAG_BOOLEAN
:
302 case IPPDefs
.TAG_TEXT
:
303 case IPPDefs
.TAG_NAME
:
304 case IPPDefs
.TAG_KEYWORD
:
305 case IPPDefs
.TAG_STRING
:
306 case IPPDefs
.TAG_URI
:
307 case IPPDefs
.TAG_URISCHEME
:
308 case IPPDefs
.TAG_CHARSET
:
309 case IPPDefs
.TAG_LANGUAGE
:
310 case IPPDefs
.TAG_MIMETYPE
:
312 bytes
+= val
.text
.length();
315 case IPPDefs
.TAG_DATE
:
320 case IPPDefs
.TAG_RESOLUTION
:
325 case IPPDefs
.TAG_RANGE
:
330 case IPPDefs
.TAG_TEXTLANG
:
331 case IPPDefs
.TAG_NAMELANG
:
332 bytes
+= 6; // 2 overall len, 2 charset len, 2 text len
333 bytes
+= val
.charset
.length() +
339 if (val
.data
!= null)
340 bytes
+= val
.data
.length
;
345 // bytes++; // 1 byte for end of values tag.
349 } // End of IPPAttribute.sizeInBytes()
353 // Get the characters of an attribute
355 public byte[] getBytes( int sz
, int last_group
)
360 int bi
= 0; // Start with one for the group tag.
361 byte[] bytes
= new byte[sz
];
363 if (group_tag
!= last_group
)
365 bytes
[bi
++] = (byte)group_tag
;
366 last_group
= group_tag
;
368 bytes
[bi
++] = (byte)value_tag
;
370 bytes
[bi
++] = (byte)((name
.length() & 0xff00) >> 8);
371 bytes
[bi
++] = (byte)(name
.length() & 0xff);
372 for (j
=0; j
< name
.length(); j
++)
373 bytes
[bi
++] = (byte)name
.charAt(j
);
375 for (i
=0; i
< values
.size(); i
++ )
379 bytes
[bi
++] = (byte)value_tag
;
380 bytes
[bi
++] = (byte)0;
381 bytes
[bi
++] = (byte)0;
384 val
= (IPPValue
)values
.get(i
);
387 case IPPDefs
.TAG_INTEGER
:
388 case IPPDefs
.TAG_ENUM
:
389 bytes
[bi
++] = (byte)0;
390 bytes
[bi
++] = (byte)4;
391 bytes
[bi
++] = (byte)((val
.integer_value
& 0xff000000) >> 24);
392 bytes
[bi
++] = (byte)((val
.integer_value
& 0xff0000) >> 16);
393 bytes
[bi
++] = (byte)((val
.integer_value
& 0xff00) >> 8);
394 bytes
[bi
++] = (byte)(val
.integer_value
& 0xff);
397 case IPPDefs
.TAG_BOOLEAN
:
398 bytes
[bi
++] = (byte)0;
399 bytes
[bi
++] = (byte)1;
400 if (val
.boolean_value
)
401 bytes
[bi
++] = (byte)1;
403 bytes
[bi
++] = (byte)0;
406 case IPPDefs
.TAG_TEXT
:
407 case IPPDefs
.TAG_NAME
:
408 case IPPDefs
.TAG_KEYWORD
:
409 case IPPDefs
.TAG_STRING
:
410 case IPPDefs
.TAG_URI
:
411 case IPPDefs
.TAG_URISCHEME
:
412 case IPPDefs
.TAG_CHARSET
:
413 case IPPDefs
.TAG_LANGUAGE
:
414 case IPPDefs
.TAG_MIMETYPE
:
415 bytes
[bi
++] = (byte)((val
.text
.length() & 0xff00) >> 8);
416 bytes
[bi
++] = (byte)(val
.text
.length() & 0xff);
417 for (j
=0; j
< val
.text
.length(); j
++)
419 bytes
[bi
++] = (byte)val
.text
.charAt(j
);
423 case IPPDefs
.TAG_DATE
:
424 bytes
[bi
++] = (byte)0;
425 bytes
[bi
++] = (byte)11;
426 for (j
=0; j
< 11; j
++)
427 bytes
[bi
++] = (byte)val
.date_value
[j
];
430 case IPPDefs
.TAG_RESOLUTION
:
431 bytes
[bi
++] = (byte)0;
432 bytes
[bi
++] = (byte)9;
433 bytes
[bi
++] = (byte)((val
.xres
& 0xff000000) >> 24);
434 bytes
[bi
++] = (byte)((val
.xres
& 0xff0000) >> 16);
435 bytes
[bi
++] = (byte)((val
.xres
& 0xff00) >> 8);
436 bytes
[bi
++] = (byte)(val
.xres
& 0xff);
437 bytes
[bi
++] = (byte)((val
.yres
& 0xff000000) >> 24);
438 bytes
[bi
++] = (byte)((val
.yres
& 0xff0000) >> 16);
439 bytes
[bi
++] = (byte)((val
.yres
& 0xff00) >> 8);
440 bytes
[bi
++] = (byte)(val
.yres
& 0xff);
441 bytes
[bi
++] = (byte)val
.units
;
444 case IPPDefs
.TAG_RANGE
:
445 bytes
[bi
++] = (byte)0;
446 bytes
[bi
++] = (byte)8;
447 bytes
[bi
++] = (byte)((val
.lower
& 0xff000000) >> 24);
448 bytes
[bi
++] = (byte)((val
.lower
& 0xff0000) >> 16);
449 bytes
[bi
++] = (byte)((val
.lower
& 0xff00) >> 8);
450 bytes
[bi
++] = (byte)(val
.lower
& 0xff);
451 bytes
[bi
++] = (byte)((val
.upper
& 0xff000000) >> 24);
452 bytes
[bi
++] = (byte)((val
.upper
& 0xff0000) >> 16);
453 bytes
[bi
++] = (byte)((val
.upper
& 0xff00) >> 8);
454 bytes
[bi
++] = (byte)(val
.upper
& 0xff);
457 case IPPDefs
.TAG_TEXTLANG
:
458 case IPPDefs
.TAG_NAMELANG
:
459 n
= val
.charset
.length() +
460 val
.text
.length() + 4;
461 bytes
[bi
++] = (byte)((n
& 0xff00) >> 8);
462 bytes
[bi
++] = (byte)(n
& 0xff);
464 n
= val
.charset
.length();
465 bytes
[bi
++] = (byte)((n
& 0xff00) >> 8);
466 bytes
[bi
++] = (byte)(n
& 0xff);
467 for (j
=0; j
< val
.charset
.length(); j
++)
468 bytes
[bi
++] = (byte)val
.charset
.charAt(j
);
470 n
= val
.text
.length();
471 bytes
[bi
++] = (byte)((n
& 0xff00) >> 8);
472 bytes
[bi
++] = (byte)(n
& 0xff);
473 for (j
=0; j
< (byte)val
.text
.length(); j
++)
474 bytes
[bi
++] = (byte)val
.text
.charAt(j
);
479 if (val
.data
!= null)
482 bytes
[bi
++] = (byte)((n
& 0xff00) >> 8);
483 bytes
[bi
++] = (byte)(n
& 0xff);
484 for (j
=0; j
< val
.data
.length
; j
++)
485 bytes
[bi
++] = (byte)val
.data
[j
];
493 } // End of IPPAttribute.getBytes()
501 public void dump_values()
505 if ((values
== null) || (values
.size() < 1))
507 System
.out
.println( " ---- Separator ---- \n");
511 for (int i
=0; i
< values
.size(); i
++ )
513 val
= (IPPValue
)values
.get(i
);
515 System
.out
.println("ATTR GTAG: " + group_tag
);
516 System
.out
.println("ATTR VTAG: " + value_tag
);
517 System
.out
.println("ATTR NAME: " + name
);
519 // switch (value_tag & ~IPPDefs.TAG_COPY)
522 case IPPDefs
.TAG_INTEGER
:
523 case IPPDefs
.TAG_ENUM
:
524 System
.out
.println( " INTEGER: " + val
.integer_value
);
527 case IPPDefs
.TAG_BOOLEAN
:
528 System
.out
.println( " BOOLEAN: " + val
.boolean_value
);
531 case IPPDefs
.TAG_TEXT
:
532 case IPPDefs
.TAG_NAME
:
533 case IPPDefs
.TAG_KEYWORD
:
534 case IPPDefs
.TAG_STRING
:
535 case IPPDefs
.TAG_URI
:
536 case IPPDefs
.TAG_URISCHEME
:
537 case IPPDefs
.TAG_CHARSET
:
538 case IPPDefs
.TAG_LANGUAGE
:
539 case IPPDefs
.TAG_MIMETYPE
:
540 System
.out
.println( " CHARSET: " + val
.charset
+
541 " TEXT: " + val
.text
);
544 case IPPDefs
.TAG_DATE
:
545 System
.out
.println( " DATE: " + val
.unix_time
);
548 case IPPDefs
.TAG_RESOLUTION
:
549 System
.out
.println( " UNITS: " + val
.units
+
550 " XRES: " + val
.xres
+
551 " YRES: " + val
.yres
);
554 case IPPDefs
.TAG_RANGE
:
555 System
.out
.println( " LOWER: " + val
.lower
+
556 " UPPER: " + val
.upper
);
559 case IPPDefs
.TAG_TEXTLANG
:
560 case IPPDefs
.TAG_NAMELANG
:
561 System
.out
.println( " CHARSET: " + val
.charset
+
562 " TEXT: " + val
.text
);
565 case IPPDefs
.TAG_ZERO
:
566 System
.out
.println( " ---- Separator ---- \n");
580 } // End of IPPAttribute class