developer.jelix.org is not used any more and exists only for history. Post new tickets on the Github account.
developer.jelix.org n'est plus utilisée, et existe uniquement pour son historique. Postez les nouveaux tickets sur le compte github.

Ticket #625: firephp-test.diff

File firephp-test.diff, 30.0 KB (added by bastnic, 13 years ago)
  • build/manifests/jelix-lib.mn

     
    628628! WSDLException.class.php
    629629! WSDLStruct.class.php
    630630! WSException.class.php
     631
     632
     633cd lib/FirePHPCore
     634  fb.php
     635  FirePHP.class.php
     636  LICENSE
     637 No newline at end of file
  • lib/FirePHPCore/LICENSE

     
     1Software License Agreement (New BSD License)
     2
     3Copyright (c) 2006-2008, Christoph Dorn
     4All rights reserved.
     5
     6Redistribution and use in source and binary forms, with or without modification,
     7are permitted provided that the following conditions are met:
     8
     9    * Redistributions of source code must retain the above copyright notice,
     10      this list of conditions and the following disclaimer.
     11
     12    * Redistributions in binary form must reproduce the above copyright notice,
     13      this list of conditions and the following disclaimer in the documentation
     14      and/or other materials provided with the distribution.
     15
     16    * Neither the name of Christoph Dorn nor the names of its
     17      contributors may be used to endorse or promote products derived from this
     18      software without specific prior written permission.
     19
     20THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
     21ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
     22WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
     23DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
     24ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
     25(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
     26LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
     27ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     28(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
     29SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  • lib/FirePHPCore/FirePHP.class.php

     
     1<?php
     2
     3/* ***** BEGIN LICENSE BLOCK *****
     4 * 
     5 * This file is part of FirePHP (http://www.firephp.org/).
     6 *
     7 * Software License Agreement (New BSD License)
     8 *
     9 * Copyright (c) 2006-2008, Christoph Dorn
     10 * All rights reserved.
     11 *
     12 * Redistribution and use in source and binary forms, with or without modification,
     13 * are permitted provided that the following conditions are met:
     14 *
     15 *     * Redistributions of source code must retain the above copyright notice,
     16 *       this list of conditions and the following disclaimer.
     17 *
     18 *     * Redistributions in binary form must reproduce the above copyright notice,
     19 *       this list of conditions and the following disclaimer in the documentation
     20 *       and/or other materials provided with the distribution.
     21 *
     22 *     * Neither the name of Christoph Dorn nor the names of its
     23 *       contributors may be used to endorse or promote products derived from this
     24 *       software without specific prior written permission.
     25 *
     26 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
     27 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
     28 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
     29 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
     30 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
     31 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
     32 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
     33 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     34 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
     35 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     36 *
     37 * ***** END LICENSE BLOCK ***** */
     38 
     39 
     40 
     41/**
     42 * Sends the given data to FirePHP Firefox Extension.
     43 * The data can be displayed in the Firebug Console or in the
     44 * "Server" request tab.
     45 *
     46 * Usage:
     47 *
     48 * require('FirePHP.class.php')
     49 *
     50 * // NOTE: You must have Output Buffering enabled via
     51 * //       ob_start() or output_buffering ini directive.
     52 *
     53 * $firephp = FirePHP::getInstance(true);
     54 *
     55 * $firephp->fb('Hello World'); // Defaults to FirePHP::LOG
     56 *
     57 * $firephp->fb('Log message'  ,FirePHP::LOG);
     58 * $firephp->fb('Info message' ,FirePHP::INFO);
     59 * $firephp->fb('Warn message' ,FirePHP::WARN);
     60 * $firephp->fb('Error message',FirePHP::ERROR);
     61 *
     62 * $firephp->fb('Message with label','Label',FirePHP::LOG);
     63 *
     64 * $firephp->fb(array('key1'=>'val1',
     65 *          'key2'=>array(array('v1','v2'),'v3')),
     66 *    'TestArray',FB_LOG);
     67 *
     68 * function test($Arg1) {
     69 *   throw new Exception('Test Exception');
     70 * }
     71 * try {
     72 *   test(array('Hello'=>'World'));
     73 * } catch(Exception $e) {
     74 *   $firephp->fb($e);
     75 * }
     76 *
     77 * $firephp->fb(array('2 SQL queries took 0.06 seconds',array(
     78 *    array('SQL Statement','Time','Result'),
     79 *    array('SELECT * FROM Foo','0.02',array('row1','row2')),
     80 *    array('SELECT * FROM Bar','0.04',array('row1','row2'))
     81 *   )),FirePHP::TABLE);
     82 *
     83 * // Will show only in "Server" tab for the request
     84 * $firephp->fb(apache_request_headers(),'RequestHeaders',FirePHP::DUMP);
     85 *
     86 *
     87 * @copyright   Copyright (C) 2007-2008 Christoph Dorn
     88 * @author      Christoph Dorn <christoph@christophdorn.com>
     89 * @license     http://www.opensource.org/licenses/bsd-license.php
     90 */
     91
     92class FirePHP {
     93 
     94  const LOG = 'LOG';
     95  const INFO = 'INFO';
     96  const WARN = 'WARN';
     97  const ERROR = 'ERROR';
     98  const DUMP = 'DUMP';
     99  const EXCEPTION = 'EXCEPTION';
     100  const TABLE = 'TABLE';
     101 
     102  protected static $instance = null;
     103 
     104 
     105  public static function getInstance($AutoCreate=false) {
     106    if($AutoCreate===true && !self::$instance) {
     107      self::init();
     108    }
     109    return self::$instance;
     110  }
     111   
     112  public static function init() {
     113    return self::$instance = new self();
     114  }
     115 
     116 
     117   
     118  public function setProcessorUrl($URL)
     119  {
     120    $this->setHeader('X-FirePHP-ProcessorURL', $URL);
     121  }
     122
     123  public function setRendererUrl($URL)
     124  {
     125    $this->setHeader('X-FirePHP-RendererURL', $URL);
     126  }
     127 
     128
     129  public function log() {
     130    $args = func_get_args();
     131    call_user_func_array(array($this,'fb'),array($args,FirePHP::LOG));
     132  }
     133
     134  public function dump($Key, $Variable) {
     135    $args = func_get_args();
     136    call_user_func_array(array($this,'fb'),array($Variable,$Key,FirePHP::DUMP));
     137  }
     138 
     139  public function detectClientExtension() {
     140    /* Check if FirePHP is installed on client */
     141    if(!preg_match_all('/\sFirePHP\/([\.|\d]*)\s?/si',$this->getUserAgent(),$m) ||
     142       !version_compare($m[1][0],'0.0.6','>=')) {
     143      return false;
     144    }
     145    return true;   
     146  }
     147 
     148  public function fb($Object) {
     149 
     150    if (headers_sent($filename, $linenum)) {
     151        throw $this->newException('Headers already sent in '.$filename.' on line '.$linenum.'. Cannot send log data to FirePHP. You must have Output Buffering enabled via ob_start() or output_buffering ini directive.');
     152    }
     153 
     154    $Type = null;
     155 
     156    if(func_num_args()==1) {
     157    } else
     158    if(func_num_args()==2) {
     159      switch(func_get_arg(1)) {
     160        case self::LOG:
     161        case self::INFO:
     162        case self::WARN:
     163        case self::ERROR:
     164        case self::DUMP:
     165        case self::EXCEPTION:
     166        case self::TABLE:
     167          $Type = func_get_arg(1);
     168          break;
     169        default:
     170          $Object = array(func_get_arg(1),$Object);
     171          break;
     172      }
     173    } else
     174    if(func_num_args()==3) {
     175      $Type = func_get_arg(2);
     176      $Object = array(func_get_arg(1),$Object);
     177    } else {
     178      throw $this->newException('Wrong number of arguments to fb() function!');
     179    }
     180 
     181 
     182    if(!$this->detectClientExtension()) {
     183      return false;
     184    }
     185 
     186    if($Object instanceof Exception) {
     187     
     188      $Object = array('Class'=>get_class($Object),
     189                      'Message'=>$Object->getMessage(),
     190                      'File'=>$Object->getFile(),
     191                      'Line'=>$Object->getLine(),
     192                      'Trace'=>$Object->getTrace());
     193      if($Type===null || $Type===self::EXCEPTION) {
     194        $Type = 'TRACE';
     195      }
     196
     197    } else {
     198      if($Type===null) {
     199        $Type = self::LOG;
     200      }
     201    }
     202 
     203        $this->setHeader('X-FirePHP-Data-100000000001','{');
     204    if($Type==self::DUMP) {
     205        $this->setHeader('X-FirePHP-Data-200000000001','"FirePHP.Dump":{');
     206        $this->setHeader('X-FirePHP-Data-299999999999','"__SKIP__":"__SKIP__"},');
     207    } else {
     208        $this->setHeader('X-FirePHP-Data-300000000001','"FirePHP.Firebug.Console":[');
     209        $this->setHeader('X-FirePHP-Data-399999999999','["__SKIP__"]],');
     210    }
     211        $this->setHeader('X-FirePHP-Data-999999999999','"__SKIP__":"__SKIP__"}');
     212 
     213    if($Type==self::DUMP) {
     214        $msg = '"'.$Object[0].'":'.$this->json_encode($Object[1]).',';
     215    } else {
     216        $msg = '["'.$Type.'",'.$this->json_encode($Object).'],';
     217    }
     218   
     219        foreach( explode("\n",chunk_split($msg, 5000, "\n")) as $part ) {
     220         
     221      if($part) {
     222
     223        usleep(1); /* Ensure microtime() increments with each loop. Not very elegant but it works */
     224   
     225                $mt = explode(' ',microtime());
     226                $mt = substr($mt[1],7).substr($mt[0],2);
     227   
     228        $this->setHeader('X-FirePHP-Data-'.(($Type==self::DUMP)?'2':'3').$mt, $part);
     229      }
     230        }
     231   
     232    return true;
     233  }
     234 
     235  protected function setHeader($Name, $Value) {
     236    return header($Name.': '.$Value);
     237  }
     238
     239  protected function getUserAgent() {
     240    return $_SERVER['HTTP_USER_AGENT'];
     241  }
     242
     243  protected function newException($Message) {
     244    return new Exception($Message);
     245  }
     246
     247   
     248  /**
     249   * Converts to and from JSON format.
     250   *
     251   * JSON (JavaScript Object Notation) is a lightweight data-interchange
     252   * format. It is easy for humans to read and write. It is easy for machines
     253   * to parse and generate. It is based on a subset of the JavaScript
     254   * Programming Language, Standard ECMA-262 3rd Edition - December 1999.
     255   * This feature can also be found in  Python. JSON is a text format that is
     256   * completely language independent but uses conventions that are familiar
     257   * to programmers of the C-family of languages, including C, C++, C#, Java,
     258   * JavaScript, Perl, TCL, and many others. These properties make JSON an
     259   * ideal data-interchange language.
     260   *
     261   * This package provides a simple encoder and decoder for JSON notation. It
     262   * is intended for use with client-side Javascript applications that make
     263   * use of HTTPRequest to perform server communication functions - data can
     264   * be encoded into JSON notation for use in a client-side javascript, or
     265   * decoded from incoming Javascript requests. JSON format is native to
     266   * Javascript, and can be directly eval()'ed with no further parsing
     267   * overhead
     268   *
     269   * All strings should be in ASCII or UTF-8 format!
     270   *
     271   * LICENSE: Redistribution and use in source and binary forms, with or
     272   * without modification, are permitted provided that the following
     273   * conditions are met: Redistributions of source code must retain the
     274   * above copyright notice, this list of conditions and the following
     275   * disclaimer. Redistributions in binary form must reproduce the above
     276   * copyright notice, this list of conditions and the following disclaimer
     277   * in the documentation and/or other materials provided with the
     278   * distribution.
     279   *
     280   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
     281   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
     282   * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
     283   * NO EVENT SHALL CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
     284   * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
     285   * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
     286   * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
     287   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
     288   * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
     289   * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
     290   * DAMAGE.
     291   *
     292   * @category
     293   * @package     Services_JSON
     294   * @author      Michal Migurski <mike-json@teczno.com>
     295   * @author      Matt Knapp <mdknapp[at]gmail[dot]com>
     296   * @author      Brett Stimmerman <brettstimmerman[at]gmail[dot]com>
     297   * @author      Christoph Dorn <christoph@christophdorn.com>
     298   * @copyright   2005 Michal Migurski
     299   * @version     CVS: $Id: JSON.php,v 1.31 2006/06/28 05:54:17 migurski Exp $
     300   * @license     http://www.opensource.org/licenses/bsd-license.php
     301   * @link        http://pear.php.net/pepr/pepr-proposal-show.php?id=198
     302   */
     303   
     304     
     305  /**
     306   * Keep a list of objects as we descend into the array so we can detect recursion.
     307   */
     308  private $json_objectStack = array();
     309
     310
     311 /**
     312  * convert a string from one UTF-8 char to one UTF-16 char
     313  *
     314  * Normally should be handled by mb_convert_encoding, but
     315  * provides a slower PHP-only method for installations
     316  * that lack the multibye string extension.
     317  *
     318  * @param    string  $utf8   UTF-8 character
     319  * @return   string  UTF-16 character
     320  * @access   private
     321  */
     322  private function json_utf82utf16($utf8)
     323  {
     324      // oh please oh please oh please oh please oh please
     325      if(function_exists('mb_convert_encoding')) {
     326          return mb_convert_encoding($utf8, 'UTF-16', 'UTF-8');
     327      }
     328
     329      switch(strlen($utf8)) {
     330          case 1:
     331              // this case should never be reached, because we are in ASCII range
     332              // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
     333              return $utf8;
     334
     335          case 2:
     336              // return a UTF-16 character from a 2-byte UTF-8 char
     337              // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
     338              return chr(0x07 & (ord($utf8{0}) >> 2))
     339                   . chr((0xC0 & (ord($utf8{0}) << 6))
     340                       | (0x3F & ord($utf8{1})));
     341
     342          case 3:
     343              // return a UTF-16 character from a 3-byte UTF-8 char
     344              // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
     345              return chr((0xF0 & (ord($utf8{0}) << 4))
     346                       | (0x0F & (ord($utf8{1}) >> 2)))
     347                   . chr((0xC0 & (ord($utf8{1}) << 6))
     348                       | (0x7F & ord($utf8{2})));
     349      }
     350
     351      // ignoring UTF-32 for now, sorry
     352      return '';
     353  }
     354
     355 /**
     356  * encodes an arbitrary variable into JSON format
     357  *
     358  * @param    mixed   $var    any number, boolean, string, array, or object to be encoded.
     359  *                           see argument 1 to Services_JSON() above for array-parsing behavior.
     360  *                           if var is a strng, note that encode() always expects it
     361  *                           to be in ASCII or UTF-8 format!
     362  *
     363  * @return   mixed   JSON string representation of input var or an error if a problem occurs
     364  * @access   public
     365  */
     366  private function json_encode($var)
     367  {
     368   
     369    if(is_object($var)) {
     370      if(in_array($var,$this->json_objectStack)) {
     371        return '"** Recursion **"';
     372      }
     373    }
     374         
     375      switch (gettype($var)) {
     376          case 'boolean':
     377              return $var ? 'true' : 'false';
     378
     379          case 'NULL':
     380              return 'null';
     381
     382          case 'integer':
     383              return (int) $var;
     384
     385          case 'double':
     386          case 'float':
     387              return (float) $var;
     388
     389          case 'string':
     390              // STRINGS ARE EXPECTED TO BE IN ASCII OR UTF-8 FORMAT
     391              $ascii = '';
     392              $strlen_var = strlen($var);
     393
     394             /*
     395              * Iterate over every character in the string,
     396              * escaping with a slash or encoding to UTF-8 where necessary
     397              */
     398              for ($c = 0; $c < $strlen_var; ++$c) {
     399
     400                  $ord_var_c = ord($var{$c});
     401
     402                  switch (true) {
     403                      case $ord_var_c == 0x08:
     404                          $ascii .= '\b';
     405                          break;
     406                      case $ord_var_c == 0x09:
     407                          $ascii .= '\t';
     408                          break;
     409                      case $ord_var_c == 0x0A:
     410                          $ascii .= '\n';
     411                          break;
     412                      case $ord_var_c == 0x0C:
     413                          $ascii .= '\f';
     414                          break;
     415                      case $ord_var_c == 0x0D:
     416                          $ascii .= '\r';
     417                          break;
     418
     419                      case $ord_var_c == 0x22:
     420                      case $ord_var_c == 0x2F:
     421                      case $ord_var_c == 0x5C:
     422                          // double quote, slash, slosh
     423                          $ascii .= '\\'.$var{$c};
     424                          break;
     425
     426                      case (($ord_var_c >= 0x20) && ($ord_var_c <= 0x7F)):
     427                          // characters U-00000000 - U-0000007F (same as ASCII)
     428                          $ascii .= $var{$c};
     429                          break;
     430
     431                      case (($ord_var_c & 0xE0) == 0xC0):
     432                          // characters U-00000080 - U-000007FF, mask 110XXXXX
     433                          // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
     434                          $char = pack('C*', $ord_var_c, ord($var{$c + 1}));
     435                          $c += 1;
     436                          $utf16 = $this->json_utf82utf16($char);
     437                          $ascii .= sprintf('\u%04s', bin2hex($utf16));
     438                          break;
     439
     440                      case (($ord_var_c & 0xF0) == 0xE0):
     441                          // characters U-00000800 - U-0000FFFF, mask 1110XXXX
     442                          // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
     443                          $char = pack('C*', $ord_var_c,
     444                                       ord($var{$c + 1}),
     445                                       ord($var{$c + 2}));
     446                          $c += 2;
     447                          $utf16 = $this->json_utf82utf16($char);
     448                          $ascii .= sprintf('\u%04s', bin2hex($utf16));
     449                          break;
     450
     451                      case (($ord_var_c & 0xF8) == 0xF0):
     452                          // characters U-00010000 - U-001FFFFF, mask 11110XXX
     453                          // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
     454                          $char = pack('C*', $ord_var_c,
     455                                       ord($var{$c + 1}),
     456                                       ord($var{$c + 2}),
     457                                       ord($var{$c + 3}));
     458                          $c += 3;
     459                          $utf16 = $this->json_utf82utf16($char);
     460                          $ascii .= sprintf('\u%04s', bin2hex($utf16));
     461                          break;
     462
     463                      case (($ord_var_c & 0xFC) == 0xF8):
     464                          // characters U-00200000 - U-03FFFFFF, mask 111110XX
     465                          // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
     466                          $char = pack('C*', $ord_var_c,
     467                                       ord($var{$c + 1}),
     468                                       ord($var{$c + 2}),
     469                                       ord($var{$c + 3}),
     470                                       ord($var{$c + 4}));
     471                          $c += 4;
     472                          $utf16 = $this->json_utf82utf16($char);
     473                          $ascii .= sprintf('\u%04s', bin2hex($utf16));
     474                          break;
     475
     476                      case (($ord_var_c & 0xFE) == 0xFC):
     477                          // characters U-04000000 - U-7FFFFFFF, mask 1111110X
     478                          // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
     479                          $char = pack('C*', $ord_var_c,
     480                                       ord($var{$c + 1}),
     481                                       ord($var{$c + 2}),
     482                                       ord($var{$c + 3}),
     483                                       ord($var{$c + 4}),
     484                                       ord($var{$c + 5}));
     485                          $c += 5;
     486                          $utf16 = $this->json_utf82utf16($char);
     487                          $ascii .= sprintf('\u%04s', bin2hex($utf16));
     488                          break;
     489                  }
     490              }
     491
     492              return '"'.$ascii.'"';
     493
     494          case 'array':
     495             /*
     496              * As per JSON spec if any array key is not an integer
     497              * we must treat the the whole array as an object. We
     498              * also try to catch a sparsely populated associative
     499              * array with numeric keys here because some JS engines
     500              * will create an array with empty indexes up to
     501              * max_index which can cause memory issues and because
     502              * the keys, which may be relevant, will be remapped
     503              * otherwise.
     504              *
     505              * As per the ECMA and JSON specification an object may
     506              * have any string as a property. Unfortunately due to
     507              * a hole in the ECMA specification if the key is a
     508              * ECMA reserved word or starts with a digit the
     509              * parameter is only accessible using ECMAScript's
     510              * bracket notation.
     511              */
     512
     513              // treat as a JSON object
     514              if (is_array($var) && count($var) && (array_keys($var) !== range(0, sizeof($var) - 1))) {
     515                 
     516                  $this->json_objectStack[] = $var;
     517
     518                  $properties = array_map(array($this, 'json_name_value'),
     519                                          array_keys($var),
     520                                          array_values($var));
     521
     522                  array_pop($this->json_objectStack);
     523
     524                  foreach($properties as $property) {
     525                      if($property instanceof Exeption) {
     526                          return $property;
     527                      }
     528                  }
     529
     530                  return '{' . join(',', $properties) . '}';
     531              }
     532
     533              $this->json_objectStack[] = $var;
     534
     535              // treat it like a regular array
     536              $elements = array_map(array($this, 'json_encode'), $var);
     537
     538              array_pop($this->json_objectStack);
     539
     540              foreach($elements as $element) {
     541                  if($element instanceof Exception) {
     542                      return $element;
     543                  }
     544              }
     545
     546              return '[' . join(',', $elements) . ']';
     547
     548          case 'object':
     549              $vars = get_object_vars($var);
     550
     551              $this->json_objectStack[] = $var;
     552
     553              $properties = array_map(array($this, 'json_name_value'),
     554                                      array_keys($vars),
     555                                      array_values($vars));
     556
     557              array_pop($this->json_objectStack);
     558             
     559              foreach($properties as $property) {
     560                  if($property instanceof Exception) {
     561                      return $property;
     562                  }
     563              }
     564
     565              return '{' . join(',', $properties) . '}';
     566
     567          default:
     568              return null;
     569      }
     570  }
     571
     572 /**
     573  * array-walking function for use in generating JSON-formatted name-value pairs
     574  *
     575  * @param    string  $name   name of key to use
     576  * @param    mixed   $value  reference to an array element to be encoded
     577  *
     578  * @return   string  JSON-formatted name-value pair, like '"name":value'
     579  * @access   private
     580  */
     581  private function json_name_value($name, $value)
     582  {
     583      $encoded_value = $this->json_encode($value);
     584
     585      if($encoded_value instanceof Exception) {
     586          return $encoded_value;
     587      }
     588
     589      return $this->json_encode(strval($name)) . ':' . $encoded_value;
     590  }
     591
     592}
     593
     594?>
     595 No newline at end of file
  • lib/FirePHPCore/fb.php

     
     1<?php
     2
     3/* ***** BEGIN LICENSE BLOCK *****
     4 * 
     5 * This file is part of FirePHP (http://www.firephp.org/).
     6 *
     7 * Software License Agreement (New BSD License)
     8 *
     9 * Copyright (c) 2006-2008, Christoph Dorn
     10 * All rights reserved.
     11 *
     12 * Redistribution and use in source and binary forms, with or without modification,
     13 * are permitted provided that the following conditions are met:
     14 *
     15 *     * Redistributions of source code must retain the above copyright notice,
     16 *       this list of conditions and the following disclaimer.
     17 *
     18 *     * Redistributions in binary form must reproduce the above copyright notice,
     19 *       this list of conditions and the following disclaimer in the documentation
     20 *       and/or other materials provided with the distribution.
     21 *
     22 *     * Neither the name of Christoph Dorn nor the names of its
     23 *       contributors may be used to endorse or promote products derived from this
     24 *       software without specific prior written permission.
     25 *
     26 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
     27 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
     28 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
     29 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
     30 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
     31 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
     32 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
     33 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     34 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
     35 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     36 *
     37 * ***** END LICENSE BLOCK ***** */
     38
     39
     40require_once dirname(__FILE__).'/FirePHP.class.php';
     41
     42/**
     43 * Sends the given data to FirePHP Firefox Extension.
     44 * The data can be displayed in the Firebug Console or in the
     45 * "Server" request tab.
     46 *
     47 * Usage:
     48 *
     49 * require('fb.php')
     50 *
     51 * // NOTE: You must have Output Buffering enabled via
     52 * //       ob_start() or output_buffering ini directive.
     53 *
     54 * fb('Hello World'); // Defaults to FirePHP::LOG
     55 *
     56 * fb('Log message'  ,FirePHP::LOG);
     57 * fb('Info message' ,FirePHP::INFO);
     58 * fb('Warn message' ,FirePHP::WARN);
     59 * fb('Error message',FirePHP::ERROR);
     60 *
     61 * fb('Message with label','Label',FirePHP::LOG);
     62 *
     63 * fb(array('key1'=>'val1',
     64 *          'key2'=>array(array('v1','v2'),'v3')),
     65 *    'TestArray',FB_LOG);
     66 *
     67 * function test($Arg1) {
     68 *   throw new Exception('Test Exception');
     69 * }
     70 * try {
     71 *   test(array('Hello'=>'World'));
     72 * } catch(Exception $e) {
     73 *   fb($e);
     74 * }
     75 *
     76 * fb(array('2 SQL queries took 0.06 seconds',array(
     77 *    array('SQL Statement','Time','Result'),
     78 *    array('SELECT * FROM Foo','0.02',array('row1','row2')),
     79 *    array('SELECT * FROM Bar','0.04',array('row1','row2'))
     80 *   )),FirePHP::TABLE);
     81 *
     82 * // Will show only in "Server" tab for the request
     83 * fb(apache_request_headers(),'RequestHeaders',FirePHP::DUMP);
     84 *
     85 *
     86 * @return Boolean  True if FirePHP was detected and headers were written, false otherwise
     87 *
     88 * @copyright   Copyright (C) 2007-2008 Christoph Dorn
     89 * @author      Christoph Dorn <christoph@christophdorn.com>
     90 * @license     http://www.opensource.org/licenses/bsd-license.php
     91 */
     92function fb() {
     93
     94  $instance = FirePHP::getInstance(true);
     95 
     96  $args = func_get_args();
     97  return call_user_func_array(array($instance,'fb'),$args);
     98     
     99  return true;
     100}
     101
     102?>
     103 No newline at end of file
  • lib/jelix/core/response/jResponseHtml.class.php

     
    44* @subpackage  core_response
    55* @author      Laurent Jouanneau
    66* @contributor Yann (description and keywords), Dominique Papin
    7 * @contributor Warren Seine
     7* @contributor Warren Seine, Bastien Jaillot
    88* @copyright   2005-2008 Laurent Jouanneau, 2006 Yann, 2007 Dominique Papin
    9 * @copyright   2008 Warren Seine
     9* @copyright   2008 Warren Seine, 2008 Bastien Jaillot
    1010*              few lines of code are copyrighted CopixTeam http://www.copix.org
    1111* @link        http://www.jelix.org
    1212* @licence     GNU Lesser General Public Licence see LICENCE file or http://www.gnu.org/licenses/lgpl.html
     
    145145     * @return boolean    true if the generated content is ok
    146146     */
    147147    final public function output(){
     148        // FirePHP messages should be send before any headers
     149        if(count($GLOBALS['gJCoord']->logMessages)) {
     150            if(count($GLOBALS['gJCoord']->logMessages['firephp'])) {
     151                require_once (LIB_PATH.'FirePHPCore/FirePHP.class.php');
     152                $f = FirePHP::getInstance(true);
     153                foreach($GLOBALS['gJCoord']->logMessages['firephp'] as $m) {
     154                    $f->fb($m);
     155                }
     156            }
     157        }
     158   
    148159        $this->_headSent = 0;
    149160        if($this->_isXhtml && $this->xhtmlContentType && strstr($_SERVER['HTTP_ACCEPT'],'application/xhtml+xml')){
    150161            $this->_httpHeaders['Content-Type']='application/xhtml+xml;charset='.$this->_charset;
  • lib/jelix/CREDITS

     
    3838 - add a jFormBase prepareDaoFromControls which return a DAO filled by form (#497)
    3939 - jforms tpl plugins : choice of builder (#583)
    4040 - fixed bug in jacl2 events : conflict with jacl (#621)
     41 - add support of FirePHP (#625)
    4142
    4243Laurent Jouanneau (laurentj):
    4344 - Conceptor and main developer of Jelix