Total Complexity | 271 |
Total Lines | 1927 |
Duplicated Lines | 0 % |
Changes | 0 |
Complex classes like BasicIPP often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes.
Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.
While breaking up the class, it is a good idea to analyze how other classes use BasicIPP, and based on these observations, apply Extract Interface, too.
1 | <?php |
||
65 | class BasicIPP |
||
66 | { |
||
67 | public $paths = array( |
||
68 | "root" => "/", |
||
69 | "admin" => "/admin/", |
||
70 | "printers" => "/printers/", |
||
71 | "jobs" => "/jobs/" |
||
72 | ); |
||
73 | public $http_timeout = 30; // timeout at http connection (seconds) 0 => default => 30. |
||
74 | public $http_data_timeout = 30; // data reading timeout (milliseconds) 0 => default => 30. |
||
75 | public $ssl = false; |
||
76 | public $debug_level = 3; // max 3: almost silent |
||
77 | public $alert_on_end_tag; // debugging purpose: echo "END tag OK" if (1 and reads while end tag) |
||
78 | public $with_exceptions = 1; // compatibility mode for old scripts // DOL_LDR_CHANGE set this to 1 |
||
79 | public $handle_http_exceptions = 1; |
||
80 | |||
81 | // readables variables |
||
82 | public $jobs = array(); |
||
83 | public $jobs_uri = array(); |
||
84 | public $status = array(); |
||
85 | public $response_completed = array(); |
||
86 | public $last_job = ""; |
||
87 | public $attributes; // object you can read: attributes after validateJob() |
||
88 | public $printer_attributes; // object you can read: printer's attributes after getPrinterAttributes() |
||
89 | public $job_attributes; // object you can read: last job attributes |
||
90 | public $jobs_attributes; // object you can read: jobs attributes after getJobs() |
||
91 | public $available_printers = array(); |
||
92 | public $printer_map = array(); |
||
93 | public $printers_uri = array(); |
||
94 | public $debug = array(); |
||
95 | public $response; |
||
96 | public $meta; |
||
97 | |||
98 | // protected variables; |
||
99 | protected $log_level = 2; // max 3: very verbose |
||
100 | protected $log_type = 3; // 3: file | 1: e-mail | 0: logger |
||
101 | protected $log_destination; // e-mail or file |
||
102 | protected $serveroutput; |
||
103 | protected $setup; |
||
104 | protected $stringjob; |
||
105 | protected $data; |
||
106 | protected $debug_count = 0; |
||
107 | protected $username; |
||
108 | protected $charset; |
||
109 | protected $password; |
||
110 | protected $requesring_user; |
||
111 | protected $client_hostname = "localhost"; |
||
112 | protected $stream; |
||
113 | protected $host = "localhost"; |
||
114 | protected $port = "631"; |
||
115 | protected $requesting_user = ''; |
||
116 | protected $printer_uri; |
||
117 | protected $timeout = "20"; //20 secs |
||
118 | protected $errNo; |
||
119 | protected $errStr; |
||
120 | protected $datatype; |
||
121 | protected $datahead; |
||
122 | protected $datatail; |
||
123 | protected $operation_id; |
||
124 | protected $delay; |
||
125 | protected $error_generation; //devel feature |
||
126 | protected $debug_http = 0; |
||
127 | protected $no_disconnect; |
||
128 | protected $job_tags; |
||
129 | protected $operation_tags; |
||
130 | protected $index; |
||
131 | protected $collection; //RFC3382 |
||
132 | protected $collection_index; //RFC3382 |
||
133 | protected $collection_key = array(); //RFC3382 |
||
134 | protected $collection_depth = - 1; //RFC3382 |
||
135 | protected $end_collection = false; //RFC3382 |
||
136 | protected $collection_nbr = array(); //RFC3382 |
||
137 | protected $unix = false; // true -> use unix sockets instead of http |
||
138 | protected $output; |
||
139 | |||
140 | public function __construct() |
||
141 | { |
||
142 | $tz = getenv("date.timezone"); |
||
143 | if (!$tz) |
||
144 | { |
||
145 | $tz = @date_default_timezone_get(); |
||
146 | } |
||
147 | |||
148 | date_default_timezone_set($tz); |
||
149 | $this->meta = new \stdClass(); |
||
150 | $this->setup = new \stdClass(); |
||
151 | $this->values = new \stdClass(); |
||
152 | $this->serveroutput = new \stdClass(); |
||
153 | $this->error_generation = new \stdClass(); |
||
154 | $this->_parsing = new \stdClass(); |
||
155 | self::_initTags(); |
||
156 | } |
||
157 | |||
158 | public function setPort($port = '631') |
||
159 | { |
||
160 | $this->port = $port; |
||
161 | self::_putDebug("Port is " . $this->port, 2); |
||
162 | } |
||
163 | |||
164 | public function setUnix($socket = '/var/run/cups/cups.sock') |
||
165 | { |
||
166 | $this->host = $socket; |
||
167 | $this->unix = true; |
||
168 | self::_putDebug("Host is " . $this->host, 2); |
||
169 | } |
||
170 | |||
171 | public function setHost($host = 'localhost') |
||
172 | { |
||
173 | $this->host = $host; |
||
174 | $this->unix = false; |
||
175 | self::_putDebug("Host is " . $this->host, 2); |
||
176 | } |
||
177 | |||
178 | public function setTimeout($timeout) |
||
179 | { |
||
180 | $this->timeout = $timeout; |
||
181 | } |
||
182 | |||
183 | public function setPrinterURI($uri) |
||
184 | { |
||
185 | $length = strlen($uri); |
||
186 | $length = chr($length); |
||
187 | while (strlen($length) < 2) $length = chr(0x00) . $length; |
||
188 | $this->meta->printer_uri = chr(0x45) // uri type | value-tag |
||
189 | . chr(0x00) . chr(0x0B) // name-length |
||
190 | . "printer-uri" // printer-uri | name |
||
191 | . $length . $uri; |
||
192 | $this->printer_uri = $uri; |
||
193 | self::_putDebug(sprintf(_("Printer URI: %s"), $uri), 2); |
||
194 | $this->setup->uri = 1; |
||
195 | } |
||
196 | |||
197 | public function setData($data) |
||
198 | { |
||
199 | $this->data = $data; |
||
200 | self::_putDebug("Data set", 2); |
||
201 | } |
||
202 | |||
203 | public function setRawText() |
||
204 | { |
||
205 | $this->setup->datatype = 'TEXT'; |
||
206 | $this->meta->mime_media_type = ""; |
||
207 | $this->setup->mime_media_type = 1; |
||
208 | $this->datahead = chr(0x16); |
||
209 | if (is_readable($this->data)) |
||
210 | { |
||
211 | //It's a filename. Open and stream. |
||
212 | $data = fopen($this->data, "rb"); |
||
213 | while (!feof($data)) $output = fread($data, 8192); |
||
214 | } |
||
215 | else |
||
216 | { |
||
217 | $output = $this->data; |
||
218 | } |
||
219 | if (substr($output, -1, 1) != chr(0x0c)) { |
||
220 | if (!isset($this->setup->noFormFeed)) |
||
221 | { |
||
222 | $this->datatail = chr(0x0c); |
||
223 | } |
||
224 | } |
||
225 | self::_putDebug(_("Forcing data to be interpreted as RAW TEXT"), 2); |
||
226 | } |
||
227 | |||
228 | public function unsetRawText() |
||
229 | { |
||
230 | $this->setup->datatype = 'BINARY'; |
||
231 | $this->datahead = ''; |
||
232 | $this->datatail = ''; |
||
233 | self::_putDebug(_("Unset forcing data to be interpreted as RAW TEXT"), 2); |
||
234 | } |
||
235 | |||
236 | public function setBinary() |
||
237 | { |
||
238 | self::unsetRawText(); |
||
239 | } |
||
240 | |||
241 | public function setFormFeed() |
||
242 | { |
||
243 | $this->datatail = "\r\n" . chr(0x0c); |
||
244 | unset($this->setup->noFormFeed); |
||
245 | } |
||
246 | |||
247 | public function unsetFormFeed() |
||
248 | { |
||
249 | $this->datatail = ''; |
||
250 | $this->setup->noFormFeed = 1; |
||
251 | } |
||
252 | |||
253 | public function setCharset($charset = 'utf-8') |
||
254 | { |
||
255 | $charset = strtolower($charset); |
||
256 | $this->charset = $charset; |
||
257 | $this->meta->charset = chr(0x47) // charset type | value-tag |
||
258 | . chr(0x00) . chr(0x12) // name-length |
||
259 | . "attributes-charset" // attributes-charset | name |
||
260 | . self::_giveMeStringLength($charset) // value-length |
||
261 | . $charset; // value |
||
262 | self::_putDebug(sprintf(_("Charset: %s"), $charset), 2); |
||
263 | $this->setup->charset = 1; |
||
264 | } |
||
265 | |||
266 | public function setLanguage($language = 'en_us') |
||
267 | { |
||
268 | $language = strtolower($language); |
||
269 | $this->meta->language = chr(0x48) // natural-language type | value-tag |
||
270 | . chr(0x00) . chr(0x1B) // name-length |
||
271 | . "attributes-natural-language" //attributes-natural-language |
||
272 | . self::_giveMeStringLength($language) // value-length |
||
273 | . $language; // value |
||
274 | self::_putDebug(sprintf(_("Language: %s"), $language), 2); |
||
275 | $this->setup->language = 1; |
||
276 | } |
||
277 | |||
278 | public function setDocumentFormat($mime_media_type = 'application/octet-stream') |
||
279 | { |
||
280 | self::setBinary(); |
||
281 | $length = chr(strlen($mime_media_type)); |
||
282 | while (strlen($length) < 2) $length = chr(0x00) . $length; |
||
283 | self::_putDebug(sprintf(_("mime type: %s"), $mime_media_type), 2); |
||
284 | $this->meta->mime_media_type = chr(0x49) // document-format tag |
||
285 | . self::_giveMeStringLength('document-format') . 'document-format' // |
||
286 | . self::_giveMeStringLength($mime_media_type) . $mime_media_type; // value |
||
287 | $this->setup->mime_media_type = 1; |
||
288 | } |
||
289 | |||
290 | // setDocumentFormat alias for backward compatibility |
||
291 | public function setMimeMediaType($mime_media_type = "application/octet-stream") |
||
292 | { |
||
293 | self::setDocumentFormat($mime_media_type); |
||
294 | } |
||
295 | |||
296 | public function setCopies($nbrcopies = 1) |
||
297 | { |
||
298 | $this->meta->copies = ""; |
||
299 | |||
300 | if ($nbrcopies == 1 || !$nbrcopies) |
||
301 | { |
||
302 | return true; |
||
303 | } |
||
304 | |||
305 | $copies = self::_integerBuild($nbrcopies); |
||
306 | $this->meta->copies = chr(0x21) // integer type | value-tag |
||
307 | . chr(0x00) . chr(0x06) // name-length |
||
308 | . "copies" // copies | name |
||
309 | . self::_giveMeStringLength($copies) // value-length |
||
310 | . $copies; |
||
311 | self::_putDebug(sprintf(_("Copies: %s"), $nbrcopies), 2); |
||
312 | $this->setup->copies = 1; |
||
313 | } |
||
314 | |||
315 | public function setDocumentName($document_name = "") |
||
316 | { |
||
317 | $this->meta->document_name = ""; |
||
318 | if (!$document_name) { |
||
319 | return true; |
||
320 | } |
||
321 | $document_name = substr($document_name, 0, 1023); |
||
322 | $length = strlen($document_name); |
||
323 | $length = chr($length); |
||
324 | while (strlen($length) < 2) $length = chr(0x00) . $length; |
||
325 | self::_putDebug(sprintf(_("document name: %s"), $document_name), 2); |
||
326 | $this->meta->document_name = chr(0x41) // textWithoutLanguage tag |
||
327 | . chr(0x00) . chr(0x0d) // name-length |
||
328 | . "document-name" // mimeMediaType |
||
329 | . self::_giveMeStringLength($document_name) . $document_name; // value |
||
330 | } |
||
331 | |||
332 | public function setJobName($jobname = '', $absolute = false) |
||
333 | { |
||
334 | $this->meta->jobname = ''; |
||
335 | if ($jobname == '') |
||
336 | { |
||
337 | $this->meta->jobname = ''; |
||
338 | return true; |
||
339 | } |
||
340 | $postpend = date('-H:i:s-') . $this->_setJobId(); |
||
341 | if ($absolute) { |
||
342 | $postpend = ''; |
||
343 | } |
||
344 | if (isset($this->values->jobname) && $jobname == '(PHP)') |
||
345 | { |
||
346 | $jobname = $this->values->jobname; |
||
347 | } |
||
348 | $this->values->jobname = $jobname; |
||
349 | $jobname .= $postpend; |
||
350 | $this->meta->jobname = chr(0x42) // nameWithoutLanguage type || value-tag |
||
351 | . chr(0x00) . chr(0x08) // name-length |
||
352 | . "job-name" // job-name || name |
||
353 | . self::_giveMeStringLength($jobname) // value-length |
||
354 | . $jobname; // value |
||
355 | self::_putDebug(sprintf(_("Job name: %s"), $jobname), 2); |
||
356 | $this->setup->jobname = 1; |
||
357 | } |
||
358 | |||
359 | public function setUserName($username = 'PHP-SERVER') |
||
360 | { |
||
361 | $this->requesting_user = $username; |
||
362 | $this->meta->username = ''; |
||
363 | if (!$username) { |
||
364 | return true; |
||
365 | } |
||
366 | if ($username == 'PHP-SERVER' && isset($this->meta->username)) { |
||
367 | return TRUE; |
||
368 | } |
||
369 | /* |
||
370 | $value_length = 0x00; |
||
371 | for ($i = 0; $i < strlen($username); $i++) |
||
372 | { |
||
373 | $value_length+= 0x01; |
||
374 | } |
||
375 | $value_length = chr($value_length); |
||
376 | while (strlen($value_length) < 2) $value_length = chr(0x00) . $value_length; |
||
377 | */ |
||
378 | $this->meta->username = chr(0x42) // keyword type || value-tag |
||
379 | . chr(0x00) . chr(0x14) // name-length |
||
380 | . "requesting-user-name" |
||
381 | . self::_giveMeStringLength($username) // value-length |
||
382 | . $username; |
||
383 | self::_putDebug(sprintf(_("Username: %s"), $username), 2); |
||
384 | $this->setup->username = 1; |
||
385 | } |
||
386 | |||
387 | public function setAuthentification($username, $password) |
||
388 | { |
||
389 | self::setAuthentication($username, $password); |
||
390 | } |
||
391 | |||
392 | public function setAuthentication($username, $password) |
||
393 | { |
||
394 | $this->password = $password; |
||
395 | $this->username = $username; |
||
396 | self::_putDebug(_("Setting password"), 2); |
||
397 | $this->setup->password = 1; |
||
398 | } |
||
399 | |||
400 | public function setSides($sides = 2) |
||
401 | { |
||
402 | $this->meta->sides = ''; |
||
403 | if (!$sides) |
||
404 | { |
||
405 | return true; |
||
406 | } |
||
407 | |||
408 | switch ($sides) |
||
409 | { |
||
410 | case 1: |
||
411 | $sides = "one-sided"; |
||
412 | break; |
||
413 | |||
414 | case 2: |
||
415 | $sides = "two-sided-long-edge"; |
||
416 | break; |
||
417 | |||
418 | case "2CE": |
||
419 | $sides = "two-sided-short-edge"; |
||
420 | break; |
||
421 | } |
||
422 | |||
423 | $this->meta->sides = chr(0x44) // keyword type | value-tag |
||
424 | . chr(0x00) . chr(0x05) // name-length |
||
425 | . "sides" // sides | name |
||
426 | . self::_giveMeStringLength($sides) // value-length |
||
427 | . $sides; // one-sided | value |
||
428 | self::_putDebug(sprintf(_("Sides value set to %s"), $sides), 2); |
||
429 | } |
||
430 | |||
431 | public function setFidelity() |
||
432 | { |
||
433 | // whether the server can't replace any attributes |
||
434 | // (eg, 2 sided print is not possible, |
||
435 | // so print one sided) and DO NOT THE JOB. |
||
436 | $this->meta->fidelity = chr(0x22) // boolean type | value-tag |
||
437 | . chr(0x00) . chr(0x16) // name-length |
||
438 | . "ipp-attribute-fidelity" // ipp-attribute-fidelity | name |
||
439 | . chr(0x00) . chr(0x01) // value-length |
||
440 | . chr(0x01); // true | value |
||
441 | self::_putDebug(_("Fidelity attribute is set (paranoid mode)"), 3); |
||
442 | } |
||
443 | |||
444 | public function unsetFidelity() |
||
445 | { |
||
446 | // whether the server can replace any attributes |
||
447 | // (eg, 2 sided print is not possible, |
||
448 | // so print one sided) and DO THE JOB. |
||
449 | $this->meta->fidelity = chr(0x22) // boolean type | value-tag |
||
450 | . chr(0x00) . chr(0x16) // name-length |
||
451 | . "ipp-attribute-fidelity" // ipp-attribute-fidelity | name |
||
452 | . chr(0x00) . chr(0x01) // value-length |
||
453 | . chr(0x00); // false | value |
||
454 | self::_putDebug(_("Fidelity attribute is unset"), 2); |
||
455 | } |
||
456 | |||
457 | public function setMessage($message = '') |
||
458 | { |
||
459 | $this->meta->message = ''; |
||
460 | if (!$message) { |
||
461 | return true; |
||
462 | } |
||
463 | $this->meta->message = |
||
464 | chr(0x41) // attribute type = textWithoutLanguage |
||
465 | . chr(0x00) |
||
466 | . chr(0x07) |
||
467 | . "message" |
||
468 | . self::_giveMeStringLength(substr($message, 0, 127)) |
||
469 | . substr($message, 0, 127); |
||
470 | self::_putDebug(sprintf(_('Setting message to "%s"'), $message), 2); |
||
471 | } |
||
472 | |||
473 | public function setPageRanges($page_ranges) |
||
474 | { |
||
475 | // $pages_ranges = string: "1:5 10:25 40:52 ..." |
||
476 | // to unset, specify an empty string. |
||
477 | $this->meta->page_range = ''; |
||
478 | if (!$page_ranges) { |
||
479 | return true; |
||
480 | } |
||
481 | $page_ranges = trim(str_replace("-", ":", $page_ranges)); |
||
482 | $first = true; |
||
483 | // $page_ranges = split(' ', $page_ranges); |
||
484 | $page_ranges = preg_split('# #', $page_ranges); |
||
485 | foreach($page_ranges as $page_range) |
||
486 | { |
||
487 | $value = self::_rangeOfIntegerBuild($page_range); |
||
488 | if ($first) |
||
489 | { |
||
490 | $this->meta->page_ranges .= |
||
491 | $this->tags_types['rangeOfInteger']['tag'] |
||
492 | . self::_giveMeStringLength('page-ranges') |
||
493 | . 'page-ranges' |
||
494 | . self::_giveMeStringLength($value) |
||
495 | . $value; |
||
496 | } |
||
497 | else |
||
498 | { |
||
499 | $this->meta->page_ranges .= |
||
500 | $this->tags_types['rangeOfInteger']['tag'] |
||
501 | . self::_giveMeStringLength('') |
||
502 | . self::_giveMeStringLength($value) |
||
503 | . $value; |
||
504 | $first = false; |
||
505 | } |
||
506 | } |
||
507 | } |
||
508 | |||
509 | public function setAttribute($attribute, $values) |
||
510 | { |
||
511 | $operation_attributes_tags = array_keys($this->operation_tags); |
||
512 | $job_attributes_tags = array_keys($this->job_tags); |
||
513 | $printer_attributes_tags = array_keys($this->printer_tags); |
||
514 | self::unsetAttribute($attribute); |
||
515 | if (in_array($attribute, $operation_attributes_tags)) |
||
516 | { |
||
517 | if (!is_array($values)) |
||
518 | { |
||
519 | self::_setOperationAttribute($attribute, $values); |
||
520 | } |
||
521 | else |
||
522 | { |
||
523 | foreach($values as $value) |
||
524 | { |
||
525 | self::_setOperationAttribute($attribute, $value); |
||
526 | } |
||
527 | } |
||
528 | } |
||
529 | elseif (in_array($attribute, $job_attributes_tags)) |
||
530 | { |
||
531 | if (!is_array($values)) |
||
532 | { |
||
533 | self::_setJobAttribute($attribute, $values); |
||
534 | } |
||
535 | else |
||
536 | { |
||
537 | foreach($values as $value) |
||
538 | { |
||
539 | self::_setJobAttribute($attribute, $value); |
||
540 | } |
||
541 | } |
||
542 | } |
||
543 | elseif (in_array($attribute, $printer_attributes_tags)) |
||
544 | { |
||
545 | if (!is_array($values)) |
||
546 | { |
||
547 | self::_setPrinterAttribute($attribute, $values); |
||
548 | } |
||
549 | else |
||
550 | { |
||
551 | foreach($values as $value) |
||
552 | { |
||
553 | self::_setPrinterAttribute($attribute, $value); |
||
554 | } |
||
555 | } |
||
556 | } |
||
557 | else |
||
558 | { |
||
559 | trigger_error( |
||
560 | sprintf( |
||
561 | _('SetAttribute: Tag "%s" is not a printer or a job attribute'), |
||
562 | $attribute), E_USER_NOTICE); |
||
563 | self::_putDebug( |
||
564 | sprintf( |
||
565 | _('SetAttribute: Tag "%s" is not a printer or a job attribute'), |
||
566 | $attribute), 3); |
||
567 | self::_errorLog( |
||
568 | sprintf( |
||
569 | _('SetAttribute: Tag "%s" is not a printer or a job attribute'), |
||
570 | $attribute), 2); |
||
571 | return FALSE; |
||
572 | } |
||
573 | } |
||
574 | |||
575 | public function unsetAttribute($attribute) |
||
576 | { |
||
577 | $operation_attributes_tags = array_keys($this->operation_tags); |
||
578 | $job_attributes_tags = array_keys($this->job_tags); |
||
579 | $printer_attributes_tags = array_keys($this->printer_tags); |
||
580 | if (in_array($attribute, $operation_attributes_tags)) |
||
581 | { |
||
582 | unset( |
||
583 | $this->operation_tags[$attribute]['value'], |
||
584 | $this->operation_tags[$attribute]['systag'] |
||
585 | ); |
||
586 | } |
||
587 | elseif (in_array($attribute, $job_attributes_tags)) |
||
588 | { |
||
589 | unset( |
||
590 | $this->job_tags[$attribute]['value'], |
||
591 | $this->job_tags[$attribute]['systag'] |
||
592 | ); |
||
593 | } |
||
594 | elseif (in_array($attribute, $printer_attributes_tags)) |
||
595 | { |
||
596 | unset( |
||
597 | $this->printer_tags[$attribute]['value'], |
||
598 | $this->printer_tags[$attribute]['systag'] |
||
599 | ); |
||
600 | } |
||
601 | else |
||
602 | { |
||
603 | trigger_error( |
||
604 | sprintf( |
||
605 | _('unsetAttribute: Tag "%s" is not a printer or a job attribute'), |
||
606 | $attribute), E_USER_NOTICE); |
||
607 | self::_putDebug( |
||
608 | sprintf( |
||
609 | _('unsetAttribute: Tag "%s" is not a printer or a job attribute'), |
||
610 | $attribute), 3); |
||
611 | self::_errorLog( |
||
612 | sprintf( |
||
613 | _('unsetAttribute: Tag "%s" is not a printer or a job attribute'), |
||
614 | $attribute), 2); |
||
615 | return FALSE; |
||
616 | } |
||
617 | return true; |
||
618 | } |
||
619 | |||
620 | // |
||
621 | // LOGGING / DEBUGGING |
||
622 | // |
||
623 | /** |
||
624 | * Sets log file destination. Creates the file if has permission. |
||
625 | * |
||
626 | * @param string $log_destination |
||
627 | * @param string $destination_type |
||
628 | * @param int $level |
||
629 | * |
||
630 | * @throws ippException |
||
631 | */ |
||
632 | public function setLog($log_destination, $destination_type = 'file', $level = 2) |
||
633 | { |
||
634 | if (!file_exists($log_destination) && is_writable(dirname($log_destination))) |
||
635 | { |
||
636 | touch($log_destination); |
||
637 | chmod($log_destination, 0777); |
||
638 | } |
||
639 | |||
640 | switch ($destination_type) |
||
641 | { |
||
642 | case 'file': |
||
643 | case 3: |
||
644 | $this->log_destination = $log_destination; |
||
645 | $this->log_type = 3; |
||
646 | break; |
||
647 | |||
648 | case 'logger': |
||
649 | case 0: |
||
650 | $this->log_destination = ''; |
||
651 | $this->log_type = 0; |
||
652 | break; |
||
653 | |||
654 | case 'e-mail': |
||
655 | case 1: |
||
656 | $this->log_destination = $log_destination; |
||
657 | $this->log_type = 1; |
||
658 | break; |
||
659 | } |
||
660 | $this->log_level = $level; |
||
661 | } |
||
662 | |||
663 | public function printDebug() |
||
664 | { |
||
665 | for ($i = 0; $i < $this->debug_count; $i++) |
||
666 | { |
||
667 | echo $this->debug[$i], "\n"; |
||
668 | } |
||
669 | $this->debug = array(); |
||
670 | $this->debug_count = 0; |
||
671 | } |
||
672 | |||
673 | public function getDebug() |
||
674 | { |
||
675 | $debug = ''; |
||
676 | for ($i = 0; $i < $this->debug_count; $i++) |
||
677 | { |
||
678 | $debug .= $this->debug[$i]; |
||
679 | } |
||
680 | $this->debug = array(); |
||
681 | $this->debug_count = 0; |
||
682 | return $debug; |
||
683 | } |
||
684 | |||
685 | // |
||
686 | // OPERATIONS |
||
687 | // |
||
688 | public function printJob() |
||
689 | { |
||
690 | // this BASIC version of printJob do not parse server |
||
691 | // output for job's attributes |
||
692 | self::_putDebug( |
||
693 | sprintf( |
||
694 | "************** Date: %s ***********", |
||
695 | date('Y-m-d H:i:s') |
||
696 | ) |
||
697 | ); |
||
698 | if (!$this->_stringJob()) { |
||
699 | return FALSE; |
||
700 | } |
||
701 | if (is_readable($this->data)) |
||
702 | { |
||
703 | self::_putDebug(_("Printing a FILE")); |
||
704 | $this->output = $this->stringjob; |
||
705 | if ($this->setup->datatype == "TEXT") |
||
706 | { |
||
707 | $this->output .= chr(0x16); |
||
708 | } |
||
709 | $post_values = array( |
||
710 | "Content-Type" => "application/ipp", |
||
711 | "Data" => $this->output, |
||
712 | "File" => $this->data |
||
713 | ); |
||
714 | if ($this->setup->datatype == "TEXT" && !isset($this->setup->noFormFeed)) |
||
715 | { |
||
716 | $post_values = array_merge( |
||
717 | $post_values, |
||
718 | array( |
||
719 | "Filetype" => "TEXT" |
||
720 | ) |
||
721 | ); |
||
722 | } |
||
723 | } |
||
724 | else |
||
725 | { |
||
726 | self::_putDebug(_("Printing DATA")); |
||
727 | $this->output = |
||
728 | $this->stringjob |
||
729 | . $this->datahead |
||
730 | . $this->data |
||
731 | . $this->datatail; |
||
732 | $post_values = array( |
||
733 | "Content-Type" => "application/ipp", |
||
734 | "Data" => $this->output |
||
735 | ); |
||
736 | } |
||
737 | if (self::_sendHttp($post_values, $this->paths["printers"])) |
||
738 | { |
||
739 | self::_parseServerOutput(); |
||
740 | } |
||
741 | if (isset($this->serveroutput) && isset($this->serveroutput->status)) |
||
742 | { |
||
743 | $this->status = array_merge($this->status, array( |
||
744 | $this->serveroutput->status |
||
745 | )); |
||
746 | if ($this->serveroutput->status == "successfull-ok") |
||
747 | { |
||
748 | self::_errorLog( |
||
749 | sprintf("printing job %s: ", $this->last_job) |
||
750 | . $this->serveroutput->status, |
||
751 | 3); |
||
752 | } |
||
753 | else |
||
754 | { |
||
755 | self::_errorLog( |
||
756 | sprintf("printing job: ", $this->last_job) |
||
757 | . $this->serveroutput->status, |
||
758 | 1); |
||
759 | } |
||
760 | return $this->serveroutput->status; |
||
761 | } |
||
762 | |||
763 | $this->status = |
||
764 | array_merge($this->status, array("OPERATION FAILED")); |
||
765 | $this->jobs = |
||
766 | array_merge($this->jobs, array("")); |
||
767 | $this->jobs_uri = |
||
768 | array_merge($this->jobs_uri, array("")); |
||
769 | |||
770 | self::_errorLog("printing job : OPERATION FAILED", 1); |
||
771 | return false; |
||
772 | } |
||
773 | |||
774 | // |
||
775 | // HTTP OUTPUT |
||
776 | // |
||
777 | protected function _sendHttp($post_values, $uri) |
||
778 | { |
||
779 | /* |
||
780 | This function Copyright (C) 2005-2006 Thomas Harding, Manuel Lemos |
||
781 | */ |
||
782 | $this->response_completed[] = "no"; |
||
783 | unset($this->serverouptut); |
||
784 | self::_putDebug(_("Processing HTTP request"), 2); |
||
785 | $this->serveroutput->headers = array(); |
||
786 | $this->serveroutput->body = ""; |
||
787 | $http = new http_class(); |
||
788 | if (!$this->unix) { |
||
789 | // DOL_LDR_CHANGE |
||
790 | if (empty($this->host)) $this->host = '127.0.0.1'; |
||
791 | $http->host = $this->host; |
||
792 | } |
||
793 | else { |
||
794 | $http->host = "localhost"; |
||
795 | } |
||
796 | $http->with_exceptions = $this->with_exceptions; |
||
797 | if ($this->debug_http) |
||
798 | { |
||
799 | $http->debug = 1; |
||
800 | $http->html_debug = 0; |
||
801 | } |
||
802 | else |
||
803 | { |
||
804 | $http->debug = 0; |
||
805 | $http->html_debug = 0; |
||
806 | } |
||
807 | $url = "http://" . $this->host; |
||
808 | if ($this->ssl) { |
||
809 | $url = "https://" . $this->host; |
||
810 | } |
||
811 | if ($this->unix) { |
||
812 | $url = "unix://" . $this->host; |
||
813 | } |
||
814 | $http->port = $this->port; |
||
815 | $http->timeout = $this->http_timeout; |
||
816 | $http->data_timeout = $this->http_data_timeout; |
||
817 | $http->force_multipart_form_post = false; |
||
818 | $http->user = $this->username; |
||
819 | $http->password = $this->password; |
||
820 | $error = $http->GetRequestArguments($url, $arguments); |
||
821 | $arguments["RequestMethod"] = "POST"; |
||
822 | $arguments["Headers"] = array( |
||
823 | "Content-Type" => "application/ipp" |
||
824 | ); |
||
825 | $arguments["BodyStream"] = array( |
||
826 | array( |
||
827 | "Data" => $post_values["Data"] |
||
828 | ) |
||
829 | ); |
||
830 | if (isset($post_values["File"])) { |
||
831 | $arguments["BodyStream"][] = array( |
||
832 | "File" => $post_values["File"] |
||
833 | ); |
||
834 | } |
||
835 | if ( |
||
836 | isset($post_values["FileType"]) |
||
837 | && !strcmp($post_values["FileType"], "TEXT") |
||
838 | ) |
||
839 | { |
||
840 | $arguments["BodyStream"][] = array("Data" => Chr(12)); |
||
841 | } |
||
842 | $arguments["RequestURI"] = $uri; |
||
843 | if ($this->with_exceptions && $this->handle_http_exceptions) |
||
844 | { |
||
845 | try |
||
846 | { |
||
847 | $success = $http->Open($arguments); |
||
848 | } |
||
849 | catch(httpException $e) |
||
850 | { |
||
851 | throw new ippException( |
||
852 | sprintf("http error: %s", $e->getMessage()), |
||
853 | $e->getErrno()); |
||
854 | } |
||
855 | } |
||
856 | else |
||
857 | { |
||
858 | $success = $http->Open($arguments); |
||
859 | } |
||
860 | if ($success[0] == true) |
||
861 | { |
||
862 | $success = $http->SendRequest($arguments); |
||
863 | if ($success[0] == true) |
||
864 | { |
||
865 | self::_putDebug("H T T P R E Q U E S T :"); |
||
866 | self::_putDebug("Request headers:"); |
||
867 | for (Reset($http->request_headers) , $header = 0; $header < count($http->request_headers); Next($http->request_headers) , $header++) |
||
868 | { |
||
869 | $header_name = Key($http->request_headers); |
||
870 | if (GetType($http->request_headers[$header_name]) == "array") |
||
871 | { |
||
872 | for ($header_value = 0; $header_value < count($http->request_headers[$header_name]); $header_value++) |
||
873 | { |
||
874 | self::_putDebug($header_name . ": " . $http->request_headers[$header_name][$header_value]); |
||
875 | } |
||
876 | } |
||
877 | else |
||
878 | { |
||
879 | self::_putDebug($header_name . ": " . $http->request_headers[$header_name]); |
||
880 | } |
||
881 | } |
||
882 | self::_putDebug("Request body:"); |
||
883 | self::_putDebug( |
||
884 | htmlspecialchars($http->request_body) |
||
885 | . "*********** END REQUEST BODY *********" |
||
886 | ); |
||
887 | $i = 0; |
||
888 | $headers = array(); |
||
889 | unset($this->serveroutput->headers); |
||
890 | $http->ReadReplyHeaders($headers); |
||
891 | self::_putDebug("H T T P R E S P O N S E :"); |
||
892 | self::_putDebug("Response headers:"); |
||
893 | for (Reset($headers) , $header = 0; $header < count($headers); Next($headers) , $header++) |
||
894 | { |
||
895 | $header_name = Key($headers); |
||
896 | if (GetType($headers[$header_name]) == "array") |
||
897 | { |
||
898 | for ($header_value = 0; $header_value < count($headers[$header_name]); $header_value++) |
||
899 | { |
||
900 | self::_putDebug($header_name . ": " . $headers[$header_name][$header_value]); |
||
901 | $this->serveroutput->headers[$i] = |
||
902 | $header_name . ": " |
||
903 | . $headers[$header_name][$header_value]; |
||
904 | $i++; |
||
905 | } |
||
906 | } |
||
907 | else |
||
908 | { |
||
909 | self::_putDebug($header_name . ": " . $headers[$header_name]); |
||
910 | $this->serveroutput->headers[$i] = |
||
911 | $header_name |
||
912 | . ": " |
||
913 | . $headers[$header_name]; |
||
914 | $i++; |
||
915 | } |
||
916 | } |
||
917 | self::_putDebug("\n\nResponse body:\n"); |
||
918 | $this->serveroutput->body = ""; |
||
919 | for (;;) |
||
920 | { |
||
921 | $http->ReadReplyBody($body, 1024); |
||
922 | if (strlen($body) == 0) { |
||
923 | break; |
||
924 | } |
||
925 | |||
926 | self::_putDebug(htmlentities($body)); |
||
927 | $this->serveroutput->body .= $body; |
||
928 | } |
||
929 | self::_putDebug("********* END RESPONSE BODY ********"); |
||
930 | } |
||
931 | } |
||
932 | $http->Close(); |
||
933 | return true; |
||
934 | } |
||
935 | |||
936 | // |
||
937 | // INIT |
||
938 | // |
||
939 | protected function _initTags() |
||
940 | { |
||
941 | $this->tags_types = array( |
||
942 | "unsupported" => array( |
||
943 | "tag" => chr(0x10) , |
||
944 | "build" => "" |
||
945 | ) , |
||
946 | "reserved" => array( |
||
947 | "tag" => chr(0x11) , |
||
948 | "build" => "" |
||
949 | ) , |
||
950 | "unknown" => array( |
||
951 | "tag" => chr(0x12) , |
||
952 | "build" => "" |
||
953 | ) , |
||
954 | "no-value" => array( |
||
955 | "tag" => chr(0x13) , |
||
956 | "build" => "no_value" |
||
957 | ) , |
||
958 | "integer" => array( |
||
959 | "tag" => chr(0x21) , |
||
960 | "build" => "integer" |
||
961 | ) , |
||
962 | "boolean" => array( |
||
963 | "tag" => chr(0x22) , |
||
964 | "build" => "boolean" |
||
965 | ) , |
||
966 | "enum" => array( |
||
967 | "tag" => chr(0x23) , |
||
968 | "build" => "enum" |
||
969 | ) , |
||
970 | "octetString" => array( |
||
971 | "tag" => chr(0x30) , |
||
972 | "build" => "octet_string" |
||
973 | ) , |
||
974 | "datetime" => array( |
||
975 | "tag" => chr(0x31) , |
||
976 | "build" => "datetime" |
||
977 | ) , |
||
978 | "resolution" => array( |
||
979 | "tag" => chr(0x32) , |
||
980 | "build" => "resolution" |
||
981 | ) , |
||
982 | "rangeOfInteger" => array( |
||
983 | "tag" => chr(0x33) , |
||
984 | "build" => "range_of_integers" |
||
985 | ) , |
||
986 | "textWithLanguage" => array( |
||
987 | "tag" => chr(0x35) , |
||
988 | "build" => "string" |
||
989 | ) , |
||
990 | "nameWithLanguage" => array( |
||
991 | "tag" => chr(0x36) , |
||
992 | "build" => "string" |
||
993 | ) , |
||
994 | /* |
||
995 | "text" => array ("tag" => chr(0x40), |
||
996 | "build" => "string"), |
||
997 | "text string" => array ("tag" => chr(0x40), |
||
998 | "build" => "string"), |
||
999 | */ |
||
1000 | "textWithoutLanguage" => array( |
||
1001 | "tag" => chr(0x41) , |
||
1002 | "build" => "string" |
||
1003 | ) , |
||
1004 | "nameWithoutLanguage" => array( |
||
1005 | "tag" => chr(0x42) , |
||
1006 | "buid" => "string" |
||
1007 | ) , |
||
1008 | "keyword" => array( |
||
1009 | "tag" => chr(0x44) , |
||
1010 | "build" => "string" |
||
1011 | ) , |
||
1012 | "uri" => array( |
||
1013 | "tag" => chr(0x45) , |
||
1014 | "build" => "string" |
||
1015 | ) , |
||
1016 | "uriScheme" => array( |
||
1017 | "tag" => chr(0x46) , |
||
1018 | "build" => "string" |
||
1019 | ) , |
||
1020 | "charset" => array( |
||
1021 | "tag" => chr(0x47) , |
||
1022 | "build" => "string" |
||
1023 | ) , |
||
1024 | "naturalLanguage" => array( |
||
1025 | "tag" => chr(0x48) , |
||
1026 | "build" => "string" |
||
1027 | ) , |
||
1028 | "mimeMediaType" => array( |
||
1029 | "tag" => chr(0x49) , |
||
1030 | "build" => "string" |
||
1031 | ) , |
||
1032 | "extendedAttributes" => array( |
||
1033 | "tag" => chr(0x7F) , |
||
1034 | "build" => "extended" |
||
1035 | ) , |
||
1036 | ); |
||
1037 | $this->operation_tags = array( |
||
1038 | "compression" => array( |
||
1039 | "tag" => "keyword" |
||
1040 | ) , |
||
1041 | "document-natural-language" => array( |
||
1042 | "tag" => "naturalLanguage" |
||
1043 | ) , |
||
1044 | "job-k-octets" => array( |
||
1045 | "tag" => "integer" |
||
1046 | ) , |
||
1047 | "job-impressions" => array( |
||
1048 | "tag" => "integer" |
||
1049 | ) , |
||
1050 | "job-media-sheets" => array( |
||
1051 | "tag" => "integer" |
||
1052 | ) , |
||
1053 | ); |
||
1054 | $this->job_tags = array( |
||
1055 | "job-priority" => array( |
||
1056 | "tag" => "integer" |
||
1057 | ) , |
||
1058 | "job-hold-until" => array( |
||
1059 | "tag" => "keyword" |
||
1060 | ) , |
||
1061 | "job-sheets" => array( |
||
1062 | "tag" => "keyword" |
||
1063 | ) , //banner page |
||
1064 | "multiple-document-handling" => array( |
||
1065 | "tag" => "keyword" |
||
1066 | ) , |
||
1067 | //"copies" => array("tag" => "integer"), |
||
1068 | "finishings" => array( |
||
1069 | "tag" => "enum" |
||
1070 | ) , |
||
1071 | //"page-ranges" => array("tag" => "rangeOfInteger"), // has its own function |
||
1072 | //"sides" => array("tag" => "keyword"), // has its own function |
||
1073 | "number-up" => array( |
||
1074 | "tag" => "integer" |
||
1075 | ) , |
||
1076 | "orientation-requested" => array( |
||
1077 | "tag" => "enum" |
||
1078 | ) , |
||
1079 | "media" => array( |
||
1080 | "tag" => "keyword" |
||
1081 | ) , |
||
1082 | "printer-resolution" => array( |
||
1083 | "tag" => "resolution" |
||
1084 | ) , |
||
1085 | "print-quality" => array( |
||
1086 | "tag" => "enum" |
||
1087 | ) , |
||
1088 | "job-message-from-operator" => array( |
||
1089 | "tag" => "textWithoutLanguage" |
||
1090 | ) , |
||
1091 | ); |
||
1092 | $this->printer_tags = array( |
||
1093 | "requested-attributes" => array( |
||
1094 | "tag" => "keyword" |
||
1095 | ) |
||
1096 | ); |
||
1097 | } |
||
1098 | |||
1099 | // |
||
1100 | // SETUP |
||
1101 | // |
||
1102 | protected function _setOperationId() |
||
1103 | { |
||
1104 | $prepend = ''; |
||
1105 | $this->operation_id += 1; |
||
1106 | $this->meta->operation_id = self::_integerBuild($this->operation_id); |
||
1107 | self::_putDebug("operation id is: " . $this->operation_id, 2); |
||
1108 | } |
||
1109 | |||
1110 | protected function _setJobId() |
||
1111 | { |
||
1112 | $this->meta->jobid += 1; |
||
1113 | $prepend = ''; |
||
1114 | $prepend_length = 4 - strlen($this->meta->jobid); |
||
1115 | for ($i = 0; $i < $prepend_length; $i++) { |
||
1116 | $prepend .= '0'; |
||
1117 | } |
||
1118 | return $prepend . $this->meta->jobid; |
||
1119 | } |
||
1120 | |||
1121 | protected function _setJobUri($job_uri) |
||
1122 | { |
||
1123 | $this->meta->job_uri = chr(0x45) // type uri |
||
1124 | . chr(0x00) . chr(0x07) // name-length |
||
1125 | . "job-uri" |
||
1126 | //. chr(0x00).chr(strlen($job_uri)) |
||
1127 | . self::_giveMeStringLength($job_uri) . $job_uri; |
||
1128 | self::_putDebug("job-uri is: " . $job_uri, 2); |
||
1129 | } |
||
1130 | |||
1131 | // |
||
1132 | // RESPONSE PARSING |
||
1133 | // |
||
1134 | protected function _parseServerOutput() |
||
1135 | { |
||
1136 | $this->serveroutput->response = array(); |
||
1137 | if (!self::_parseHttpHeaders()) { |
||
1138 | return FALSE; |
||
1139 | } |
||
1140 | $this->_parsing->offset = 0; |
||
1141 | self::_parseIppVersion(); |
||
1142 | self::_parseStatusCode(); |
||
1143 | self::_parseRequestID(); |
||
1144 | $this->_parseResponse(); |
||
1145 | //devel |
||
1146 | self::_putDebug( |
||
1147 | sprintf("***** IPP STATUS: %s ******", $this->serveroutput->status), |
||
1148 | 4); |
||
1149 | self::_putDebug("****** END OF OPERATION ****"); |
||
1150 | return true; |
||
1151 | } |
||
1152 | |||
1153 | protected function _parseHttpHeaders() |
||
1154 | { |
||
1155 | $response = ""; |
||
1156 | switch ($this->serveroutput->headers[0]) |
||
1157 | { |
||
1158 | case "http/1.1 200 ok: ": |
||
1159 | $this->serveroutput->httpstatus = "HTTP/1.1 200 OK"; |
||
1160 | $response = "OK"; |
||
1161 | break; |
||
1162 | |||
1163 | // primitive http/1.0 for Lexmark printers (from Rick Baril) |
||
1164 | case "http/1.0 200 ok: ": |
||
1165 | $this->serveroutput->httpstatus = "HTTP/1.0 200 OK"; |
||
1166 | $response = "OK"; |
||
1167 | break; |
||
1168 | |||
1169 | case "http/1.1 100 continue: ": |
||
1170 | $this->serveroutput->httpstatus = "HTTP/1.1 100 CONTINUE"; |
||
1171 | $response = "OK"; |
||
1172 | break; |
||
1173 | |||
1174 | case "": |
||
1175 | $this->serveroutput->httpstatus = "HTTP/1.1 000 No Response From Server"; |
||
1176 | $this->serveroutput->status = "HTTP-ERROR-000_NO_RESPONSE_FROM_SERVER"; |
||
1177 | trigger_error("No Response From Server", E_USER_WARNING); |
||
1178 | self::_errorLog("No Response From Server", 1); |
||
1179 | $this->disconnected = 1; |
||
1180 | return FALSE; |
||
1181 | break; |
||
1182 | |||
1183 | default: |
||
1184 | $server_response = preg_replace("/: $/", '', $this->serveroutput->headers[0]); |
||
1185 | // $strings = split(' ', $server_response, 3); |
||
1186 | $strings = preg_split('# #', $server_response, 3); |
||
1187 | $errno = $strings[1]; |
||
1188 | $string = strtoupper(str_replace(' ', '_', $strings[2])); |
||
1189 | trigger_error( |
||
1190 | sprintf(_("server responds %s"), $server_response), |
||
1191 | E_USER_WARNING); |
||
1192 | self::_errorLog("server responds " . $server_response, 1); |
||
1193 | $this->serveroutput->httpstatus = |
||
1194 | strtoupper($strings[0]) |
||
1195 | . " " |
||
1196 | . $errno |
||
1197 | . " " |
||
1198 | . ucfirst($strings[2]); |
||
1199 | |||
1200 | $this->serveroutput->status = |
||
1201 | "HTTP-ERROR-" |
||
1202 | . $errno |
||
1203 | . "-" |
||
1204 | . $string; |
||
1205 | $this->disconnected = 1; |
||
1206 | return FALSE; |
||
1207 | break; |
||
1208 | } |
||
1209 | unset($this->serveroutput->headers); |
||
1210 | return TRUE; |
||
1211 | } |
||
1212 | |||
1213 | protected function _parseIppVersion() |
||
1214 | { |
||
1215 | $ippversion = |
||
1216 | (ord($this->serveroutput->body[$this->_parsing->offset]) * 256) |
||
1217 | + ord($this->serveroutput->body[$this->_parsing->offset + 1]); |
||
1218 | switch ($ippversion) |
||
1219 | { |
||
1220 | case 0x0101: |
||
1221 | $this->serveroutput->ipp_version = "1.1"; |
||
1222 | break; |
||
1223 | |||
1224 | default: |
||
1225 | $this->serveroutput->ipp_version = |
||
1226 | sprintf( |
||
1227 | "%u.%u (Unknown)", |
||
1228 | ord($this->serveroutput->body[$this->_parsing->offset]) * 256, |
||
1229 | ord($this->serveroutput->body[$this->_parsing->offset + 1])); |
||
1230 | break; |
||
1231 | } |
||
1232 | self::_putDebug("I P P R E S P O N S E :\n\n"); |
||
1233 | self::_putDebug( |
||
1234 | sprintf( |
||
1235 | "IPP version %s%s: %s", |
||
1236 | ord($this->serveroutput->body[$this->_parsing->offset]), |
||
1237 | ord($this->serveroutput->body[$this->_parsing->offset + 1]), |
||
1238 | $this->serveroutput->ipp_version)); |
||
1239 | $this->_parsing->offset += 2; |
||
1240 | return; |
||
1241 | } |
||
1242 | |||
1243 | protected function _parseStatusCode() |
||
1244 | { |
||
1245 | $status_code = |
||
1246 | (ord($this->serveroutput->body[$this->_parsing->offset]) * 256) |
||
1247 | + ord($this->serveroutput->body[$this->_parsing->offset + 1]); |
||
1248 | $this->serveroutput->status = "NOT PARSED"; |
||
1249 | $this->_parsing->offset += 2; |
||
1250 | if (strlen($this->serveroutput->body) < $this->_parsing->offset) |
||
1251 | { |
||
1252 | return false; |
||
1253 | } |
||
1254 | if ($status_code < 0x00FF) |
||
1255 | { |
||
1256 | $this->serveroutput->status = "successfull"; |
||
1257 | } |
||
1258 | elseif ($status_code < 0x01FF) |
||
1259 | { |
||
1260 | $this->serveroutput->status = "informational"; |
||
1261 | } |
||
1262 | elseif ($status_code < 0x02FF) |
||
1263 | { |
||
1264 | $this->serveroutput->status = "redirection"; |
||
1265 | } |
||
1266 | elseif ($status_code < 0x04FF) |
||
1267 | { |
||
1268 | $this->serveroutput->status = "client-error"; |
||
1269 | } |
||
1270 | elseif ($status_code < 0x05FF) |
||
1271 | { |
||
1272 | $this->serveroutput->status = "server-error"; |
||
1273 | } |
||
1274 | switch ($status_code) |
||
1275 | { |
||
1276 | case 0x0000: |
||
1277 | $this->serveroutput->status = "successfull-ok"; |
||
1278 | break; |
||
1279 | |||
1280 | case 0x0001: |
||
1281 | $this->serveroutput->status = "successful-ok-ignored-or-substituted-attributes"; |
||
1282 | break; |
||
1283 | |||
1284 | case 0x002: |
||
1285 | $this->serveroutput->status = "successful-ok-conflicting-attributes"; |
||
1286 | break; |
||
1287 | |||
1288 | case 0x0400: |
||
1289 | $this->serveroutput->status = "client-error-bad-request"; |
||
1290 | break; |
||
1291 | |||
1292 | case 0x0401: |
||
1293 | $this->serveroutput->status = "client-error-forbidden"; |
||
1294 | break; |
||
1295 | |||
1296 | case 0x0402: |
||
1297 | $this->serveroutput->status = "client-error-not-authenticated"; |
||
1298 | break; |
||
1299 | |||
1300 | case 0x0403: |
||
1301 | $this->serveroutput->status = "client-error-not-authorized"; |
||
1302 | break; |
||
1303 | |||
1304 | case 0x0404: |
||
1305 | $this->serveroutput->status = "client-error-not-possible"; |
||
1306 | break; |
||
1307 | |||
1308 | case 0x0405: |
||
1309 | $this->serveroutput->status = "client-error-timeout"; |
||
1310 | break; |
||
1311 | |||
1312 | case 0x0406: |
||
1313 | $this->serveroutput->status = "client-error-not-found"; |
||
1314 | break; |
||
1315 | |||
1316 | case 0x0407: |
||
1317 | $this->serveroutput->status = "client-error-gone"; |
||
1318 | break; |
||
1319 | |||
1320 | case 0x0408: |
||
1321 | $this->serveroutput->status = "client-error-request-entity-too-large"; |
||
1322 | break; |
||
1323 | |||
1324 | case 0x0409: |
||
1325 | $this->serveroutput->status = "client-error-request-value-too-long"; |
||
1326 | break; |
||
1327 | |||
1328 | case 0x040A: |
||
1329 | $this->serveroutput->status = "client-error-document-format-not-supported"; |
||
1330 | break; |
||
1331 | |||
1332 | case 0x040B: |
||
1333 | $this->serveroutput->status = "client-error-attributes-or-values-not-supported"; |
||
1334 | break; |
||
1335 | |||
1336 | case 0x040C: |
||
1337 | $this->serveroutput->status = "client-error-uri-scheme-not-supported"; |
||
1338 | break; |
||
1339 | |||
1340 | case 0x040D: |
||
1341 | $this->serveroutput->status = "client-error-charset-not-supported"; |
||
1342 | break; |
||
1343 | |||
1344 | case 0x040E: |
||
1345 | $this->serveroutput->status = "client-error-conflicting-attributes"; |
||
1346 | break; |
||
1347 | |||
1348 | case 0x040F: |
||
1349 | $this->serveroutput->status = "client-error-compression-not-supported"; |
||
1350 | break; |
||
1351 | |||
1352 | case 0x0410: |
||
1353 | $this->serveroutput->status = "client-error-compression-error"; |
||
1354 | break; |
||
1355 | |||
1356 | case 0x0411: |
||
1357 | $this->serveroutput->status = "client-error-document-format-error"; |
||
1358 | break; |
||
1359 | |||
1360 | case 0x0412: |
||
1361 | $this->serveroutput->status = "client-error-document-access-error"; |
||
1362 | break; |
||
1363 | |||
1364 | case 0x0413: // RFC3380 |
||
1365 | $this->serveroutput->status = "client-error-attributes-not-settable"; |
||
1366 | break; |
||
1367 | |||
1368 | case 0x0500: |
||
1369 | $this->serveroutput->status = "server-error-internal-error"; |
||
1370 | break; |
||
1371 | |||
1372 | case 0x0501: |
||
1373 | $this->serveroutput->status = "server-error-operation-not-supported"; |
||
1374 | break; |
||
1375 | |||
1376 | case 0x0502: |
||
1377 | $this->serveroutput->status = "server-error-service-unavailable"; |
||
1378 | break; |
||
1379 | |||
1380 | case 0x0503: |
||
1381 | $this->serveroutput->status = "server-error-version-not-supported"; |
||
1382 | break; |
||
1383 | |||
1384 | case 0x0504: |
||
1385 | $this->serveroutput->status = "server-error-device-error"; |
||
1386 | break; |
||
1387 | |||
1388 | case 0x0505: |
||
1389 | $this->serveroutput->status = "server-error-temporary-error"; |
||
1390 | break; |
||
1391 | |||
1392 | case 0x0506: |
||
1393 | $this->serveroutput->status = "server-error-not-accepting-jobs"; |
||
1394 | break; |
||
1395 | |||
1396 | case 0x0507: |
||
1397 | $this->serveroutput->status = "server-error-busy"; |
||
1398 | break; |
||
1399 | |||
1400 | case 0x0508: |
||
1401 | $this->serveroutput->status = "server-error-job-canceled"; |
||
1402 | break; |
||
1403 | |||
1404 | case 0x0509: |
||
1405 | $this->serveroutput->status = "server-error-multiple-document-jobs-not-supported"; |
||
1406 | break; |
||
1407 | |||
1408 | default: |
||
1409 | break; |
||
1410 | } |
||
1411 | self::_putDebug( |
||
1412 | sprintf( |
||
1413 | "status-code: %s%s: %s ", |
||
1414 | $this->serveroutput->body[$this->_parsing->offset], |
||
1415 | $this->serveroutput->body[$this->_parsing->offset + 1], |
||
1416 | $this->serveroutput->status), |
||
1417 | 4); |
||
1418 | return; |
||
1419 | } |
||
1420 | |||
1421 | protected function _parseRequestID() |
||
1422 | { |
||
1423 | $this->serveroutput->request_id = |
||
1424 | self::_interpretInteger( |
||
1425 | substr($this->serveroutput->body, $this->_parsing->offset, 4) |
||
1426 | ); |
||
1427 | self::_putDebug("request-id " . $this->serveroutput->request_id, 2); |
||
1428 | $this->_parsing->offset += 4; |
||
1429 | return; |
||
1430 | } |
||
1431 | |||
1432 | protected function _interpretInteger($value) |
||
1433 | { |
||
1434 | // they are _signed_ integers |
||
1435 | $value_parsed = 0; |
||
1436 | for ($i = strlen($value); $i > 0; $i--) |
||
1437 | { |
||
1438 | $value_parsed += |
||
1439 | ( |
||
1440 | (1 << (($i - 1) * 8)) |
||
1441 | * |
||
1442 | ord($value[strlen($value) - $i]) |
||
1443 | ); |
||
1444 | } |
||
1445 | if ($value_parsed >= 2147483648) |
||
1446 | { |
||
1447 | $value_parsed -= 4294967296; |
||
1448 | } |
||
1449 | return $value_parsed; |
||
1450 | } |
||
1451 | |||
1452 | protected function _parseResponse() |
||
1453 | { |
||
1454 | } |
||
1455 | |||
1456 | // |
||
1457 | // REQUEST BUILDING |
||
1458 | // |
||
1459 | protected function _stringJob() |
||
1460 | { |
||
1461 | if (!isset($this->setup->charset)) { |
||
1462 | self::setCharset(); |
||
1463 | } |
||
1464 | if (!isset($this->setup->datatype)) { |
||
1465 | self::setBinary(); |
||
1466 | } |
||
1467 | if (!isset($this->setup->uri)) |
||
1468 | { |
||
1469 | $this->getPrinters(); |
||
1470 | unset($this->jobs[count($this->jobs) - 1]); |
||
1471 | unset($this->jobs_uri[count($this->jobs_uri) - 1]); |
||
1472 | unset($this->status[count($this->status) - 1]); |
||
1473 | if (array_key_exists(0, $this->available_printers)) |
||
1474 | { |
||
1475 | self::setPrinterURI($this->available_printers[0]); |
||
1476 | } |
||
1477 | else |
||
1478 | { |
||
1479 | trigger_error( |
||
1480 | _("_stringJob: Printer URI is not set: die"), |
||
1481 | E_USER_WARNING); |
||
1482 | self::_putDebug(_("_stringJob: Printer URI is not set: die"), 4); |
||
1483 | self::_errorLog(" Printer URI is not set, die", 2); |
||
1484 | return FALSE; |
||
1485 | } |
||
1486 | } |
||
1487 | if (!isset($this->setup->copies)) { |
||
1488 | self::setCopies(1); |
||
1489 | } |
||
1490 | if (!isset($this->setup->language)) { |
||
1491 | self::setLanguage('en_us'); |
||
1492 | } |
||
1493 | if (!isset($this->setup->mime_media_type)) { |
||
1494 | self::setMimeMediaType(); |
||
1495 | } |
||
1496 | if (!isset($this->setup->jobname)) { |
||
1497 | self::setJobName(); |
||
1498 | } |
||
1499 | unset($this->setup->jobname); |
||
1500 | if (!isset($this->meta->username)) { |
||
1501 | self::setUserName(); |
||
1502 | } |
||
1503 | if (!isset($this->meta->fidelity)) { |
||
1504 | $this->meta->fidelity = ''; |
||
1505 | } |
||
1506 | if (!isset($this->meta->document_name)) { |
||
1507 | $this->meta->document_name = ''; |
||
1508 | } |
||
1509 | if (!isset($this->meta->sides)) { |
||
1510 | $this->meta->sides = ''; |
||
1511 | } |
||
1512 | if (!isset($this->meta->page_ranges)) { |
||
1513 | $this->meta->page_ranges = ''; |
||
1514 | } |
||
1515 | $jobattributes = ''; |
||
1516 | $operationattributes = ''; |
||
1517 | $printerattributes = ''; |
||
1518 | $this->_buildValues($operationattributes, $jobattributes, $printerattributes); |
||
1519 | self::_setOperationId(); |
||
1520 | if (!isset($this->error_generation->request_body_malformed)) |
||
1521 | { |
||
1522 | $this->error_generation->request_body_malformed = ""; |
||
1523 | } |
||
1524 | $this->stringjob = chr(0x01) . chr(0x01) // 1.1 | version-number |
||
1525 | . chr(0x00) . chr(0x02) // Print-Job | operation-id |
||
1526 | . $this->meta->operation_id // request-id |
||
1527 | . chr(0x01) // start operation-attributes | operation-attributes-tag |
||
1528 | . $this->meta->charset |
||
1529 | . $this->meta->language |
||
1530 | . $this->meta->printer_uri |
||
1531 | . $this->meta->username |
||
1532 | . $this->meta->jobname |
||
1533 | . $this->meta->fidelity |
||
1534 | . $this->meta->document_name |
||
1535 | . $this->meta->mime_media_type |
||
1536 | . $operationattributes; |
||
1537 | if ($this->meta->copies || $this->meta->sides || $this->meta->page_ranges || !empty($jobattributes)) |
||
1538 | { |
||
1539 | $this->stringjob .= |
||
1540 | chr(0x02) // start job-attributes | job-attributes-tag |
||
1541 | . $this->meta->copies |
||
1542 | . $this->meta->sides |
||
1543 | . $this->meta->page_ranges |
||
1544 | . $jobattributes; |
||
1545 | } |
||
1546 | $this->stringjob .= chr(0x03); // end-of-attributes | end-of-attributes-tag |
||
1547 | self::_putDebug( |
||
1548 | sprintf( |
||
1549 | _("String sent to the server is: %s"), |
||
1550 | $this->stringjob) |
||
1551 | ); |
||
1552 | return TRUE; |
||
1553 | } |
||
1554 | |||
1555 | protected function _buildValues(&$operationattributes, &$jobattributes, &$printerattributes) |
||
1556 | { |
||
1557 | $operationattributes = ''; |
||
1558 | foreach($this->operation_tags as $key => $values) |
||
1559 | { |
||
1560 | $item = 0; |
||
1561 | if (array_key_exists('value', $values)) |
||
1562 | { |
||
1563 | foreach($values['value'] as $item_value) |
||
1564 | { |
||
1565 | if ($item == 0) |
||
1566 | { |
||
1567 | $operationattributes .= |
||
1568 | $values['systag'] |
||
1569 | . self::_giveMeStringLength($key) |
||
1570 | . $key |
||
1571 | . self::_giveMeStringLength($item_value) |
||
1572 | . $item_value; |
||
1573 | } |
||
1574 | else |
||
1575 | { |
||
1576 | $operationattributes .= |
||
1577 | $values['systag'] |
||
1578 | . self::_giveMeStringLength('') |
||
1579 | . self::_giveMeStringLength($item_value) |
||
1580 | . $item_value; |
||
1581 | } |
||
1582 | $item++; |
||
1583 | } |
||
1584 | } |
||
1585 | } |
||
1586 | $jobattributes = ''; |
||
1587 | foreach($this->job_tags as $key => $values) |
||
1588 | { |
||
1589 | $item = 0; |
||
1590 | if (array_key_exists('value', $values)) |
||
1591 | { |
||
1592 | foreach($values['value'] as $item_value) |
||
1593 | { |
||
1594 | if ($item == 0) |
||
1595 | { |
||
1596 | $jobattributes .= |
||
1597 | $values['systag'] |
||
1598 | . self::_giveMeStringLength($key) |
||
1599 | . $key |
||
1600 | . self::_giveMeStringLength($item_value) |
||
1601 | . $item_value; |
||
1602 | } |
||
1603 | else |
||
1604 | { |
||
1605 | $jobattributes .= |
||
1606 | $values['systag'] |
||
1607 | . self::_giveMeStringLength('') |
||
1608 | . self::_giveMeStringLength($item_value) |
||
1609 | . $item_value; |
||
1610 | } |
||
1611 | $item++; |
||
1612 | } |
||
1613 | } |
||
1614 | } |
||
1615 | $printerattributes = ''; |
||
1616 | foreach($this->printer_tags as $key => $values) |
||
1617 | { |
||
1618 | $item = 0; |
||
1619 | if (array_key_exists('value', $values)) |
||
1620 | { |
||
1621 | foreach($values['value'] as $item_value) |
||
1622 | { |
||
1623 | if ($item == 0) |
||
1624 | { |
||
1625 | $printerattributes .= |
||
1626 | $values['systag'] |
||
1627 | . self::_giveMeStringLength($key) |
||
1628 | . $key |
||
1629 | . self::_giveMeStringLength($item_value) |
||
1630 | . $item_value; |
||
1631 | } |
||
1632 | else |
||
1633 | { |
||
1634 | $printerattributes .= |
||
1635 | $values['systag'] |
||
1636 | . self::_giveMeStringLength('') |
||
1637 | . self::_giveMeStringLength($item_value) |
||
1638 | . $item_value; |
||
1639 | } |
||
1640 | $item++; |
||
1641 | } |
||
1642 | } |
||
1643 | } |
||
1644 | reset($this->job_tags); |
||
1645 | reset($this->operation_tags); |
||
1646 | reset($this->printer_tags); |
||
1647 | return true; |
||
1648 | } |
||
1649 | |||
1650 | protected function _giveMeStringLength($string) |
||
1651 | { |
||
1652 | $length = strlen($string); |
||
1653 | if ($length > ((0xFF << 8) + 0xFF)) |
||
1654 | { |
||
1655 | $errmsg = sprintf( |
||
1656 | _('max string length for an ipp meta-information = %d, while here %d'), |
||
1657 | ((0xFF << 8) + 0xFF), $length); |
||
1658 | |||
1659 | if ($this->with_exceptions) |
||
1660 | { |
||
1661 | throw new ippException($errmsg); |
||
1662 | } |
||
1663 | else |
||
1664 | { |
||
1665 | trigger_error($errmsg, E_USER_ERROR); |
||
1666 | } |
||
1667 | } |
||
1668 | $int1 = $length & 0xFF; |
||
1669 | $length -= $int1; |
||
1670 | $length = $length >> 8; |
||
1671 | $int2 = $length & 0xFF; |
||
1672 | return chr($int2) . chr($int1); |
||
1673 | } |
||
1674 | |||
1675 | protected function _enumBuild($tag, $value) |
||
1676 | { |
||
1677 | switch ($tag) |
||
1678 | { |
||
1679 | case "orientation-requested": |
||
1680 | switch ($value) |
||
1681 | { |
||
1682 | case 'portrait': |
||
1683 | $value = chr(3); |
||
1684 | break; |
||
1685 | |||
1686 | case 'landscape': |
||
1687 | $value = chr(4); |
||
1688 | break; |
||
1689 | |||
1690 | case 'reverse-landscape': |
||
1691 | $value = chr(5); |
||
1692 | break; |
||
1693 | |||
1694 | case 'reverse-portrait': |
||
1695 | $value = chr(6); |
||
1696 | break; |
||
1697 | } |
||
1698 | break; |
||
1699 | |||
1700 | case "print-quality": |
||
1701 | switch ($value) |
||
1702 | { |
||
1703 | case 'draft': |
||
1704 | $value = chr(3); |
||
1705 | break; |
||
1706 | |||
1707 | case 'normal': |
||
1708 | $value = chr(4); |
||
1709 | break; |
||
1710 | |||
1711 | case 'high': |
||
1712 | $value = chr(5); |
||
1713 | break; |
||
1714 | } |
||
1715 | break; |
||
1716 | |||
1717 | case "finishing": |
||
1718 | switch ($value) |
||
1719 | { |
||
1720 | case 'none': |
||
1721 | $value = chr(3); |
||
1722 | break; |
||
1723 | |||
1724 | case 'staple': |
||
1725 | $value = chr(4); |
||
1726 | break; |
||
1727 | |||
1728 | case 'punch': |
||
1729 | $value = chr(5); |
||
1730 | break; |
||
1731 | |||
1732 | case 'cover': |
||
1733 | $value = chr(6); |
||
1734 | break; |
||
1735 | |||
1736 | case 'bind': |
||
1737 | $value = chr(7); |
||
1738 | break; |
||
1739 | |||
1740 | case 'saddle-stitch': |
||
1741 | $value = chr(8); |
||
1742 | break; |
||
1743 | |||
1744 | case 'edge-stitch': |
||
1745 | $value = chr(9); |
||
1746 | break; |
||
1747 | |||
1748 | case 'staple-top-left': |
||
1749 | $value = chr(20); |
||
1750 | break; |
||
1751 | |||
1752 | case 'staple-bottom-left': |
||
1753 | $value = chr(21); |
||
1754 | break; |
||
1755 | |||
1756 | case 'staple-top-right': |
||
1757 | $value = chr(22); |
||
1758 | break; |
||
1759 | |||
1760 | case 'staple-bottom-right': |
||
1761 | $value = chr(23); |
||
1762 | break; |
||
1763 | |||
1764 | case 'edge-stitch-left': |
||
1765 | $value = chr(24); |
||
1766 | break; |
||
1767 | |||
1768 | case 'edge-stitch-top': |
||
1769 | $value = chr(25); |
||
1770 | break; |
||
1771 | |||
1772 | case 'edge-stitch-right': |
||
1773 | $value = chr(26); |
||
1774 | break; |
||
1775 | |||
1776 | case 'edge-stitch-bottom': |
||
1777 | $value = chr(27); |
||
1778 | break; |
||
1779 | |||
1780 | case 'staple-dual-left': |
||
1781 | $value = chr(28); |
||
1782 | break; |
||
1783 | |||
1784 | case 'staple-dual-top': |
||
1785 | $value = chr(29); |
||
1786 | break; |
||
1787 | |||
1788 | case 'staple-dual-right': |
||
1789 | $value = chr(30); |
||
1790 | break; |
||
1791 | |||
1792 | case 'staple-dual-bottom': |
||
1793 | $value = chr(31); |
||
1794 | break; |
||
1795 | } |
||
1796 | break; |
||
1797 | } |
||
1798 | $prepend = ''; |
||
1799 | while ((strlen($value) + strlen($prepend)) < 4) |
||
1800 | { |
||
1801 | $prepend .= chr(0); |
||
1802 | } |
||
1803 | return $prepend . $value; |
||
1804 | } |
||
1805 | |||
1806 | protected function _integerBuild($value) |
||
1807 | { |
||
1808 | if ($value >= 2147483647 || $value < - 2147483648) |
||
1809 | { |
||
1810 | trigger_error( |
||
1811 | _("Values must be between -2147483648 and 2147483647: assuming '0'"), E_USER_WARNING); |
||
1812 | return chr(0x00) . chr(0x00) . chr(0x00) . chr(0x00); |
||
1813 | } |
||
1814 | $initial_value = $value; |
||
1815 | $int1 = $value & 0xFF; |
||
1816 | $value -= $int1; |
||
1817 | $value = $value >> 8; |
||
1818 | $int2 = $value & 0xFF; |
||
1819 | $value -= $int2; |
||
1820 | $value = $value >> 8; |
||
1821 | $int3 = $value & 0xFF; |
||
1822 | $value -= $int3; |
||
1823 | $value = $value >> 8; |
||
1824 | $int4 = $value & 0xFF; //64bits |
||
1825 | if ($initial_value < 0) { |
||
1826 | $int4 = chr($int4) | chr(0x80); |
||
1827 | } |
||
1828 | else { |
||
1829 | $int4 = chr($int4); |
||
1830 | } |
||
1831 | $value = $int4 . chr($int3) . chr($int2) . chr($int1); |
||
1832 | return $value; |
||
1833 | } |
||
1834 | |||
1835 | protected function _rangeOfIntegerBuild($integers) |
||
1836 | { |
||
1837 | // $integers = split(":", $integers); |
||
1838 | $integers = preg_split("#:#", $integers); |
||
1839 | for ($i = 0; $i < 2; $i++) { |
||
1840 | $outvalue[$i] = self::_integerBuild($integers[$i]); |
||
1841 | } |
||
1842 | return $outvalue[0] . $outvalue[1]; |
||
1843 | } |
||
1844 | |||
1845 | protected function _setJobAttribute($attribute, $value) |
||
1846 | { |
||
1847 | //used by setAttribute |
||
1848 | $tag_type = $this->job_tags[$attribute]['tag']; |
||
1849 | switch ($tag_type) |
||
1850 | { |
||
1851 | case 'integer': |
||
1852 | $this->job_tags[$attribute]['value'][] = self::_integerBuild($value); |
||
1853 | break; |
||
1854 | |||
1855 | case 'boolean': |
||
1856 | case 'nameWithoutLanguage': |
||
1857 | case 'nameWithLanguage': |
||
1858 | case 'textWithoutLanguage': |
||
1859 | case 'textWithLanguage': |
||
1860 | case 'keyword': |
||
1861 | case 'naturalLanguage': |
||
1862 | $this->job_tags[$attribute]['value'][] = $value; |
||
1863 | break; |
||
1864 | |||
1865 | case 'enum': |
||
1866 | $value = $this->_enumBuild($attribute, $value); // may be overwritten by children |
||
1867 | $this->job_tags[$attribute]['value'][] = $value; |
||
1868 | break; |
||
1869 | |||
1870 | case 'rangeOfInteger': |
||
1871 | // $value have to be: INT1:INT2 , eg 100:1000 |
||
1872 | $this->job_tags[$attribute]['value'][] = self::_rangeOfIntegerBuild($value); |
||
1873 | break; |
||
1874 | |||
1875 | case 'resolution': |
||
1876 | if (preg_match("#dpi#", $value)) { |
||
1877 | $unit = chr(0x3); |
||
1878 | } |
||
1879 | if (preg_match("#dpc#", $value)) { |
||
1880 | $unit = chr(0x4); |
||
1881 | } |
||
1882 | $search = array( |
||
1883 | "#(dpi|dpc)#", |
||
1884 | '#(x|-)#' |
||
1885 | ); |
||
1886 | $replace = array( |
||
1887 | "", |
||
1888 | ":" |
||
1889 | ); |
||
1890 | $value = self::_rangeOfIntegerBuild(preg_replace($search, $replace, $value)) . $unit; |
||
1891 | $this->job_tags[$attribute]['value'][] = $value; |
||
1892 | break; |
||
1893 | |||
1894 | default: |
||
1895 | trigger_error(sprintf(_('SetAttribute: Tag "%s": cannot set attribute'), $attribute), E_USER_NOTICE); |
||
1896 | self::_putDebug(sprintf(_('SetAttribute: Tag "%s": cannot set attribute'), $attribute), 2); |
||
1897 | self::_errorLog(sprintf(_('SetAttribute: Tag "%s": cannot set attribute'), $attribute), 2); |
||
1898 | return FALSE; |
||
1899 | break; |
||
1900 | } |
||
1901 | $this->job_tags[$attribute]['systag'] = $this->tags_types[$tag_type]['tag']; |
||
1902 | } |
||
1903 | |||
1904 | protected function _setOperationAttribute($attribute, $value) |
||
1905 | { |
||
1906 | //used by setAttribute |
||
1907 | $tag_type = $this->operation_tags[$attribute]['tag']; |
||
1908 | switch ($tag_type) |
||
1909 | { |
||
1910 | case 'integer': |
||
1911 | $this->operation_tags[$attribute]['value'][] = self::_integerBuild($value); |
||
1912 | break; |
||
1913 | |||
1914 | case 'keyword': |
||
1915 | case 'naturalLanguage': |
||
1916 | $this->operation_tags[$attribute]['value'][] = $value; |
||
1917 | break; |
||
1918 | |||
1919 | default: |
||
1920 | trigger_error(sprintf(_('SetAttribute: Tag "%s": cannot set attribute'), $attribute), E_USER_NOTICE); |
||
1921 | self::_putDebug(sprintf(_('SetAttribute: Tag "%s": cannot set attribute'), $attribute), 2); |
||
1922 | self::_errorLog(sprintf(_('SetAttribute: Tag "%s": cannot set attribute'), $attribute), 2); |
||
1923 | return FALSE; |
||
1924 | break; |
||
1925 | } |
||
1926 | $this->operation_tags[$attribute]['systag'] = $this->tags_types[$tag_type]['tag']; |
||
1927 | } |
||
1928 | |||
1929 | protected function _setPrinterAttribute($attribute, $value) |
||
1930 | { |
||
1931 | //used by setAttribute |
||
1932 | $tag_type = $this->printer_tags[$attribute]['tag']; |
||
1933 | switch ($tag_type) |
||
1934 | { |
||
1935 | case 'integer': |
||
1936 | $this->printer_tags[$attribute]['value'][] = self::_integerBuild($value); |
||
1937 | break; |
||
1938 | |||
1939 | case 'keyword': |
||
1940 | case 'naturalLanguage': |
||
1941 | $this->printer_tags[$attribute]['value'][] = $value; |
||
1942 | break; |
||
1943 | |||
1944 | default: |
||
1945 | trigger_error(sprintf(_('SetAttribute: Tag "%s": cannot set attribute'), $attribute), E_USER_NOTICE); |
||
1946 | self::_putDebug(sprintf(_('SetAttribute: Tag "%s": cannot set attribute'), $attribute), 2); |
||
1947 | self::_errorLog(sprintf(_('SetAttribute: Tag "%s": cannot set attribute'), $attribute), 2); |
||
1948 | return FALSE; |
||
1949 | break; |
||
1950 | } |
||
1951 | $this->printer_tags[$attribute]['systag'] = $this->tags_types[$tag_type]['tag']; |
||
1952 | } |
||
1953 | |||
1954 | // |
||
1955 | // DEBUGGING |
||
1956 | // |
||
1957 | protected function _putDebug($string, $level = 1) |
||
1958 | { |
||
1959 | if ($level === false) { |
||
1960 | return; |
||
1961 | } |
||
1962 | |||
1963 | if ($level < $this->debug_level) { |
||
1964 | return; |
||
1965 | } |
||
1966 | |||
1967 | $this->debug[$this->debug_count] = substr($string, 0, 1024); |
||
1968 | $this->debug_count++; |
||
1969 | //$this->debug .= substr($string,0,1024); |
||
1970 | } |
||
1971 | |||
1972 | // |
||
1973 | // LOGGING |
||
1974 | // |
||
1975 | protected function _errorLog($string_to_log, $level) |
||
1976 | { |
||
1977 | if ($level > $this->log_level) { |
||
1978 | return; |
||
1979 | } |
||
1980 | |||
1981 | $string = sprintf('%s : %s:%s user %s : %s', basename($_SERVER['PHP_SELF']), $this->host, $this->port, $this->requesting_user, $string_to_log); |
||
1982 | |||
1983 | if ($this->log_type == 0) |
||
1984 | { |
||
1985 | error_log($string); |
||
1986 | return; |
||
1987 | } |
||
1988 | |||
1989 | $string = sprintf("%s %s Host %s:%s user %s : %s\n", date('M d H:i:s'), basename($_SERVER['PHP_SELF']), $this->host, $this->port, $this->requesting_user, $string_to_log); |
||
1990 | error_log($string, $this->log_type, $this->log_destination); |
||
1991 | return; |
||
1992 | } |
||
1994 |