🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: borland.public.delphi.xml
Article #86

Any latest XML-RPC?

#86
From: bsuseno1972
Date: Sun, 24 Aug 2008 01:57
401 lines
10124 bytes
I am trying to use the technology, but seems the only code around is
not fit
for me. Is it there a better one?

I also now trying to write from scratch. I fail on getting XML from
TXmlRpxStruct. Please, show me my mistake.

Thank you,

Broto Suseno

// -- the code

unit UBSXmlRpcTypes;

interface

uses SysUtils, Classes;

type
  TXmlRpcDataType = (xrdtInteger, xrdtBoolean, xrdtString,
                     xrdtDouble, xrdtDateTime, xrdtBase64,
                     xrdtArray, xrdtStruct);

const
  XmlRpcTags: array[TXmlRpcDataType] of String =
      ('int', 'boolean', 'string',
      'double', 'dateTime.iso8601', 'base64',
      'array', 'struct');

type
  TXmlRpcArray = class;
  TXmlRpcStruct = class;

  TXmlRpcElement = class (TObject)
  private
    FDataType: TXmlRpcDataType;
    function GetXML: string;
  public
    ValueBase64: string;
    ValueBoolean: Boolean;
    ValueDateTime: TDateTime;
    ValueDouble: Double;
    ValueInteger: Integer;
    ValueString: string;
    constructor Create(NewDataType: TXmlRpcDataType);
    destructor Destroy; override;
  published
    property DataType: TXmlRpcDataType read FDataType;
    property XML: string read GetXML;
  end;

  TXmlRpcArray = class (TXmlRpcElement)
  private
    FItems: TList;
    function GetXML: string;
  public
    constructor Create;
    destructor Destroy; override;
    procedure AddElement(Value: TXmlRpcElement);
    property Items: TList read FItems write FItems;
    property XML: string read GetXML;
  end;

  TXmlRpcMember = class (TObject)
  private
    function GetXML: string;
  public
    MemberName: string;
    MemberValue: TXmlRpcElement;
    constructor Create;
    destructor Destroy; override;
    property XML: string read GetXML;
  end;

  TXmlRpcStruct = class (TXmlRpcElement)
  private
    FMembers: TList;
    function GetXML: string;
  public
    constructor Create;
    destructor Destroy; override;
    procedure Add(MemberName: String; MemberValue: TXmlRpcElement);
overload;
    procedure Add(Value: TXmlRpcMember); overload;
    property Members: TList read FMembers write FMembers;
    property XML: string read GetXML;
  end;

  TXmlRpcPayload = class (TObject)
  private
    FParams: TList;
    FRPCMethodName: string;
    function GetXML: string;
  public
    constructor Create(NewRPCMethodName: String);
    destructor Destroy; override;
    procedure Add(Element: TXmlRpcElement);
    property Params: TList read FParams;
    property RPCMethodName: string read FRPCMethodName;
    property XML: string read GetXML;
  end;

  TXmlRpcRequest = class (TObject)
  end;

  TXmlRpcResponse = class (TObject)
  end;

implementation

{
********************************* TXmlRpcArray
*********************************
}
constructor TXmlRpcArray.Create;
begin
  // TODO -cProcedure:    procedure Add -- by BSAutoTODO

  inherited Create(xrdtArray);

  FItems := TList.Create;
end;

destructor TXmlRpcArray.Destroy;
var
  i: Integer;
begin
  // TODO -cDestructor: TXmlRpcArray.Destroy -- by BSAutoTODO

  for i := 0 to FItems.Count - 1 do
    TXmlRpcElement(FItems[i]).Free;

  FItems.Free;

  inherited;
end;

procedure TXmlRpcArray.AddElement(Value: TXmlRpcElement);
begin
  FItems.Add(Value);
end;

function TXmlRpcArray.GetXML: string;
var
  SL: TStringList;
  i: Integer;
  AElement: TXmlRpcElement;
begin
  // TODO -cFunction: TXmlRpcArray.GetXML -- by BSAutoTODO

  SL := TStringList.Create;

  try
    SL.Add(Format('<%s>', [XmlRpcTags[xrdtArray]]));

    if (FItems.Count > 0) then begin
      SL.Add('<data>');
      for i := 0 to FItems.Count - 1 do begin
        AElement := TXmlRpcElement(FItems[i]);
        SL.Add(AElement.XML);
      end;
      SL.Add('</data>');
    end;

    SL.Add(Format('</%s>', [XmlRpcTags[xrdtArray]]));

    Result := SL.Text;

  finally
    SL.Free;
  end;
end;

{
******************************** TXmlRpcStruct
*********************************
}
constructor TXmlRpcStruct.Create;
begin
  // TODO -cConstructor: TXmlRpcStruct.Create -- by BSAutoTODO

  inherited Create(xrdtStruct);

  FMembers := TList.Create;
end;

destructor TXmlRpcStruct.Destroy;
var
  i: Integer;
begin
  // TODO -cDestructor: TXmlRpcStruct.Destroy -- by BSAutoTODO

  for i := 0 to FMembers.Count - 1 do
    TXmlRpcMember(FMembers[i]).Free;

  FMembers.Free;

  inherited;
end;

procedure TXmlRpcStruct.Add(MemberName: String; MemberValue:
TXmlRpcElement);
var
  AnMember: TXmlRpcMember;
begin
  // TODO -cProcedure: TXmlRpcStruct.Add -- by BSAutoTODO

  AnMember := TXmlRpcMember.Create;
  AnMember.MemberName := MemberName;
  AnMember.MemberValue := MemberValue;

  Add(AnMember);
end;

procedure TXmlRpcStruct.Add(Value: TXmlRpcMember);
begin
  // TODO -cProcedure: TXmlRpcStruct.Add -- by BSAutoTODO

  FMembers.Add(Value);
end;

function TXmlRpcStruct.GetXML: string;
var
  SL: TStringList;
  i: Integer;
  AMember: TXmlRpcMember;
begin
  // TODO -cFunction: TXmlRpcStruct.GetXML -- by BSAutoTODO

  SL := TStringList.Create;

  try
    SL.Add(Format('<%s>', [XmlRpcTags[xrdtStruct]]));

    if (FMembers.Count > 0) then begin
      SL.Add('<member>');
      for i := 0 to FMembers.Count - 1 do begin
        AMember := TXmlRpcMember(FMembers[i]);
        SL.Add(AMember.XML);
      end;
      SL.Add('</member>');
    end;

    SL.Add(Format('</%s>', [XmlRpcTags[xrdtStruct]]));

    Result := SL.Text;

  finally
    SL.Free;
  end;
end;

{
******************************** TXmlRpcMember
*********************************
}
constructor TXmlRpcMember.Create;
begin
  // TODO -cConstructor: TXmlRpcMember.Create -- by BSAutoTODO

  inherited Create;
end;

destructor TXmlRpcMember.Destroy;
begin
  // TODO -cDestructor: TXmlRpcMember.Destroy -- by BSAutoTODO

  MemberValue.Free;

  inherited;
end;

function TXmlRpcMember.GetXML: string;
begin
  // TODO -cFunction: TXmlRpcMember.GetXML -- by BSAutoTODO

  Result := '<member>'
          + '<name>' + MemberName + '</name>'
          + MemberValue.XML
          + '</member>';
end;

{
******************************** TXmlRpcElement
********************************
}
constructor TXmlRpcElement.Create(NewDataType: TXmlRpcDataType);
begin
  // TODO -cConstructor: TXmlRpcElement.Create -- by BSAutoTODO

  FDataType := NewDataType;

  inherited Create;
end;

destructor TXmlRpcElement.Destroy;
begin
  // TODO -cDestructor: TXmlRpcElement.Destroy -- by BSAutoTODO

  inherited;
end;

function TXmlRpcElement.GetXML: string;
var
  s: string;
begin
  // TODO -cFunction: TXmlRpcElement.GetXML -- by BSAutoTODO

  Result := '<value>' + Format('<%s>', [XmlRpcTags[FDataType]]);

  case FDataType of
    xrdtInteger: Result := Result + IntToStr(ValueInteger);
    xrdtBoolean: Result := Result + IntToStr(Ord(ValueBoolean));
    xrdtString: Result := Result + ValueString;
    xrdtDouble: begin
      s := FloatToStr(ValueDouble);
      if (DecimalSeparator <> '.') then
        s := StringReplace(s, DecimalSeparator, '.', [rfReplaceAll]);
      Result := Result + s;
    end;
    xrdtDateTime: Result := Result + FormatDateTime('yyyymmdd',
ValueDateTime)
                            + 'T' + FormatDateTime('hh:nn:ss',
ValueDateTime);
    xrdtBase64: Result := Result + ValueBase64;
  end;

  Result := Result + Format('</%s>', [XmlRpcTags[FDataType]]) + '</
value>';
end;

{
******************************** TXmlRpcPayload
********************************
}
constructor TXmlRpcPayload.Create(NewRPCMethodName: String);
begin
  // TODO -cConstructor: TXmlRpcPayload.Create -- by BSAutoTODO

  inherited Create;

  FParams := TList.Create;
  FRPCMethodName := NewRPCMethodName;
end;

destructor TXmlRpcPayload.Destroy;
var
  i: Integer;
begin
  // TODO -cDestructor: TXmlRpcPayload.Destroy -- by BSAutoTODO

  for i := 0 to FParams.Count - 1 do
    TXmlRpcElement(FParams[i]).Free;

  FParams.Free;

  inherited;
end;

procedure TXmlRpcPayload.Add(Element: TXmlRpcElement);
begin
  // TODO -cProcedure: TXmlRpcPayload.Add -- by BSAutoTODO

  FParams.Add(Element);
end;

function TXmlRpcPayload.GetXML: string;
var
  SL: TStringList;
  i: Integer;
  AElement: TXmlRpcElement;
begin
  // TODO -cFunction: TXmlRpcPayload.GetXML -- by BSAutoTODO

  SL := TStringList.Create;

  try
    SL.Add('<?xml version="1.0"?>');
    SL.Add('<methodCall>');
    SL.Add(Format('<methodName>%s</methodName>', [FRPCMethodName]));

    if (FParams.Count > 0) then begin
      SL.Add('<params>');
      for i := 0 to FParams.Count - 1 do begin
        AElement := TXmlRpcElement(FParams[i]);
        SL.Add(AElement.XML);
      end;
      SL.Add('</params>');
    end;

    SL.Add('</methodCall>');

    Result := SL.Text;

  finally
    SL.Free;
  end;
end;

end.
Technical Details
Message-ID: <7d32018d-d8d7-4e45-a4e9-da5e1e8c62d3@z6g2000pre.googlegroups.com>
Path: arc1-ca.pugleaf.net!g2news1.google.com!postnews.google.com!z6g2000pre.googlegroups.com!not-for-mail

Show Full Headers
Complete Article Headers
X-Google-Thread: f5d9b,8f2a2624015022a3,start
X-Google-Attributes: gidf5d9b,domainid0,public,usenet
X-Google-Language: ENGLISH,ASCII-7-bit
Path: arc1-ca.pugleaf.net!g2news1.google.com!postnews.google.com!z6g2000pre.googlegroups.com!not-for-mail
From: bsuseno1972@gmail.com
Newsgroups: borland.public.delphi.xml
Subject: Any latest XML-RPC?
Date: Sat, 23 Aug 2008 18:57:35 -0700 (PDT)
Organization: http://groups.google.com
Lines: 402
Message-ID: <7d32018d-d8d7-4e45-a4e9-da5e1e8c62d3@z6g2000pre.googlegroups.com>
NNTP-Posting-Host: 124.158.138.6
Mime-Version: 1.0
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit
X-Trace: posting.google.com 1219543055 31693 127.0.0.1 (24 Aug 2008 01:57:35 GMT)
X-Complaints-To: groups-abuse@google.com
NNTP-Posting-Date: Sun, 24 Aug 2008 01:57:35 +0000 (UTC)
Complaints-To: groups-abuse@google.com
Injection-Info: z6g2000pre.googlegroups.com; posting-host=124.158.138.6; 
 posting-account=RfmPdgoAAABxf7VJWtkWvBNlCivi389t
User-Agent: G2/1.0
X-HTTP-UserAgent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 
 5.1),gzip(gfe),gzip(gfe)