📄 pxmlrpc.cxx
字号:
if (!expectedType.IsEmpty() && (type != expectedType)) { PTRACE(3, "XMLRPC\tExpected parm " << idx << " to be " << expectedType << ", was " << type); return FALSE; } return TRUE;}BOOL PXMLRPCBlock::GetParam(PINDEX idx, PString & result){ return GetExpectedParam(idx, "string", result); }BOOL PXMLRPCBlock::GetParam(PINDEX idx, int & val){ PString type, result; if (!GetParam(idx, type, result)) return FALSE; if ((type != "i4") && (type != "int") && (type != "boolean")) { PTRACE(3, "XMLRPC\tExpected parm " << idx << " to be intger compatible, was " << type); return FALSE; } val = result.AsInteger(); return TRUE;}BOOL PXMLRPCBlock::GetParam(PINDEX idx, double & val){ PString result; if (!GetExpectedParam(idx, "double", result)) return FALSE; val = result.AsReal(); return TRUE;}// 01234567890123456// yyyyMMddThh:mm:ssBOOL PXMLRPCBlock::GetParam(PINDEX idx, PTime & val, int tz){ PString result; if (!GetExpectedParam(idx, "dateTime.iso8601", result)) return FALSE; return PXMLRPC::ISO8601ToPTime(result, val, tz);}BOOL PXMLRPCBlock::GetParam(PINDEX idx, PStringArray & result){ return ParseArray(GetParam(idx), result);}BOOL PXMLRPCBlock::GetParam(PINDEX idx, PArray<PStringToString> & result){ return ParseArray(GetParam(idx), result);}BOOL PXMLRPCBlock::GetParam(PINDEX idx, PStringToString & result){ return ParseStruct(GetParam(idx), result);}BOOL PXMLRPCBlock::GetParam(PINDEX idx, PXMLRPCStructBase & data){ return ParseStruct(GetParam(idx), data);}////////////////////////////////////////////////////////PXMLRPC::PXMLRPC(const PURL & _url, unsigned opts) : url(_url){ timeout = 10000; options = opts;}BOOL PXMLRPC::MakeRequest(const PString & method){ PXMLRPCBlock request(method); PXMLRPCBlock response; return MakeRequest(request, response);}BOOL PXMLRPC::MakeRequest(const PString & method, PXMLRPCBlock & response){ PXMLRPCBlock request(method); return MakeRequest(request, response);}BOOL PXMLRPC::MakeRequest(PXMLRPCBlock & request, PXMLRPCBlock & response){ if (PerformRequest(request, response)) return TRUE; faultCode = response.GetFaultCode(); faultText = response.GetFaultText(); return FALSE;}BOOL PXMLRPC::MakeRequest(const PString & method, const PXMLRPCStructBase & args, PXMLRPCStructBase & reply){ PXMLRPCBlock request(method, args); PXMLRPCBlock response; if (!MakeRequest(request, response)) return FALSE; if (response.GetParams(reply)) return TRUE; PTRACE(2, "XMLRPC\tParsing response failed: " << response.GetFaultText()); return FALSE;}BOOL PXMLRPC::PerformRequest(PXMLRPCBlock & request, PXMLRPCBlock & response){ // create XML version of request PString requestXML; if (!request.Save(requestXML, options)) { PStringStream txt; txt << "Error creating request XML (" << request.GetErrorLine() << ") :" << request.GetErrorString(); response.SetFault(PXMLRPC::CannotCreateRequestXML, txt); PTRACE(2, "XMLRPC\t" << response.GetFaultText()); return FALSE; } // make sure the request ends with a newline requestXML += "\n"; // do the request PHTTPClient client; PMIMEInfo sendMIME, replyMIME; sendMIME.SetAt("Server", url.GetHostName()); sendMIME.SetAt(PHTTP::ContentTypeTag, "text/xml"); PTRACE(5, "XMLRPC\tOutgoing XML/RPC:\n" << url << '\n' << sendMIME << requestXML); // apply the timeout client.SetReadTimeout(timeout); PString replyXML; // do the request BOOL ok = client.PostData(url, sendMIME, requestXML, replyMIME, replyXML); PTRACE(5, "XMLRPC\tIncoming XML/RPC:\n" << replyMIME << replyXML); // make sure the request worked if (!ok) { PStringStream txt; txt << "HTTP POST failed: " << client.GetLastResponseCode() << ' ' << client.GetLastResponseInfo() << '\n' << replyMIME << '\n' << replyXML; response.SetFault(PXMLRPC::HTTPPostFailed, txt); PTRACE(2, "XMLRPC\t" << response.GetFaultText()); return FALSE; } // parse the response if (!response.Load(replyXML)) { PStringStream txt; txt << "Error parsing response XML (" << response.GetErrorLine() << ") :" << response.GetErrorString() << '\n'; PStringArray lines = replyXML.Lines(); for (int offset = -2; offset <= 2; offset++) { int line = response.GetErrorLine() + offset; if (line >= 0 && line < lines.GetSize()) txt << lines[(PINDEX)line] << '\n'; } response.SetFault(PXMLRPC::CannotParseResponseXML, txt); PTRACE(2, "XMLRPC\t" << response.GetFaultText()); return FALSE; } // validate the response if (!response.ValidateResponse()) { PTRACE(2, "XMLRPC\tValidation of response failed: " << response.GetFaultText()); return FALSE; } return TRUE;}BOOL PXMLRPC::ISO8601ToPTime(const PString & iso8601, PTime & val, int tz){ if ((iso8601.GetLength() != 17) || (iso8601[8] != 'T') || (iso8601[11] != ':') || (iso8601[14] != ':')) return FALSE; val = PTime(iso8601.Mid(15,2).AsInteger(), // seconds iso8601.Mid(12,2).AsInteger(), // minutes iso8601.Mid( 9,2).AsInteger(), // hours iso8601.Mid( 6,2).AsInteger(), // day iso8601.Mid( 4,2).AsInteger(), // month iso8601.Mid( 0,4).AsInteger(), // year tz ); return TRUE;}PString PXMLRPC::PTimeToISO8601(const PTime & time){ return time.AsString("yyyyMMddThh:mm:ss");}/////////////////////////////////////////////////////////////////PXMLRPCVariableBase::PXMLRPCVariableBase(const char * n, const char * t) : name(n), type(t != NULL ? t : "string"){ PXMLRPCStructBase::GetInitialiser().AddVariable(this);}PXMLRPCStructBase * PXMLRPCVariableBase::GetStruct(PINDEX) const{ return NULL;}BOOL PXMLRPCVariableBase::IsArray() const{ return FALSE;}PINDEX PXMLRPCVariableBase::GetSize() const{ return 1;}BOOL PXMLRPCVariableBase::SetSize(PINDEX){ return TRUE;}PString PXMLRPCVariableBase::ToString(PINDEX) const{ PStringStream stream; PrintOn(stream); return stream;}void PXMLRPCVariableBase::FromString(PINDEX, const PString & str){ PStringStream stream(str); ReadFrom(stream);}PString PXMLRPCVariableBase::ToBase64(PAbstractArray & data) const{ return PBase64::Encode(data.GetPointer(), data.GetSize());}void PXMLRPCVariableBase::FromBase64(const PString & str, PAbstractArray & data){ PBase64 decoder; decoder.StartDecoding(); decoder.ProcessDecoding(str); data = decoder.GetDecodedData();}/////////////////////////////////////////////////////////////////PXMLRPCArrayBase::PXMLRPCArrayBase(PContainer & a, const char * n, const char * t) : PXMLRPCVariableBase(n, t), array(a){}void PXMLRPCArrayBase::PrintOn(ostream & strm) const{ strm << setfill('\n') << array << setfill(' ');}void PXMLRPCArrayBase::Copy(const PXMLRPCVariableBase & other){ array = ((PXMLRPCArrayBase &)other).array;}BOOL PXMLRPCArrayBase::IsArray() const{ return TRUE;}PINDEX PXMLRPCArrayBase::GetSize() const{ return array.GetSize();}BOOL PXMLRPCArrayBase::SetSize(PINDEX sz){ return array.SetSize(sz);}/////////////////////////////////////////////////////////////////PXMLRPCArrayObjectsBase::PXMLRPCArrayObjectsBase(PArrayObjects & a, const char * n, const char * t) : PXMLRPCArrayBase(a, n, t), array(a){}BOOL PXMLRPCArrayObjectsBase::SetSize(PINDEX sz){ if (!array.SetSize(sz)) return FALSE; for (PINDEX i = 0; i < sz; i++) { if (array.GetAt(i) == NULL) { PObject * object = CreateObject(); if (object == NULL) return FALSE; array.SetAt(i, object); } } return TRUE;}PString PXMLRPCArrayObjectsBase::ToString(PINDEX i) const{ PStringStream stream; stream << *array.GetAt(i); return stream;}void PXMLRPCArrayObjectsBase::FromString(PINDEX i, const PString & str){ PObject * object = array.GetAt(i); if (object == NULL) { object = CreateObject(); array.SetAt(i, object); } PStringStream stream(str); stream >> *object;}/////////////////////////////////////////////////////////////////PMutex PXMLRPCStructBase::initialiserMutex;PXMLRPCStructBase * PXMLRPCStructBase::initialiserInstance = NULL;PXMLRPCStructBase::PXMLRPCStructBase(){ variablesByOrder.DisallowDeleteObjects(); variablesByName.DisallowDeleteObjects(); initialiserMutex.Wait(); initialiserStack = initialiserInstance; initialiserInstance = this;}void PXMLRPCStructBase::EndConstructor(){ initialiserInstance = initialiserStack; initialiserMutex.Signal();}PXMLRPCStructBase & PXMLRPCStructBase::operator=(const PXMLRPCStructBase & other){ for (PINDEX i = 0; i < variablesByOrder.GetSize(); i++) variablesByOrder[i].Copy(other.variablesByOrder[i]); return *this;}void PXMLRPCStructBase::PrintOn(ostream & strm) const{ for (PINDEX i = 0; i < variablesByOrder.GetSize(); i++) { PXMLRPCVariableBase & var = variablesByOrder[i]; strm << var.GetName() << '=' << var << '\n'; }}void PXMLRPCStructBase::AddVariable(PXMLRPCVariableBase * var){ variablesByOrder.Append(var); variablesByName.SetAt(var->GetName(), var);}#endif // End of file ///////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -