⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pxmlrpc.cxx

📁 pwlib源码库
💻 CXX
📖 第 1 页 / 共 3 页
字号:
  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 + -