mirror of
https://github.com/ultimatepp/ultimatepp.git
synced 2026-05-21 06:45:39 -06:00
Core/XmlRpc vs XmlRpc: fixed compatibility
git-svn-id: svn://ultimatepp.org/upp/trunk@4852 f0d560ea-af0d-0410-9eb7-867de7ffcac7
This commit is contained in:
parent
754f670cd4
commit
1c9a8c96e9
7 changed files with 19 additions and 114 deletions
|
|
@ -191,7 +191,7 @@ enum {
|
|||
XML_IGNORE_COMMENTS = 0x04,
|
||||
};
|
||||
|
||||
XmlNode ParseXML(XmlParser& p, dword style = XML_IGNORE_DECLS|XML_IGNORE_PIS|XML_IGNORE_COMMENTS);
|
||||
XmlNode ParseXML(XmlParser& p, dword style = XML_IGNORE_DECLS|XML_IGNORE_PIS|XML_IGNORE_COMMENTS);
|
||||
XmlNode ParseXML(const char *s, dword style = XML_IGNORE_DECLS|XML_IGNORE_PIS|XML_IGNORE_COMMENTS);
|
||||
|
||||
enum {
|
||||
|
|
|
|||
|
|
@ -250,9 +250,6 @@ String FormatXmlRpcParams(const ValueArray& params);
|
|||
String FormatXmlRpcError(int code, const char *text);
|
||||
|
||||
void Register(const char *name, void (*method)(XmlRpcData&), const char *group = NULL);
|
||||
void SetXmlRpcMethodFilter(String (*filter)(const String& methodname));
|
||||
bool XmlRpcPerform(TcpSocket& http, const char *group);
|
||||
bool XmlRpcServerLoop(int port, const char *group);
|
||||
|
||||
#define XMLRPC_METHOD(x) \
|
||||
void xmlrpc##x(XmlRpcData& rpc); \
|
||||
|
|
@ -269,6 +266,11 @@ struct XmlRpcError {
|
|||
String text;
|
||||
};
|
||||
|
||||
void SetXmlRpcMethodFilter(String (*filter)(const String& methodname));
|
||||
String XmlRpcExecute(const String& request, const char *group, const char *peeraddr);
|
||||
bool XmlRpcPerform(TcpSocket& http, const char *group);
|
||||
bool XmlRpcServerLoop(int port, const char *group);
|
||||
|
||||
void ThrowXmlRpcError(int code, const char *s);
|
||||
void ThrowXmlRpcError(const char *s);
|
||||
|
||||
|
|
|
|||
|
|
@ -2,6 +2,8 @@
|
|||
|
||||
#define LLOG(x) // LOG(x)
|
||||
|
||||
NAMESPACE_UPP
|
||||
|
||||
static bool sLogRpcCalls;
|
||||
|
||||
void LogXmlRpcCalls(bool b)
|
||||
|
|
@ -115,3 +117,5 @@ void XmlRpcCall::ClearError()
|
|||
faultString.Clear();
|
||||
error.Clear();
|
||||
}
|
||||
|
||||
END_UPP_NAMESPACE
|
||||
|
|
|
|||
|
|
@ -3,112 +3,7 @@
|
|||
|
||||
#define LLOG(x) // DLOG(x)
|
||||
|
||||
typedef void (*XmlRpcFnPtr)(XmlRpcData&);
|
||||
|
||||
static StaticMutex XmlRpcMapMutex;
|
||||
|
||||
VectorMap<String, XmlRpcFnPtr>& XmlRpcMap(const char *group)
|
||||
{
|
||||
static VectorMap<String, VectorMap< String, void (*)(XmlRpcData&) > > mm;
|
||||
return mm.GetAdd(group);
|
||||
}
|
||||
|
||||
void Register(const char *name, void (*method)(XmlRpcData&), const char *group)
|
||||
{
|
||||
Mutex::Lock __(XmlRpcMapMutex);
|
||||
XmlRpcMap(group).Add(name, method);
|
||||
}
|
||||
|
||||
XmlRpcFnPtr XmlRpcMapGet(const char *group, const char *name)
|
||||
{
|
||||
Mutex::Lock __(XmlRpcMapMutex);
|
||||
return XmlRpcMap(group).Get(name, NULL);
|
||||
}
|
||||
|
||||
String (*sXmlRpcMethodFilter)(const String& methodname);
|
||||
|
||||
void SetXmlRpcMethodFilter(String (*filter)(const String& methodname))
|
||||
{
|
||||
sXmlRpcMethodFilter = filter;
|
||||
}
|
||||
|
||||
static Stream *xmlrpc_trace;
|
||||
static int xmlrpc_trace_level;
|
||||
|
||||
void SetXmlRpcServerTrace(Stream& s, int level)
|
||||
{
|
||||
xmlrpc_trace = &s;
|
||||
xmlrpc_trace_level = level;
|
||||
}
|
||||
|
||||
String XmlRpcExecute(const String& request, const char *group, const char *peeraddr)
|
||||
{
|
||||
if(xmlrpc_trace && xmlrpc_trace_level == 1)
|
||||
*xmlrpc_trace << "XmlRpcRequest:\n" << request << '\n';
|
||||
XmlParser p(request);
|
||||
XmlRpcData data;
|
||||
String methodname;
|
||||
try {
|
||||
String r = XmlHeader();
|
||||
r << "<methodResponse>\r\n";
|
||||
p.ReadPI();
|
||||
p.PassTag("methodCall");
|
||||
p.PassTag("methodName");
|
||||
methodname = p.ReadText();
|
||||
LLOG("method name: " << methodname);
|
||||
if(xmlrpc_trace && xmlrpc_trace_level == 0)
|
||||
*xmlrpc_trace << "XmlRpcRequest method:\n" << methodname << '\n';
|
||||
p.PassEnd();
|
||||
data.peeraddr = peeraddr;
|
||||
data.in = ParseXmlRpcParams(p);
|
||||
XmlRpcMapMutex.Enter();
|
||||
if(sXmlRpcMethodFilter)
|
||||
methodname = (*sXmlRpcMethodFilter)(methodname);
|
||||
void (*fn)(XmlRpcData&) = XmlRpcMapGet(group, methodname);
|
||||
if(fn) {
|
||||
(*fn)(data);
|
||||
if(IsValueArray(data.out)) {
|
||||
ValueArray va = data.out;
|
||||
if(va.GetCount() && IsError(va[0])) {
|
||||
LLOG("ProcessingError");
|
||||
return FormatXmlRpcError(XMLRPC_SERVER_PROCESSING_ERROR, "Processing error: " + GetErrorText(data.out[0]));
|
||||
}
|
||||
r << FormatXmlRpcParams(data.out);
|
||||
}
|
||||
r << "\r\n</methodResponse>\r\n";
|
||||
}
|
||||
else {
|
||||
XmlRpcMapMutex.Leave();
|
||||
return FormatXmlRpcError(XMLRPC_UNKNOWN_METHOD_ERROR, "\'" + methodname + "\' method is unknown");
|
||||
}
|
||||
p.PassEnd();
|
||||
if(xmlrpc_trace)
|
||||
if(xmlrpc_trace_level == 0)
|
||||
*xmlrpc_trace << "XmlRpc finished OK\n";
|
||||
else
|
||||
*xmlrpc_trace << "Server response:\n" << r << '\n';
|
||||
return r;
|
||||
}
|
||||
catch(XmlRpcError e) {
|
||||
LLOG("Client error: " << e.text);
|
||||
if(xmlrpc_trace)
|
||||
*xmlrpc_trace << "Client error: " << e.text << '\n';
|
||||
return FormatXmlRpcError(e.code, e.text);
|
||||
}
|
||||
catch(XmlError e) {
|
||||
LLOG("XmlError " << e << ": " << p.GetPtr());
|
||||
if(xmlrpc_trace)
|
||||
*xmlrpc_trace << "XmlError: " << e << '\n';
|
||||
return FormatXmlRpcError(XMLRPC_SERVER_XML_ERROR, "XML Error: " + e);
|
||||
}
|
||||
catch(ValueTypeMismatch) {
|
||||
LLOG("ValueTypeMismatch at parameter " << data.ii);
|
||||
if(xmlrpc_trace)
|
||||
*xmlrpc_trace << "ValueTypeMismatch at parameter " << data.ii << '\n';
|
||||
return FormatXmlRpcError(XMLRPC_SERVER_PARAM_ERROR, "Parameter mismatch at parameter " + AsString(data.ii));
|
||||
}
|
||||
return Null;
|
||||
}
|
||||
NAMESPACE_UPP
|
||||
|
||||
int CharFilterNoCr(int c)
|
||||
{
|
||||
|
|
@ -176,3 +71,5 @@ bool XmlRpcServer(int port, const char *group)
|
|||
XmlRpcPerform(http, group);
|
||||
}
|
||||
}
|
||||
|
||||
END_UPP_NAMESPACE
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@
|
|||
#include <Web/Web.h>
|
||||
#include <Core/XmlRpc/XmlRpc.h>
|
||||
|
||||
using namespace Upp;
|
||||
NAMESPACE_UPP
|
||||
|
||||
bool XmlRpcPerform(Socket& http, const char *group);
|
||||
bool XmlRpcServer(int port = 80, const char *group = NULL);
|
||||
|
|
@ -75,8 +75,8 @@ public:
|
|||
|
||||
void LogXmlRpcCalls(bool b = true);
|
||||
|
||||
void SetXmlRpcServerTrace(Stream& s, int level = 1);
|
||||
|
||||
int CharFilterNoCr(int c);
|
||||
|
||||
END_UPP_NAMESPACE
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -1,7 +1,8 @@
|
|||
description "XML-RPC support package (both server and client stuff)\377";
|
||||
|
||||
uses
|
||||
Web;
|
||||
Web,
|
||||
Core\XmlRpc;
|
||||
|
||||
file
|
||||
XmlRpc.h,
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
#ifndef _XmlRpc_icpp_init_stub
|
||||
#define _XmlRpc_icpp_init_stub
|
||||
#include "Web/init"
|
||||
#include "Core\XmlRpc/init"
|
||||
#endif
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue