void CWizXmlRpcServer::on_replyFinished() { QNetworkReply* reply = qobject_cast<QNetworkReply *>(sender()); if (reply->error()) { reply->deleteLater(); return; } QString strContentType = reply->header(QNetworkRequest::ContentTypeHeader).toString(); if (strContentType != "text/xml;charset=UTF-8") { processError(errorContentType, 0, "Invalid content type of response"); reply->deleteLater(); return; } m_replyData = reply->readAll(); #ifdef WIZNOTE_DEBUG_XMLRPC QString requestFile = QDir::tempPath() + "/WizNote/" + m_strMethodName; QString replyFile = QDir::tempPath() + "/WizNote/on_" + m_strMethodName; WizSaveUnicodeTextToUtf8File(requestFile, QString(m_requestData)); WizSaveUnicodeTextToUtf8File(replyFile, QString(m_replyData)); #endif QString strXml = QString::fromUtf8(m_replyData.constData()); CWizXMLDocument doc; if (!doc.LoadXML(strXml)) { processError(errorXmlFormat, 0, "Invalid xml"); reply->deleteLater(); return; } CWizXmlRpcValue* pRet = NULL; if (!WizXmlRpcResultFromXml(doc, &pRet)) { processError(errorXmlRpcFormat, 0, "Can not parse xmlrpc"); reply->deleteLater(); return; } Q_ASSERT(pRet); if (CWizXmlRpcFaultValue* pFault = dynamic_cast<CWizXmlRpcFaultValue *>(pRet)) { processError(errorXmlRpcFault, pFault->GetFaultCode(), pFault->GetFaultString()); reply->deleteLater(); delete pRet; return; } processReturn(*pRet); }
BOOL WizXmlRpcParamsToXml(CWizXMLDocument& doc, const CString& strMethodName, CWizXmlRpcValue* pParam1, CWizXmlRpcValue* pParam2, CWizXmlRpcValue* pParam3, CWizXmlRpcValue* pParam4, CWizXmlRpcValue* pParam5, CWizXmlRpcValue* pParam6, CWizXmlRpcValue* pParam7, CWizXmlRpcValue* pParam8) { CWizXMLNode nodeMethodCall; doc.AppendChild(_T("methodCall"), nodeMethodCall); // nodeMethodCall.SetChildNodeText(_T("methodName"), strMethodName); // CWizXMLNode nodeParams; nodeMethodCall.AppendChild(_T("params"), nodeParams); // CWizXmlRpcValue* arrayParams[] = {pParam1, pParam2, pParam3, pParam4, pParam5, pParam6, pParam7, pParam8, NULL}; // CWizXmlRpcValue** ppParam = arrayParams; while (*ppParam) { CWizXMLNode nodeParamValue; nodeParams.AppendNodeByPath(_T("param/value"), nodeParamValue); // CWizXmlRpcValue* pParam = *ppParam; // pParam->Write(nodeParamValue); // ppParam++; } // return TRUE; }
void CWizXmlRpcServer::on_replyFinished() { QNetworkReply* reply = qobject_cast<QNetworkReply *>(sender()); if (reply->error()) { reply->deleteLater(); return; } QString strContentType = reply->header(QNetworkRequest::ContentTypeHeader).toString(); if (strContentType != "text/xml;charset=UTF-8") { processError(errorContentType, 0, "Invalid content type of response"); reply->deleteLater(); return; } QString strXml = QString::fromUtf8(reply->readAll().constData()); CWizXMLDocument doc; if (!doc.LoadXML(strXml)) { processError(errorXmlFormat, 0, "Invalid xml"); reply->deleteLater(); return; } CWizXmlRpcValue* pRet = NULL; if (!WizXmlRpcResultFromXml(doc, &pRet)) { processError(errorXmlRpcFormat, 0, "Can not parse xmlrpc"); reply->deleteLater(); return; } Q_ASSERT(pRet); if (CWizXmlRpcFaultValue* pFault = dynamic_cast<CWizXmlRpcFaultValue *>(pRet)) { processError(errorXmlRpcFault, pFault->GetFaultCode(), pFault->GetFaultString()); } processReturn(*pRet); reply->deleteLater(); }
bool WizXmlRpcResultFromXml(CWizXMLDocument& doc, CWizXmlRpcValue** ppRet) { CWizXMLNode nodeMethodResponse; doc.FindChildNode("methodResponse", nodeMethodResponse); if (nodeMethodResponse.isNull()) { TOLOG("Failed to get methodResponse node!"); return false; } CWizXMLNode nodeTest; if (!nodeMethodResponse.GetFirstChildNode(nodeTest)) { TOLOG("Failed to get methodResponse child node!"); return false; } CString strTestName = nodeTest.GetName(); if (0 == strTestName.CompareNoCase("params")) { CWizXMLNode nodeParamValue; nodeTest.FindNodeByPath("param/value", nodeParamValue); if (nodeParamValue.isNull()) { TOLOG("Failed to get param value node of params!"); return false; } return WizXmlRpcValueFromXml(nodeParamValue, ppRet); } else if (0 == strTestName.CompareNoCase("fault")) { CWizXMLNode nodeFaultValue; nodeTest.FindChildNode(_T("value"), nodeFaultValue); if (nodeFaultValue.isNull()) { TOLOG("Failed to get fault value node!"); return false; } CWizXmlRpcFaultValue* pFault = new CWizXmlRpcFaultValue(); pFault->Read(nodeFaultValue); *ppRet = pFault; return true; } else { TOLOG1("Unknown response node name: %1", strTestName); return false; } }
bool CWizXmlRpcServerBase::xmlRpcCall(const QString& strMethodName, CWizXmlRpcResult& result, CWizXmlRpcValue* pParam1, CWizXmlRpcValue* pParam2 /*= NULL*/, CWizXmlRpcValue* pParam3 /*= NULL*/, CWizXmlRpcValue* pParam4 /*= NULL*/) { CWizXmlRpcRequest data(strMethodName); data.addParam(pParam1); if (pParam2) { data.addParam(pParam2); } if (pParam3) { data.addParam(pParam3); } if (pParam4) { data.addParam(pParam4); } QNetworkRequest request; request.setUrl(QUrl(m_strUrl)); request.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("text/xml")); // int nCounter = 0; while (true) { QNetworkReply* reply = m_network->post(request, data.toData()); CWizXmlRpcEventLoop loop(reply); // qDebug() << "[Sync]Start a xml rpc event loop"; loop.exec(); // qDebug() << "[Sync]Xml rpc event loop finished"; // if (loop.error() && nCounter == 0) { nCounter ++; continue; } // if (loop.error()) { m_nLastErrorCode = loop.error(); m_strLastErrorMessage = loop.errorString(); return false; } // QString strXml = loop.result(); // CWizXMLDocument doc; if (!doc.LoadXML(strXml)) { m_nLastErrorCode = -1; m_strLastErrorMessage = "Invalid xml"; return false; } CWizXmlRpcValue* pRet = NULL; if (!WizXmlRpcResultFromXml(doc, &pRet)) { m_nLastErrorCode = -1; m_strLastErrorMessage = "Can not parse xmlrpc"; return false; } Q_ASSERT(pRet); if (CWizXmlRpcFaultValue* pFault = dynamic_cast<CWizXmlRpcFaultValue *>(pRet)) { m_nLastErrorCode = pFault->GetFaultCode(); m_strLastErrorMessage = pFault->GetFaultString(); TOLOG2(_T("XmlRpcCall failed : %1, %2"), QString::number(m_nLastErrorCode), m_strLastErrorMessage); return false; } // result.SetResult(strMethodName, pRet); break; } // return true; }
bool CWizXmlRpcServerBase::xmlRpcCall(const QString& strMethodName, CWizXmlRpcResult& result, CWizXmlRpcValue* pParam1, CWizXmlRpcValue* pParam2 /*= NULL*/, CWizXmlRpcValue* pParam3 /*= NULL*/, CWizXmlRpcValue* pParam4 /*= NULL*/) { CWizXmlRpcRequest data(strMethodName); data.addParam(pParam1); if (pParam2) { data.addParam(pParam2); } if (pParam3) { data.addParam(pParam3); } if (pParam4) { data.addParam(pParam4); } QNetworkRequest request; request.setUrl(QUrl(m_strUrl)); request.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("text/xml")); // QNetworkReply* reply = m_network->post(request, data.toData()); CWizXmlRpcEventLoop loop(reply); loop.exec(); // if (loop.error()) { m_nLastErrorCode = loop.error(); m_strLastErrorMessage = loop.errorString(); return false; } // QString strXml = loop.result(); // CWizXMLDocument doc; if (!doc.LoadXML(strXml)) { m_nLastErrorCode = -1; m_strLastErrorMessage = "Invalid xml"; return false; } CWizXmlRpcValue* pRet = NULL; if (!WizXmlRpcResultFromXml(doc, &pRet)) { m_nLastErrorCode = -1; m_strLastErrorMessage = "Can not parse xmlrpc"; return false; } Q_ASSERT(pRet); if (CWizXmlRpcFaultValue* pFault = dynamic_cast<CWizXmlRpcFaultValue *>(pRet)) { m_nLastErrorCode = pFault->GetFaultCode(); m_strLastErrorMessage = pFault->GetFaultString(); return false; } // result.SetResult(strMethodName, pRet); // return true; }