1
0
Files
aarre
applications
bindings
components
examples
lclbindings
wst
tags
trunk
doc
ide
samples
tests
type_lib_edtr
ws_helper
wst_rtti_filter
COPYING.LGPL
COPYING.modifiedLGPL
base_binary_formatter.pas
base_json_formatter.pas
base_service_intf.pas
base_soap_formatter.pas
base_xmlrpc_formatter.pas
basex_encode.pas
binary_formatter.pas
binary_streamer.pas
client_filters.pas
client_utils.pas
config_objects.pas
date_utils.pas
delphi_init_com.pas
file_logger_extension.pas
filter_intf.pas
fpc_http_protocol.pas
fpc_http_server.pas
fpc_tcp_protocol.pas
fpc_tcp_server.pas
ics_http_protocol.pas
ics_tcp_protocol.pas
imp_utils.pas
indy_http_protocol.pas
indy_http_server.pas
indy_tcp_protocol.pas
indy_tcp_server.pas
json_formatter.pas
library_base_intf.pas
library_imp_utils.pas
library_protocol.pas
library_server_intf.pas
logger_extension.pas
metadata_repository.pas
metadata_service.pas
metadata_service.wsdl
metadata_service.wst
metadata_service.wst_meta
metadata_service_binder.pas
metadata_service_imp.pas
metadata_service_proxy.pas
metadata_wsdl.pas
ns_http_protocol.pas
object_serializer.pas
record_rtti.pas
same_process_protocol.pas
semaphore.pas
server_binary_formatter.pas
server_filter_extension.pas
server_listener.pas
server_service_imputils.pas
server_service_intf.pas
server_service_json.pas
server_service_soap.pas
server_service_xmlrpc.pas
service_intf.pas
soap_formatter.pas
synapse_http_protocol.pas
synapse_tcp_protocol.pas
synapse_tcp_server.pas
wst.inc
wst_consts.pas
wst_delphi.inc
wst_delphi_rtl.pas
wst_delphi_rtti_utils.pas
wst_delphi_xml.pas
wst_fpc_xml.pas
wst_global.inc
wst_indy10_utils.pas
wst_indy9_utils.pas
wst_initialization.pas
wst_resources_imp.pas
wst_rtl_imp.inc
wst_types.pas
xmlrpc_formatter.pas
lazarus-ccr/wst/trunk/server_service_xmlrpc.pas

183 lines
5.1 KiB
ObjectPascal
Raw Normal View History

{
This file is part of the Web Service Toolkit
Copyright (c) 2006 by Inoussa OUEDRAOGO
This file is provide under modified LGPL licence
( the files COPYING.modifiedLGPL and COPYING.LGPL).
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
}
{$INCLUDE wst_global.inc}
unit server_service_xmlrpc;
interface
uses
Classes, SysUtils, TypInfo,
{$IFNDEF FPC}xmldom, wst_delphi_xml{$ELSE}DOM{$ENDIF},
base_service_intf, server_service_intf,
base_xmlrpc_formatter;
type
{$M+}
{ TXmlRpcFormatter }
TXmlRpcFormatter = class(TXmlRpcBaseFormatter,IFormatterBase,IFormatterResponse)
private
FCallProcedureName : string;
FCallTarget : String;
FCallContext : ICallContext;
public
procedure BeginCallResponse(Const AProcName,ATarget:string);
procedure EndCallResponse();
procedure BeginCallRead(ACallContext : ICallContext);
function GetCallProcedureName():String;
function GetCallTarget():String;
procedure BeginExceptionList(
const AErrorCode : string;
const AErrorMsg : string
);
procedure EndExceptionList();
End;
procedure Server_service_RegisterXmlRpcFormat();
implementation
{$IFDEF FPC}uses wst_fpc_xml;{$ENDIF}
{ TXmlRpcFormatter }
procedure TXmlRpcFormatter.BeginCallResponse(Const AProcName,ATarget:string);
var
mthdNode, prmsNode : TDOMNode;
doc : TXMLDocument;
begin
Clear();
doc := Self.GetXmlDoc();
mthdNode := doc.CreateElement(sMETHOD_RESPONSE);
doc.AppendChild(mthdNode);
prmsNode := doc.CreateElement(sPARAMS);
mthdNode.AppendChild(prmsNode);
PushStackParams(prmsNode);
end;
procedure TXmlRpcFormatter.EndCallResponse();
begin
EndScope();
end;
procedure TXmlRpcFormatter.BeginCallRead(ACallContext : ICallContext);
var
callNode : TDOMElement;
tmpNode : TDOMNode;
doc : TXMLDocument;
begin
FCallContext := ACallContext;
ClearStack();
doc := GetXmlDoc();
callNode := doc.DocumentElement;
if not SameText(sMETHOD_CALL,callNode.NodeName) then
Error('XML root node must be "%s".',[sMETHOD_CALL]);
tmpNode := FindNode(callNode,sMETHOD_NAME);
if not Assigned(tmpNode) then
Error('Node not found : "%s".',[sMETHOD_NAME]);
if not tmpNode.HasChildNodes() then
Error('"%s" does not provide value node.',[sMETHOD_NAME]);
FCallProcedureName := Trim(tmpNode.FirstChild.NodeValue);
tmpNode := FindNode(callNode,sPARAMS);
if not Assigned(tmpNode) then
Error('Node not found : "%s".',[sPARAMS]);
PushStackParams(tmpNode);
//FCallTarget := tmpNode.NodeValue;
end;
function TXmlRpcFormatter.GetCallProcedureName(): String;
begin
Result := FCallProcedureName;
end;
function TXmlRpcFormatter.GetCallTarget(): String;
begin
Result := FCallTarget;
end;
procedure TXmlRpcFormatter.BeginExceptionList(
const AErrorCode: string;
const AErrorMsg: string
);
var
c,m : string;
i : Integer;
memberNode, mthdNode, faultNode, structNode,
valueNode, nameNode,
internalValueNode, lastValNode : TDOMNode;
doc : TXMLDocument;
begin
c := Trim(AErrorCode);
if not TryStrToInt(c,i) then
c := '123';
m := AErrorMsg;
Clear();
doc := Self.GetXmlDoc();
mthdNode := doc.CreateElement(sMETHOD_RESPONSE);
doc.AppendChild(mthdNode);
//fault node
faultNode := doc.CreateElement(sFAULT);
mthdNode.AppendChild(faultNode);
// value node
valueNode := doc.CreateElement(sVALUE);
faultNode.AppendChild(valueNode);
// structNode
structNode := doc.CreateElement(XmlRpcDataTypeNames[xdtStruct]);
valueNode.AppendChild(structNode);
//faultCode member node
memberNode := doc.CreateElement(sMEMBER);
structNode.AppendChild(memberNode);
//name node
nameNode := doc.CreateElement(sNAME);
memberNode.AppendChild(nameNode);
nameNode.AppendChild(doc.CreateTextNode(sFAULT_CODE));
//value node
internalValueNode := doc.CreateElement(sVALUE);
memberNode.AppendChild(internalValueNode);
lastValNode := doc.CreateElement(XmlRpcDataTypeNames[xdtInt]);
internalValueNode.AppendChild(lastValNode);
lastValNode.AppendChild(doc.CreateTextNode(c));
//faultString member node
memberNode := doc.CreateElement(sMEMBER);
structNode.AppendChild(memberNode);
//name node
nameNode := doc.CreateElement(sNAME);
memberNode.AppendChild(nameNode);
nameNode.AppendChild(doc.CreateTextNode(sFAULT_STRING));
//value node
internalValueNode := doc.CreateElement(sVALUE);
memberNode.AppendChild(internalValueNode);
lastValNode := doc.CreateElement(XmlRpcDataTypeNames[xdtString]);
internalValueNode.AppendChild(lastValNode);
lastValNode.AppendChild(doc.CreateTextNode(m));
end;
procedure TXmlRpcFormatter.EndExceptionList();
begin
end;
procedure Server_service_RegisterXmlRpcFormat();
begin
GetFormatterRegistry().Register(sPROTOCOL_NAME,sXMLRPC_CONTENT_TYPE,TSimpleItemFactory.Create(TXmlRpcFormatter) as IItemFactory);
end;
end.