void Dispatcher::getCapabilities (Struct &str) const { // parent::getCapabilities (str); just in case.. str.addMember("specUrl", RpcString("http://xmlrpc-epi.sourceforge.net/specs/rfc.fault_codes.php")); str.addMember("specVersion", Integer(20010516)); }
MethodResponse Dispatcher::system_methodHelp(const MethodCall &calldata, const Dispatcher *disp) { ULXR_TRACE("system_methodHelp"); if (calldata.numParams() != 1) throw ParameterException(InvalidMethodParameterError, "Exactly 1 parameter allowed for \"system.methodHelp\""); if (calldata.getParam(0).getType() != RpcStrType) throw ParameterException(InvalidMethodParameterError, "Parameter 1 not of type \"String\" \"system.listMethods\""); RpcString vs = calldata.getParam(0); std::string name = vs.getString(); std::string s; MethodCallMap::const_iterator it; std::string s_prev; for (it = disp->methodcalls.begin(); it != disp->methodcalls.end(); ++it) if (name == (*it).first.method_name && (*it).first.documentation.length() != 0) { if ( s_prev != (*it).first.documentation && (*it).first.documentation.length() != 0) { if (s.length() != 0) s = "* " +s + "\n* "; s += (*it).first.documentation; } s_prev = (*it).first.documentation; } return MethodResponse (RpcString(s)); }
MethodResponse Dispatcher::system_listMethods(const MethodCall &calldata, const Dispatcher *disp) { ULXR_TRACE("system_listMethods"); if (calldata.numParams() > 1) throw ParameterException(InvalidMethodParameterError, "At most 1 parameter allowed for \"system.listMethods\""); if ( calldata.numParams() == 1 && calldata.getParam(0).getType() != RpcStrType) throw ParameterException(InvalidMethodParameterError, "Parameter 1 not of type \"String\" \"system.listMethods\""); // FIXME: what to do with param 1 if present ?? Array arr; std::string m_prev; MethodCallMap::const_iterator it; for (it = disp->methodcalls.begin(); it != disp->methodcalls.end(); ++it) if ( m_prev != (*it).first.method_name && (*it).first.method_name.length() != 0) { arr.addItem(RpcString((*it).first.method_name)); m_prev = (*it).first.method_name; } return MethodResponse (arr); }
MethodResponse Dispatcher::system_methodSignature(const MethodCall &calldata, const Dispatcher *disp) { ULXR_TRACE("system_methodSignature"); if (calldata.numParams() != 1) throw ParameterException(InvalidMethodParameterError, "Exactly 1 parameter allowed for \"system.methodSignature\""); if (calldata.getParam(0).getType() != RpcStrType) throw ParameterException(InvalidMethodParameterError, "Parameter 1 not of type \"String\" \"system.listMethods\""); RpcString vs = calldata.getParam(0); std::string name = vs.getString(); MethodCallMap::const_iterator it; Array ret_arr; for (it = disp->methodcalls.begin(); it != disp->methodcalls.end(); ++it) { Array sigarr; std::string sig = (*it).first.getSignature(true, true); if (name == (*it).first.method_name && sig.length() != 0) { std::size_t pos; while ((pos = sig.find(',')) != std::string::npos) { sigarr.addItem(RpcString(sig.substr(0, pos))); sig.erase(0, pos+1); } sigarr.addItem(RpcString(sig)); ret_arr.addItem(sigarr); } } if (ret_arr.size() == 0) return MethodResponse (Integer(1)); // non-Array ==< no signatures else return MethodResponse (ret_arr); }
ULXR_API_IMPL(bool) ValueParser::testEndElement(const XML_Char *name) { ULXR_TRACE(ULXR_PCHAR("ValueParser::testEndElement(const XML_Char*)")); if (states.size() <= 1) throw RuntimeException(ApplicationError, ulxr_i18n(ULXR_PCHAR("abnormal program behaviour: ValueParser::testEndElement() had no states left"))); std::auto_ptr<ValueState> curr(getTopValueState()); states.pop(); /* ULXR_DOUT (ULXR_GET_STRING(name) << ULXR_PCHAR(" = cur-val: ") << std::hex << (void*) curr->getValue() << ULXR_PCHAR(" state: ") << std::hex << (void*) curr->getParserState() << ULXR_PCHAR(" prev state: ") << std::hex << (void*) curr->getPrevParserState() << std::dec); */ states.top()->setPrevParserState(curr->getParserState()); switch(curr->getParserState() ) { case eBoolean: assertEndElement(name, "boolean"); getTopValueState()->takeValue(new Value(Boolean(curr->getCharData())) ); break; case eInt: assertEndElement(name, "int"); getTopValueState()->takeValue(new Value(Integer(curr->getCharData())) ); break; case eI4: assertEndElement(name, "i4"); getTopValueState()->takeValue(new Value(Integer(curr->getCharData())) ); break; case eDouble: assertEndElement(name, "double"); getTopValueState()->takeValue(new Value(Double(curr->getCharData())) ); break; case eString: assertEndElement(name, "string"); getTopValueState()->takeValue(new Value(RpcString(curr->getCharData())) ); break; case eBase64: { assertEndElement(name, "base64"); Base64 b64; b64.setBase64(curr->getCharData()); // move raw data! getTopValueState()->takeValue(new Value(b64)); } break; case eDate: assertEndElement(name , "dateTime.iso8601"); getTopValueState()->takeValue(new Value(DateTime(curr->getCharData())) ); break; case eMember: assertEndElement(name, "member"); getTopValueState()->takeValue (curr->getValue()); break; case eName: assertEndElement(name, "name"); getTopValueState()->takeName((curr->getCharData()) ); break; case eValue: assertEndElement(name, "value"); if (curr->getValue() == 0) // special case { if(curr->getPrevParserState() == eArray) // not empty Array getTopValueState()->takeValue (new Value(Array())); else if (curr->getPrevParserState() == eStruct) // not empty Struct getTopValueState()->takeValue (new Value(Struct())); else // no type tag defaults to string getTopValueState()->takeValue (new Value(RpcString(curr->getCharData()))); } else getTopValueState()->takeValue (curr->getValue()); break; case eStruct: assertEndElement(name, "struct"); getTopValueState()->takeValue (curr->getValue()); break; case eArray: assertEndElement(name, "array"); getTopValueState()->takeValue (curr->getValue()); break; case eData: assertEndElement(name, "data"); getTopValueState()->takeValue (curr->getValue()); break; default: states.push(curr.release()); return false; } return true; }