]>
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-2008 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.
266 Charset utf8
= Charset
::forName("UTF-8");
270 // Add 1 if first time, or group tag changes.
272 if (last_group
!= group_tag
)
275 bytes
++; // Add 1 for the value tag.
276 bytes
+= 2; // Add 2 for the name length field.
277 bytes
+= name
.length(); // Add the length of the name.
279 for (int i
=0; i
< values
.size(); i
++ )
281 val
= (IPPValue
)values
.get(i
);
285 // If an array of values, add 1 for another value tag, plus
286 // 2 for zero length name.
293 case IPPDefs
.TAG_INTEGER
:
294 case IPPDefs
.TAG_ENUM
:
299 case IPPDefs
.TAG_BOOLEAN
:
304 case IPPDefs
.TAG_TEXT
:
305 case IPPDefs
.TAG_NAME
:
306 case IPPDefs
.TAG_KEYWORD
:
307 case IPPDefs
.TAG_STRING
:
308 case IPPDefs
.TAG_URI
:
309 case IPPDefs
.TAG_URISCHEME
:
310 case IPPDefs
.TAG_CHARSET
:
311 case IPPDefs
.TAG_LANGUAGE
:
312 case IPPDefs
.TAG_MIMETYPE
:
313 temp
= utf8
.encode(val
.text
);
315 if (temp
.capacity() > 32767)
318 bytes
+= temp
.capacity();
321 case IPPDefs
.TAG_DATE
:
326 case IPPDefs
.TAG_RESOLUTION
:
331 case IPPDefs
.TAG_RANGE
:
336 case IPPDefs
.TAG_TEXTLANG
:
337 case IPPDefs
.TAG_NAMELANG
:
338 temp
= utf8
.encode(val
.text
);
339 bytes
+= 6; // 2 overall len, 2 charset len, 2 text len
340 bytes
+= val
.charset
.length();
341 if (temp
.capacity() > 32767)
344 bytes
+= temp
.capacity();
349 if (val
.data
!= null)
350 bytes
+= val
.data
.length
;
355 // bytes++; // 1 byte for end of values tag.
359 } // End of IPPAttribute.sizeInBytes()
363 // Get the characters of an attribute
365 public byte[] getBytes( int sz
, int last_group
)
370 int bi
= 0; // Start with one for the group tag.
371 byte[] bytes
= new byte[sz
];
372 Charset utf8
= Charset
::forName("UTF-8");
375 if (group_tag
!= last_group
)
377 bytes
[bi
++] = (byte)group_tag
;
378 last_group
= group_tag
;
380 bytes
[bi
++] = (byte)value_tag
;
382 bytes
[bi
++] = (byte)((name
.length() & 0xff00) >> 8);
383 bytes
[bi
++] = (byte)(name
.length() & 0xff);
384 for (j
=0; j
< name
.length(); j
++)
385 bytes
[bi
++] = (byte)name
.charAt(j
);
387 for (i
=0; i
< values
.size(); i
++ )
391 bytes
[bi
++] = (byte)value_tag
;
392 bytes
[bi
++] = (byte)0;
393 bytes
[bi
++] = (byte)0;
396 val
= (IPPValue
)values
.get(i
);
399 case IPPDefs
.TAG_INTEGER
:
400 case IPPDefs
.TAG_ENUM
:
401 bytes
[bi
++] = (byte)0;
402 bytes
[bi
++] = (byte)4;
403 bytes
[bi
++] = (byte)((val
.integer_value
& 0xff000000) >> 24);
404 bytes
[bi
++] = (byte)((val
.integer_value
& 0xff0000) >> 16);
405 bytes
[bi
++] = (byte)((val
.integer_value
& 0xff00) >> 8);
406 bytes
[bi
++] = (byte)(val
.integer_value
& 0xff);
409 case IPPDefs
.TAG_BOOLEAN
:
410 bytes
[bi
++] = (byte)0;
411 bytes
[bi
++] = (byte)1;
412 if (val
.boolean_value
)
413 bytes
[bi
++] = (byte)1;
415 bytes
[bi
++] = (byte)0;
418 case IPPDefs
.TAG_TEXT
:
419 case IPPDefs
.TAG_NAME
:
420 case IPPDefs
.TAG_KEYWORD
:
421 case IPPDefs
.TAG_STRING
:
422 case IPPDefs
.TAG_URI
:
423 case IPPDefs
.TAG_URISCHEME
:
424 case IPPDefs
.TAG_CHARSET
:
425 case IPPDefs
.TAG_LANGUAGE
:
426 case IPPDefs
.TAG_MIMETYPE
:
427 temp
= utf8
.encode(val
.text
);
433 bytes
[bi
++] = (byte)((n
& 0x7f00) >> 8);
434 bytes
[bi
++] = (byte)(n
& 0xff);
435 temp
.get(bytes
, bi
, n
);
439 case IPPDefs
.TAG_DATE
:
440 bytes
[bi
++] = (byte)0;
441 bytes
[bi
++] = (byte)11;
442 for (j
=0; j
< 11; j
++)
443 bytes
[bi
++] = (byte)val
.date_value
[j
];
446 case IPPDefs
.TAG_RESOLUTION
:
447 bytes
[bi
++] = (byte)0;
448 bytes
[bi
++] = (byte)9;
449 bytes
[bi
++] = (byte)((val
.xres
& 0xff000000) >> 24);
450 bytes
[bi
++] = (byte)((val
.xres
& 0xff0000) >> 16);
451 bytes
[bi
++] = (byte)((val
.xres
& 0xff00) >> 8);
452 bytes
[bi
++] = (byte)(val
.xres
& 0xff);
453 bytes
[bi
++] = (byte)((val
.yres
& 0xff000000) >> 24);
454 bytes
[bi
++] = (byte)((val
.yres
& 0xff0000) >> 16);
455 bytes
[bi
++] = (byte)((val
.yres
& 0xff00) >> 8);
456 bytes
[bi
++] = (byte)(val
.yres
& 0xff);
457 bytes
[bi
++] = (byte)val
.units
;
460 case IPPDefs
.TAG_RANGE
:
461 bytes
[bi
++] = (byte)0;
462 bytes
[bi
++] = (byte)8;
463 bytes
[bi
++] = (byte)((val
.lower
& 0xff000000) >> 24);
464 bytes
[bi
++] = (byte)((val
.lower
& 0xff0000) >> 16);
465 bytes
[bi
++] = (byte)((val
.lower
& 0xff00) >> 8);
466 bytes
[bi
++] = (byte)(val
.lower
& 0xff);
467 bytes
[bi
++] = (byte)((val
.upper
& 0xff000000) >> 24);
468 bytes
[bi
++] = (byte)((val
.upper
& 0xff0000) >> 16);
469 bytes
[bi
++] = (byte)((val
.upper
& 0xff00) >> 8);
470 bytes
[bi
++] = (byte)(val
.upper
& 0xff);
473 case IPPDefs
.TAG_TEXTLANG
:
474 case IPPDefs
.TAG_NAMELANG
:
475 temp
= utf8
.encode(val
.text
);
476 n
= temp
.capacity() + val
.charset
.length() + 4;
481 bytes
[bi
++] = (byte)((n
& 0x7f00) >> 8);
482 bytes
[bi
++] = (byte)(n
& 0xff);
484 n
= val
.charset
.length();
485 bytes
[bi
++] = (byte)((n
& 0x7f00) >> 8);
486 bytes
[bi
++] = (byte)(n
& 0xff);
487 for (j
=0; j
< val
.charset
.length(); j
++)
488 bytes
[bi
++] = (byte)val
.charset
.charAt(j
);
495 bytes
[bi
++] = (byte)((n
& 0x7f00) >> 8);
496 bytes
[bi
++] = (byte)(n
& 0xff);
497 temp
.get(bytes
, bi
, n
);
502 if (val
.data
!= null)
505 bytes
[bi
++] = (byte)((n
& 0xff00) >> 8);
506 bytes
[bi
++] = (byte)(n
& 0xff);
507 for (j
=0; j
< val
.data
.length
; j
++)
508 bytes
[bi
++] = (byte)val
.data
[j
];
516 } // End of IPPAttribute.getBytes()
524 public void dump_values()
528 if ((values
== null) || (values
.size() < 1))
530 System
.out
.println( " ---- Separator ---- \n");
534 for (int i
=0; i
< values
.size(); i
++ )
536 val
= (IPPValue
)values
.get(i
);
538 System
.out
.println("ATTR GTAG: " + group_tag
);
539 System
.out
.println("ATTR VTAG: " + value_tag
);
540 System
.out
.println("ATTR NAME: " + name
);
542 // switch (value_tag & ~IPPDefs.TAG_COPY)
545 case IPPDefs
.TAG_INTEGER
:
546 case IPPDefs
.TAG_ENUM
:
547 System
.out
.println( " INTEGER: " + val
.integer_value
);
550 case IPPDefs
.TAG_BOOLEAN
:
551 System
.out
.println( " BOOLEAN: " + val
.boolean_value
);
554 case IPPDefs
.TAG_TEXT
:
555 case IPPDefs
.TAG_NAME
:
556 case IPPDefs
.TAG_KEYWORD
:
557 case IPPDefs
.TAG_STRING
:
558 case IPPDefs
.TAG_URI
:
559 case IPPDefs
.TAG_URISCHEME
:
560 case IPPDefs
.TAG_CHARSET
:
561 case IPPDefs
.TAG_LANGUAGE
:
562 case IPPDefs
.TAG_MIMETYPE
:
563 System
.out
.println( " CHARSET: " + val
.charset
+
564 " TEXT: " + val
.text
);
567 case IPPDefs
.TAG_DATE
:
568 System
.out
.println( " DATE: " + val
.unix_time
);
571 case IPPDefs
.TAG_RESOLUTION
:
572 System
.out
.println( " UNITS: " + val
.units
+
573 " XRES: " + val
.xres
+
574 " YRES: " + val
.yres
);
577 case IPPDefs
.TAG_RANGE
:
578 System
.out
.println( " LOWER: " + val
.lower
+
579 " UPPER: " + val
.upper
);
582 case IPPDefs
.TAG_TEXTLANG
:
583 case IPPDefs
.TAG_NAMELANG
:
584 System
.out
.println( " CHARSET: " + val
.charset
+
585 " TEXT: " + val
.text
);
588 case IPPDefs
.TAG_ZERO
:
589 System
.out
.println( " ---- Separator ---- \n");
603 } // End of IPPAttribute class