/** * 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); } }
/** * 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); } }
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); } }