source: trunk/client/modules/Elezioni/grafici/jpgraph_errhandler.inc.php@ 417

Last change on this file since 417 was 346, checked in by roby, 4 years ago

ulteriori modifiche per adeguamento a php7
Client: aggiornamento jpgraph

File size: 11.7 KB
Line 
1<?php
2//=======================================================================
3// File: JPGRAPH_ERRHANDLER.PHP
4// Description: Error handler class together with handling of localized
5// error messages. All localized error messages are stored
6// in a separate file under the "lang/" subdirectory.
7// Created: 2006-09-24
8// Ver: $Id: jpgraph_errhandler.inc.php 1920 2009-12-08 10:02:26Z ljp $
9//
10// Copyright 2006 (c) Aditus Consulting. All rights reserved.
11//========================================================================
12
13if( !defined('DEFAULT_ERR_LOCALE') ) {
14 define('DEFAULT_ERR_LOCALE','en');
15}
16
17if( !defined('USE_IMAGE_ERROR_HANDLER') ) {
18 define('USE_IMAGE_ERROR_HANDLER',true);
19}
20
21if( !defined('IMG_PNG') ) {
22 define('IMG_PNG',true);
23}
24
25GLOBAL $__jpg_err_locale ;
26$__jpg_err_locale = DEFAULT_ERR_LOCALE;
27
28class ErrMsgText {
29 private $lt=NULL;
30 function __construct() {
31 GLOBAL $__jpg_err_locale;
32 $file = 'lang/'.$__jpg_err_locale.'.inc.php';
33
34 // If the chosen locale doesn't exist try english
35 if( !file_exists(dirname(__FILE__).'/'.$file) ) {
36 $__jpg_err_locale = 'en';
37 }
38
39 $file = 'lang/'.$__jpg_err_locale.'.inc.php';
40 if( !file_exists(dirname(__FILE__).'/'.$file) ) {
41 die('Chosen locale file ("'.$file.'") for error messages does not exist or is not readable for the PHP process. Please make sure that the file exists and that the file permissions are such that the PHP process is allowed to read this file.');
42 }
43 require($file);
44 $this->lt = $_jpg_messages;
45 }
46
47 function Get($errnbr,$a1=null,$a2=null,$a3=null,$a4=null,$a5=null) {
48 GLOBAL $__jpg_err_locale;
49 if( !isset($this->lt[$errnbr]) ) {
50 return 'Internal error: The specified error message ('.$errnbr.') does not exist in the chosen locale ('.$__jpg_err_locale.')';
51 }
52 $ea = $this->lt[$errnbr];
53 $j=0;
54 if( $a1 !== null ) {
55 $argv[$j++] = $a1;
56 if( $a2 !== null ) {
57 $argv[$j++] = $a2;
58 if( $a3 !== null ) {
59 $argv[$j++] = $a3;
60 if( $a4 !== null ) {
61 $argv[$j++] = $a4;
62 if( $a5 !== null ) {
63 $argv[$j++] = $a5;
64 }
65 }
66 }
67 }
68 }
69 $numargs = $j;
70 if( $ea[1] != $numargs ) {
71 // Error message argument count do not match.
72 // Just return the error message without arguments.
73 return $ea[0];
74 }
75 switch( $numargs ) {
76 case 1:
77 $msg = sprintf($ea[0],$argv[0]);
78 break;
79 case 2:
80 $msg = sprintf($ea[0],$argv[0],$argv[1]);
81 break;
82 case 3:
83 $msg = sprintf($ea[0],$argv[0],$argv[1],$argv[2]);
84 break;
85 case 4:
86 $msg = sprintf($ea[0],$argv[0],$argv[1],$argv[2],$argv[3]);
87 break;
88 case 5:
89 $msg = sprintf($ea[0],$argv[0],$argv[1],$argv[2],$argv[3],$argv[4]);
90 break;
91 case 0:
92 default:
93 $msg = sprintf($ea[0]);
94 break;
95 }
96 return $msg;
97 }
98}
99
100//
101// A wrapper class that is used to access the specified error object
102// (to hide the global error parameter and avoid having a GLOBAL directive
103// in all methods.
104//
105class JpGraphError {
106 private static $__iImgFlg = true;
107 private static $__iLogFile = '';
108 private static $__iTitle = 'JpGraph Error: ';
109 public static function Raise($aMsg,$aHalt=true){
110 throw new JpGraphException($aMsg);
111 }
112 public static function SetErrLocale($aLoc) {
113 GLOBAL $__jpg_err_locale ;
114 $__jpg_err_locale = $aLoc;
115 }
116 public static function RaiseL($errnbr,$a1=null,$a2=null,$a3=null,$a4=null,$a5=null) {
117 throw new JpGraphExceptionL($errnbr,$a1,$a2,$a3,$a4,$a5);
118 }
119 public static function SetImageFlag($aFlg=true) {
120 self::$__iImgFlg = $aFlg;
121 }
122 public static function GetImageFlag() {
123 return self::$__iImgFlg;
124 }
125 public static function SetLogFile($aFile) {
126 self::$__iLogFile = $aFile;
127 }
128 public static function GetLogFile() {
129 return self::$__iLogFile;
130 }
131 public static function SetTitle($aTitle) {
132 self::$__iTitle = $aTitle;
133 }
134 public static function GetTitle() {
135 return self::$__iTitle;
136 }
137}
138
139class JpGraphException extends Exception {
140 // Redefine the exception so message isn't optional
141 public function __construct($message, $code = 0) {
142 // make sure everything is assigned properly
143 parent::__construct($message, $code);
144 }
145 // custom string representation of object
146 public function _toString() {
147 return __CLASS__ . ": [{$this->code}]: {$this->message} at " . basename($this->getFile()) . ":" . $this->getLine() . "\n" . $this->getTraceAsString() . "\n";
148 }
149 // custom representation of error as an image
150 public function Stroke() {
151 if( JpGraphError::GetImageFlag() ) {
152 $errobj = new JpGraphErrObjectImg();
153 $errobj->SetTitle(JpGraphError::GetTitle());
154 }
155 else {
156 $errobj = new JpGraphErrObject();
157 $errobj->SetTitle(JpGraphError::GetTitle());
158 $errobj->SetStrokeDest(JpGraphError::GetLogFile());
159 }
160 $errobj->Raise($this->getMessage());
161 }
162 static public function defaultHandler(Throwable $exception) {
163 global $__jpg_OldHandler;
164 if( $exception instanceof JpGraphException ) {
165 $exception->Stroke();
166 }
167 else {
168 // Restore old handler
169 if( $__jpg_OldHandler !== NULL ) {
170 set_exception_handler($__jpg_OldHandler);
171 }
172 throw $exception;
173 }
174 }
175}
176
177class JpGraphExceptionL extends JpGraphException {
178 // Redefine the exception so message isn't optional
179 public function __construct($errcode,$a1=null,$a2=null,$a3=null,$a4=null,$a5=null) {
180 // make sure everything is assigned properly
181 $errtxt = new ErrMsgText();
182 JpGraphError::SetTitle('JpGraph Error: '.$errcode);
183 parent::__construct($errtxt->Get($errcode,$a1,$a2,$a3,$a4,$a5), 0);
184 }
185}
186
187// Setup the default handler
188global $__jpg_OldHandler;
189$__jpg_OldHandler = set_exception_handler(array('JpGraphException','defaultHandler'));
190
191//
192// First of all set up a default error handler
193//
194
195//=============================================================
196// The default trivial text error handler.
197//=============================================================
198class JpGraphErrObject {
199
200 protected $iTitle = "JpGraph error: ";
201 protected $iDest = false;
202
203
204 function __construct() {
205 // Empty. Reserved for future use
206 }
207
208 function SetTitle($aTitle) {
209 $this->iTitle = $aTitle;
210 }
211
212 function SetStrokeDest($aDest) {
213 $this->iDest = $aDest;
214 }
215
216 // If aHalt is true then execution can't continue. Typical used for fatal errors
217 function Raise($aMsg,$aHalt=false) {
218 if( $this->iDest != '' ) {
219 if( $this->iDest == 'syslog' ) {
220 error_log($this->iTitle.$aMsg);
221 }
222 else {
223 $str = '['.date('r').'] '.$this->iTitle.$aMsg."\n";
224 $f = @fopen($this->iDest,'a');
225 if( $f ) {
226 @fwrite($f,$str);
227 @fclose($f);
228 }
229 }
230 }
231 else {
232 $aMsg = $this->iTitle.$aMsg;
233 // Check SAPI and if we are called from the command line
234 // send the error to STDERR instead
235 if( PHP_SAPI == 'cli' ) {
236 fwrite(STDERR,$aMsg);
237 }
238 else {
239 echo $aMsg;
240 }
241 }
242 if( $aHalt )
243 exit(1);
244 }
245}
246
247//==============================================================
248// An image based error handler
249//==============================================================
250class JpGraphErrObjectImg extends JpGraphErrObject {
251
252 function __construct() {
253 parent::__construct();
254 // Empty. Reserved for future use
255 }
256
257 function Raise($aMsg,$aHalt=true) {
258 $img_iconerror =
259 'iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAMAAAC7IEhfAAAAaV'.
260 'BMVEX//////2Xy8mLl5V/Z2VvMzFi/v1WyslKlpU+ZmUyMjEh/'.
261 'f0VyckJlZT9YWDxMTDjAwMDy8sLl5bnY2K/MzKW/v5yyspKlpY'.
262 'iYmH+MjHY/PzV/f2xycmJlZVlZWU9MTEXY2Ms/PzwyMjLFTjea'.
263 'AAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACx'.
264 'IAAAsSAdLdfvwAAAAHdElNRQfTBgISOCqusfs5AAABLUlEQVR4'.
265 '2tWV3XKCMBBGWfkranCIVClKLd/7P2Q3QsgCxjDTq+6FE2cPH+'.
266 'xJ0Ogn2lQbsT+Wrs+buAZAV4W5T6Bs0YXBBwpKgEuIu+JERAX6'.
267 'wM2rHjmDdEITmsQEEmWADgZm6rAjhXsoMGY9B/NZBwJzBvn+e3'.
268 'wHntCAJdGu9SviwIwoZVDxPB9+Rc0TSEbQr0j3SA1gwdSn6Db0'.
269 '6Tm1KfV6yzWGQO7zdpvyKLKBDmRFjzeB3LYgK7r6A/noDAfjtS'.
270 'IXaIzbJSv6WgUebTMV4EoRB8a2mQiQjgtF91HdKDKZ1gtFtQjk'.
271 'YcWaR5OKOhkYt+ZsTFdJRfPAApOpQYJTNHvCRSJR6SJngQadfc'.
272 'vd69OLMddVOPCGVnmrFD8bVYd3JXfxXPtLR/+mtv59/ALWiiMx'.
273 'qL72fwAAAABJRU5ErkJggg==' ;
274
275
276 if( function_exists("imagetypes") ) {
277 $supported = imagetypes();
278 } else {
279 $supported = 0;
280 }
281
282 if( !function_exists('imagecreatefromstring') ) {
283 $supported = 0;
284 }
285
286 if( ob_get_length() || headers_sent() || !($supported & IMG_PNG) ) {
287 // Special case for headers already sent or that the installation doesn't support
288 // the PNG format (which the error icon is encoded in).
289 // Dont return an image since it can't be displayed
290 die($this->iTitle.' '.$aMsg);
291 }
292
293 $aMsg = wordwrap($aMsg,55);
294 $lines = substr_count($aMsg,"\n");
295
296 // Create the error icon GD
297 $erricon = Image::CreateFromString(base64_decode($img_iconerror));
298
299 // Create an image that contains the error text.
300 $w=400;
301 $h=100 + 15*max(0,$lines-3);
302
303 $img = new Image($w,$h);
304
305
306 // Drop shadow
307 $img->SetColor("gray");
308 $img->FilledRectangle(5,5,$w-1,$h-1,10);
309 $img->SetColor("gray:0.7");
310 $img->FilledRectangle(5,5,$w-3,$h-3,10);
311
312 // Window background
313 $img->SetColor("lightblue");
314 $img->FilledRectangle(1,1,$w-5,$h-5);
315 $img->CopyCanvasH($img->img,$erricon,5,30,0,0,40,40);
316
317 // Window border
318 $img->SetColor("black");
319 $img->Rectangle(1,1,$w-5,$h-5);
320 $img->Rectangle(0,0,$w-4,$h-4);
321
322 // Window top row
323 $img->SetColor("darkred");
324 for($y=3; $y < 18; $y += 2 )
325 $img->Line(1,$y,$w-6,$y);
326
327 // "White shadow"
328 $img->SetColor("white");
329
330 // Left window edge
331 $img->Line(2,2,2,$h-5);
332 $img->Line(2,2,$w-6,2);
333
334 // "Gray button shadow"
335 $img->SetColor("darkgray");
336
337 // Gray window shadow
338 $img->Line(2,$h-6,$w-5,$h-6);
339 $img->Line(3,$h-7,$w-5,$h-7);
340
341 // Window title
342 $m = floor($w/2-5);
343 $l = 110;
344 $img->SetColor("lightgray:1.3");
345 $img->FilledRectangle($m-$l,2,$m+$l,16);
346
347 // Stroke text
348 $img->SetColor("darkred");
349 $img->SetFont(FF_FONT2,FS_BOLD);
350 $img->StrokeText($m-90,15,$this->iTitle);
351 $img->SetColor("black");
352 $img->SetFont(FF_FONT1,FS_NORMAL);
353 $txt = new Text($aMsg,52,25);
354 $txt->SetFont(FF_FONT1);
355 $txt->Align("left","top");
356 $txt->Stroke($img);
357 if ($this->iDest) {
358 $img->Stream($this->iDest);
359 } else {
360 $img->Headers();
361 $img->Stream();
362 }
363 if( $aHalt )
364 die();
365 }
366}
367
368
369
370if( ! USE_IMAGE_ERROR_HANDLER ) {
371 JpGraphError::SetImageFlag(false);
372}
373?>
Note: See TracBrowser for help on using the repository browser.