      1:   2:   3:   4:   5:   6:   7:   8:   9:  10:  11:  12:  13:  14:  15:  16:  17:  18:  19:  20:  21:  22:  23:  24:  25:  26:  27:  28:  29:  30:  31:  32:  33:  34:  35:  36:  37:  38:  39:  40:  41:  42:  43:  44:  45:  46:  47:  48:  49:  50:  51:  52:  53:  54:  55:  56:  57:  58:  59:  60:  61:  62:  63:  64:  65:  66:  67:  68:  69:  70:  71:  72:  73:  74:  75:  76:  77:  78:  79:  80:  81:  82:  83:  84:  85:  86:  87:  88:  89:  90:  91:  92:  93:  94:  95:  96:  97:  98:  99: 100: 101: 102: 103: 104: 105: 106:

    <?php /*-*- mode: php; tab-width:4 -*-*/

      /** java_NativeParser.php -- PHP/Java Bridge protocol parser.
       *
       * Copyright (C) 2003-2007 Jost Boekemeier
       *
       * This file is part of the PHP/Java Bridge.
       *
       * The PHP/Java Bridge ("the library") is free software; you can
       * redistribute it and/or modify it under the terms of the GNU General
       * Public License as published by the Free Software Foundation; either
       * version 2, or (at your option) any later version.
       *
       * The library is distributed in the hope that it will be useful, but
       * WITHOUT ANY WARRANTY; without even the implied warranty of
       * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
       * General Public License for more details.
       *
       * You should have received a copy of the GNU General Public License
       * along with the PHP/Java Bridge; see the file COPYING.  If not, write to the
       * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
       * 02111-1307 USA.
       *
       * Linking this file statically or dynamically with other modules is
       * making a combined work based on this library.  Thus, the terms and
       * conditions of the GNU General Public License cover the whole
       * combination.
       *
       * As a special exception, the copyright holders of this library give you
       * permission to link this library with independent modules to produce an
       * executable, regardless of the license terms of these independent
       * modules, and to copy and distribute the resulting executable under
       * terms of your choice, provided that you also meet, for each linked
       * independent module, the terms and conditions of the license of that
       * module.  An independent module is a module which is not derived from
       * or based on this library.  If you modify this library, you may extend
       * this exception to your version of the library, but you are not
       * obligated to do so.  If you do not wish to do so, delete this
       * exception statement from your version.
       *
       * @author     Jost Boekemeier
       * @license    GPL
       * @link       http://php-java-bridge.sf.net
       */
    require_once(java_get_base()."/Client.inc");

    /**
     * @access private
     */
    class java_NativeParser {
      public $parser, $handler;
      public $level, $event;

      public $buf;

      function __construct($handler) {
        $this->handler = $handler;
        $this->parser = xml_parser_create();
        xml_parser_set_option($this->parser, XML_OPTION_CASE_FOLDING, 0);
        xml_set_object($this->parser, $this);
        xml_set_element_handler($this->parser, "begin", "end");
        xml_parse($this->parser, "<F>");
        $this->level = 0;
      }
      function begin($parser, $name, $param) {

        $this->event = true;
        switch($name) {
        case 'X': case 'A': $this->level+=1;
        }
        $this->handler->begin($name, $param);
      }
      function end($parser, $name) {

        $this->handler->end($name);
        switch($name) {
        case 'X': case 'A': $this->level-=1;
        }
      }
      function getData($str) {
        return base64_decode($str);
      }
      function parse() {
        // NOTE: RECV_SIZE must be the same as the underlying
        // PHP stream buffer size, otherwise this function will hang.
        do {
          $this->event = false;
          $buf = $this->buf = $this->handler->read(JAVA_RECV_SIZE);
          $len = strlen($buf);
          if(!xml_parse($this->parser, $buf, $len==0)) {
            $this->handler->protocol->handler->shutdownBrokenConnection(
                   sprintf("protocol error: %s, %s at col %d. Check the back end log for OutOfMemoryErrors.",
                        $buf,
                        xml_error_string(xml_get_error_code($this->parser)),
                        xml_get_current_column_number($this->parser)));
          }
        } while(!$this->event || $this->level>0);
      }

      function parserError() {
        $this->handler->protocol->handler->shutdownBrokenConnection(
           sprintf("protocol error: %s. Check the back end log for details.", $this->buf));
      }
    }
    ?>