예제 #1
0
/**
 * End element handler for the XML parser
 *
 * @return void
 */
function XML_RPC_ee($parser, $name)
{
    global $XML_RPC_xh, $XML_RPC_Types, $XML_RPC_String;
    switch ($name) {
        case 'STRUCT':
        case 'ARRAY':
            if ($XML_RPC_xh[$parser]['cm'] && substr($XML_RPC_xh[$parser]['st'], -1) == ',') {
                $XML_RPC_xh[$parser]['st'] = substr($XML_RPC_xh[$parser]['st'], 0, -1);
            }
            $XML_RPC_xh[$parser]['st'] .= ')';
            $XML_RPC_xh[$parser]['vt'] = strtolower($name);
            $XML_RPC_xh[$parser]['cm']--;
            break;
        case 'NAME':
            $XML_RPC_xh[$parser]['st'] .= $XML_RPC_xh[$parser]['ac'] . "' => ";
            break;
        case 'BOOLEAN':
            // special case here: we translate boolean 1 or 0 into PHP
            // constants true or false
            if ($XML_RPC_xh[$parser]['ac'] == '1') {
                $XML_RPC_xh[$parser]['ac'] = 'true';
            } else {
                $XML_RPC_xh[$parser]['ac'] = 'false';
            }
            $XML_RPC_xh[$parser]['vt'] = strtolower($name);
            // Drop through intentionally.
        // Drop through intentionally.
        case 'I4':
        case 'INT':
        case 'STRING':
        case 'DOUBLE':
        case 'DATETIME.ISO8601':
        case 'BASE64':
            if ($XML_RPC_xh[$parser]['qt'] == 1) {
                // we use double quotes rather than single so backslashification works OK
                $XML_RPC_xh[$parser]['st'] .= '"' . $XML_RPC_xh[$parser]['ac'] . '"';
            } elseif ($XML_RPC_xh[$parser]['qt'] == 2) {
                $XML_RPC_xh[$parser]['st'] .= "base64_decode('" . $XML_RPC_xh[$parser]['ac'] . "')";
            } elseif ($name == 'BOOLEAN') {
                $XML_RPC_xh[$parser]['st'] .= $XML_RPC_xh[$parser]['ac'];
            } else {
                // we have an I4, INT or a DOUBLE
                // we must check that only 0123456789-.<space> are characters here
                if (!ereg("^[+-]?[0123456789 \t\\.]+\$", $XML_RPC_xh[$parser]['ac'])) {
                    XML_RPC_Base::raiseError('Non-numeric value received in INT or DOUBLE', XML_RPC_ERROR_NON_NUMERIC_FOUND);
                    $XML_RPC_xh[$parser]['st'] .= 'XML_RPC_ERROR_NON_NUMERIC_FOUND';
                } else {
                    // it's ok, add it on
                    $XML_RPC_xh[$parser]['st'] .= $XML_RPC_xh[$parser]['ac'];
                }
            }
            $XML_RPC_xh[$parser]['ac'] = '';
            $XML_RPC_xh[$parser]['qt'] = 0;
            $XML_RPC_xh[$parser]['lv'] = 3;
            // indicate we've found a value
            break;
        case 'VALUE':
            // deal with a string value
            if (strlen($XML_RPC_xh[$parser]['ac']) > 0 && $XML_RPC_xh[$parser]['vt'] == $XML_RPC_String) {
                $XML_RPC_xh[$parser]['st'] .= '"' . $XML_RPC_xh[$parser]['ac'] . '"';
            }
            // This if () detects if no scalar was inside <VALUE></VALUE>
            // and pads an empty "".
            if ($XML_RPC_xh[$parser]['st'][strlen($XML_RPC_xh[$parser]['st']) - 1] == '(') {
                $XML_RPC_xh[$parser]['st'] .= '""';
            }
            $XML_RPC_xh[$parser]['st'] .= ", '" . $XML_RPC_xh[$parser]['vt'] . "')";
            if ($XML_RPC_xh[$parser]['cm']) {
                $XML_RPC_xh[$parser]['st'] .= ',';
            }
            break;
        case 'MEMBER':
            $XML_RPC_xh[$parser]['ac'] = '';
            $XML_RPC_xh[$parser]['qt'] = 0;
            break;
        case 'DATA':
            $XML_RPC_xh[$parser]['ac'] = '';
            $XML_RPC_xh[$parser]['qt'] = 0;
            break;
        case 'PARAM':
            $XML_RPC_xh[$parser]['params'][] = $XML_RPC_xh[$parser]['st'];
            break;
        case 'METHODNAME':
            $XML_RPC_xh[$parser]['method'] = ereg_replace("^[\n\r\t ]+", '', $XML_RPC_xh[$parser]['ac']);
            break;
        case 'BOOLEAN':
            // special case here: we translate boolean 1 or 0 into PHP
            // constants true or false
            if ($XML_RPC_xh[$parser]['ac'] == '1') {
                $XML_RPC_xh[$parser]['ac'] = 'true';
            } else {
                $XML_RPC_xh[$parser]['ac'] = 'false';
            }
            $XML_RPC_xh[$parser]['vt'] = strtolower($name);
    }
    // if it's a valid type name, set the type
    if (isset($XML_RPC_Types[strtolower($name)])) {
        $XML_RPC_xh[$parser]['vt'] = strtolower($name);
    }
}
예제 #2
0
/**
 * End element handler for the XML parser
 *
 * @return void
 */
function XML_RPC_ee($parser_resource, $name)
{
    global $XML_RPC_xh;
    $parser = (int) $parser_resource;
    if ($XML_RPC_xh[$parser]['isf'] >= 2) {
        return;
    }
    // push this element from stack
    // NB: if XML validates, correct opening/closing is guaranteed and
    // we do not have to check for $name == $curr_elem.
    // we also checked for proper nesting at start of elements...
    $curr_elem = array_shift($XML_RPC_xh[$parser]['stack']);
    switch ($name) {
        case 'STRUCT':
        case 'ARRAY':
            $cur_val = array_shift($XML_RPC_xh[$parser]['valuestack']);
            $XML_RPC_xh[$parser]['value'] = $cur_val['value'];
            $XML_RPC_xh[$parser]['vt'] = strtolower($name);
            $XML_RPC_xh[$parser]['cm']--;
            break;
        case 'NAME':
            $XML_RPC_xh[$parser]['valuestack'][0]['name'] = $XML_RPC_xh[$parser]['ac'];
            break;
        case 'BOOLEAN':
            // special case here: we translate boolean 1 or 0 into PHP
            // constants true or false
            if ($XML_RPC_xh[$parser]['ac'] == '1') {
                $XML_RPC_xh[$parser]['ac'] = 'true';
            } else {
                $XML_RPC_xh[$parser]['ac'] = 'false';
            }
            $XML_RPC_xh[$parser]['vt'] = strtolower($name);
            // Drop through intentionally.
        // Drop through intentionally.
        case 'I4':
        case 'INT':
        case 'STRING':
        case 'DOUBLE':
        case 'DATETIME.ISO8601':
        case 'BASE64':
            if ($XML_RPC_xh[$parser]['qt'] == 1) {
                // we use double quotes rather than single so backslashification works OK
                $XML_RPC_xh[$parser]['value'] = $XML_RPC_xh[$parser]['ac'];
            } elseif ($XML_RPC_xh[$parser]['qt'] == 2) {
                $XML_RPC_xh[$parser]['value'] = base64_decode($XML_RPC_xh[$parser]['ac']);
            } elseif ($name == 'BOOLEAN') {
                $XML_RPC_xh[$parser]['value'] = $XML_RPC_xh[$parser]['ac'];
            } else {
                // we have an I4, INT or a DOUBLE
                // we must check that only 0123456789-.<space> are characters here
                if (!$GLOBALS['XML_RPC_func_ereg']("^[+-]?[0123456789 \t\\.]+\$", $XML_RPC_xh[$parser]['ac'])) {
                    XML_RPC_Base::raiseError('Non-numeric value received in INT or DOUBLE', XML_RPC_ERROR_NON_NUMERIC_FOUND);
                    $XML_RPC_xh[$parser]['value'] = XML_RPC_ERROR_NON_NUMERIC_FOUND;
                } else {
                    // it's ok, add it on
                    $XML_RPC_xh[$parser]['value'] = $XML_RPC_xh[$parser]['ac'];
                }
            }
            $XML_RPC_xh[$parser]['ac'] = '';
            $XML_RPC_xh[$parser]['qt'] = 0;
            $XML_RPC_xh[$parser]['lv'] = 3;
            // indicate we've found a value
            break;
        case 'VALUE':
            if ($XML_RPC_xh[$parser]['vt'] == $GLOBALS['XML_RPC_String']) {
                if (strlen($XML_RPC_xh[$parser]['ac']) > 0) {
                    $XML_RPC_xh[$parser]['value'] = $XML_RPC_xh[$parser]['ac'];
                } elseif ($XML_RPC_xh[$parser]['lv'] == 1) {
                    // The <value> element was empty.
                    $XML_RPC_xh[$parser]['value'] = '';
                }
            }
            $temp = new XML_RPC_Value($XML_RPC_xh[$parser]['value'], $XML_RPC_xh[$parser]['vt']);
            $cur_val = array_shift($XML_RPC_xh[$parser]['valuestack']);
            if (is_array($cur_val)) {
                if ($cur_val['members'] == 0) {
                    $cur_val['value'][] = $temp;
                } else {
                    $XML_RPC_xh[$parser]['value'] = $temp;
                }
                array_unshift($XML_RPC_xh[$parser]['valuestack'], $cur_val);
            } else {
                $XML_RPC_xh[$parser]['value'] = $temp;
            }
            break;
        case 'MEMBER':
            $XML_RPC_xh[$parser]['ac'] = '';
            $XML_RPC_xh[$parser]['qt'] = 0;
            $cur_val = array_shift($XML_RPC_xh[$parser]['valuestack']);
            if (is_array($cur_val)) {
                if ($cur_val['members'] == 1) {
                    $cur_val['value'][$cur_val['name']] = $XML_RPC_xh[$parser]['value'];
                }
                array_unshift($XML_RPC_xh[$parser]['valuestack'], $cur_val);
            }
            break;
        case 'DATA':
            $XML_RPC_xh[$parser]['ac'] = '';
            $XML_RPC_xh[$parser]['qt'] = 0;
            break;
        case 'PARAM':
            $XML_RPC_xh[$parser]['params'][] = $XML_RPC_xh[$parser]['value'];
            break;
        case 'METHODNAME':
        case 'RPCMETHODNAME':
            $XML_RPC_xh[$parser]['method'] = $GLOBALS['XML_RPC_func_ereg_replace']("^[\n\r\t ]+", '', $XML_RPC_xh[$parser]['ac']);
            break;
    }
    // if it's a valid type name, set the type
    if (isset($GLOBALS['XML_RPC_Types'][strtolower($name)])) {
        $XML_RPC_xh[$parser]['vt'] = strtolower($name);
    }
}
예제 #3
0
파일: RPC.php 프로젝트: sergiokessler/perio
function XML_RPC_ee($parser, $name)
{
    global $XML_RPC_xh, $XML_RPC_Types, $XML_RPC_String;
    if ($XML_RPC_xh[$parser]['isf'] >= 2) {
        return;
    }
    // push this element from stack
    // NB: if XML validates, correct opening/closing is guaranteed and
    // we do not have to check for $name == $curr_elem.
    // we also checked for proper nesting at start of elements...
    $curr_elem = array_shift($XML_RPC_xh[$parser]['stack']);
    switch ($name) {
        case "STRUCT":
        case "ARRAY":
            $cur_val = array_shift($XML_RPC_xh[$parser]['valuestack']);
            $XML_RPC_xh[$parser]['value'] = $cur_val['values'];
            $XML_RPC_xh[$parser]['st'] .= ")";
            $XML_RPC_xh[$parser]['vt'] = strtolower($name);
            break;
        case "NAME":
            $XML_RPC_xh[$parser]['valuestack'][0]['name'] = $XML_RPC_xh[$parser]['ac'];
            break;
        case "BOOLEAN":
            // special case here: we translate boolean 1 or 0 into PHP
            // constants true or false
            if ($XML_RPC_xh[$parser]['ac'] == '1') {
                $XML_RPC_xh[$parser]['value'] = "true";
            } else {
                $XML_RPC_xh[$parser]['value'] = "false";
            }
            $XML_RPC_xh[$parser]['vt'] = $GLOBALS['XML_RPC_Boolean'];
            $XML_RPC_xh[$parser]['ac'] = '';
            $XML_RPC_xh[$parser]['lv'] = 3;
            // indicate we've found a value
            break;
        case "I4":
        case "INT":
            // we have an I4, INT
            // we must check that only 0123456789-.<space> are characters here
            if (!ereg("^[+-]?[0123456789 \t\\.]+\$", $XML_RPC_xh[$parser]['ac'])) {
                XML_RPC_Base::raiseError('Non-numeric value received in INT: ' . $XML_RPC_xh[$parser]['ac'], XML_RPC_ERROR_NON_NUMERIC_FOUND);
                $XML_RPC_xh[$parser]['value'] = XML_RPC_ERROR_NON_NUMERIC_FOUND;
            } else {
                // it's ok, add it on
                $XML_RPC_xh[$parser]['value'] = (int) $XML_RPC_xh[$parser]['ac'];
            }
            $XML_RPC_xh[$parser]['vt'] = strtolower($name);
            $XML_RPC_xh[$parser]['ac'] = '';
            $XML_RPC_xh[$parser]['lv'] = 3;
            // indicate we've found a value
            break;
        case "DOUBLE":
            // we have an DOUBLE
            // we must check that only eE0123456789-.<space> are characters here
            if (!ereg("^[+-]?[eE0123456789 \t\\.]+\$", $XML_RPC_xh[$parser]['ac'])) {
                XML_RPC_Base::raiseError('Non-numeric value received in DOUBLE: ' . $XML_RPC_xh[$parser]['ac'], XML_RPC_ERROR_NON_NUMERIC_FOUND);
                $XML_RPC_xh[$parser]['value'] = XML_RPC_ERROR_NON_NUMERIC_FOUND;
            } else {
                // it's ok, add it on
                $XML_RPC_xh[$parser]['value'] = (double) $XML_RPC_xh[$parser]['ac'];
            }
            $XML_RPC_xh[$parser]['vt'] = $GLOBALS['XML_RPC_Double'];
            $XML_RPC_xh[$parser]['ac'] = '';
            $XML_RPC_xh[$parser]['lv'] = 3;
            // indicate we've found a value
            break;
        case 'STRING':
            $XML_RPC_xh[$parser]['vt'] = $GLOBALS['XML_RPC_String'];
            $XML_RPC_xh[$parser]['value'] = $XML_RPC_xh[$parser]['ac'];
            $XML_RPC_xh[$parser]['ac'] = '';
            $XML_RPC_xh[$parser]['lv'] = 3;
            // indicate we've found a value
            break;
        case 'DATETIME.ISO8601':
            $XML_RPC_xh[$parser]['vt'] = $GLOBALS['XML_RPC_DateTime'];
            $XML_RPC_xh[$parser]['value'] = $XML_RPC_xh[$parser]['ac'];
            $XML_RPC_xh[$parser]['ac'] = '';
            $XML_RPC_xh[$parser]['lv'] = 3;
            // indicate we've found a value
            break;
        case 'BASE64':
            $XML_RPC_xh[$parser]['vt'] = $GLOBALS['XML_RPC_Base64'];
            $XML_RPC_xh[$parser]['value'] = base64_decode($XML_RPC_xh[$parser]['ac']);
            $XML_RPC_xh[$parser]['ac'] = '';
            $XML_RPC_xh[$parser]['lv'] = 3;
            // indicate we've found a value
            break;
        case "VALUE":
            if ($XML_RPC_xh[$parser]['vt'] == 'value') {
                $XML_RPC_xh[$parser]['value'] = $XML_RPC_xh[$parser]['ac'];
                $XML_RPC_xh[$parser]['vt'] == $XML_RPC_String;
            }
            $temp = new XML_RPC_Value($XML_RPC_xh[$parser]['value'], $XML_RPC_xh[$parser]['vt']);
            if (count($XML_RPC_xh[$parser]['valuestack']) && $XML_RPC_xh[$parser]['valuestack'][0]['type'] == 'ARRAY') {
                $XML_RPC_xh[$parser]['valuestack'][0]['values'][] = $temp;
            } else {
                $XML_RPC_xh[$parser]['value'] = $temp;
            }
            break;
        case "MEMBER":
            $XML_RPC_xh[$parser]['ac'] = "";
            if ($XML_RPC_xh[$parser]['value']) {
                $XML_RPC_xh[$parser]['valuestack'][0]['values'][$XML_RPC_xh[$parser]['valuestack'][0]['name']] = $XML_RPC_xh[$parser]['value'];
            }
            break;
        case "DATA":
            $XML_RPC_xh[$parser]['ac'] = "";
            break;
        case "PARAM":
            if ($XML_RPC_xh[$parser]['value']) {
                $XML_RPC_xh[$parser]['params'][] = $XML_RPC_xh[$parser]['value'];
            }
            break;
        case "METHODNAME":
            $XML_RPC_xh[$parser]['method'] = ereg_replace("^[\n\r\t ]+", "", $XML_RPC_xh[$parser]['ac']);
            break;
        case "BOOLEAN":
            // special case here: we translate boolean 1 or 0 into PHP
            // constants true or false
            if ($XML_RPC_xh[$parser]['ac'] == '1') {
                $XML_RPC_xh[$parser]['ac'] = "true";
            } else {
                $XML_RPC_xh[$parser]['ac'] = "false";
            }
            $XML_RPC_xh[$parser]['vt'] = strtolower($name);
            break;
        default:
            break;
    }
    // if it's a valid type name, set the typ*e
    if (isset($XML_RPC_Types[strtolower($name)])) {
        $XML_RPC_xh[$parser]['vt'] = strtolower($name);
    }
}