📄 pxmlrpc.cxx
字号:
// see if correct type
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:ss
BOOL 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 + -