Browse Source

* Added support for reading set properties

sg 22 years ago
parent
commit
c16cbd8677
1 changed files with 49 additions and 24 deletions
  1. 49 24
      fcl/net/mkxmlrpc.pp

+ 49 - 24
fcl/net/mkxmlrpc.pp

@@ -207,7 +207,7 @@ procedure WriteClassServerSource(ServerClass: TPasClassType;
 
 
 type
 type
   TConversionInfo = record
   TConversionInfo = record
-    ConverterName: String;
+    ConverterName, TypecastFunction: String;
     ArgIsParent: Boolean;
     ArgIsParent: Boolean;
   end;
   end;
 
 
@@ -270,13 +270,32 @@ type
         (s = 'EXTENDED') then
         (s = 'EXTENDED') then
 	Result.ConverterName := 'AWriter.CreateDoubleValue';
 	Result.ConverterName := 'AWriter.CreateDoubleValue';
     end else if Element.ClassType = TPasClassType then
     end else if Element.ClassType = TPasClassType then
-      Result.ConverterName := MakeStructConverter(TPasClassType(Element), Referrer).Name;
+      Result.ConverterName := MakeStructConverter(TPasClassType(Element), Referrer).Name
+    else if Element.ClassType = TPasEnumType then
+    begin
+      Result.ConverterName := 'AWriter.CreateIntValue';
+      Result.TypecastFunction := 'Ord';
+    end;
 
 
     if Length(Result.ConverterName) = 0 then
     if Length(Result.ConverterName) = 0 then
       raise Exception.Create('Result type not supported: ' + Element.ClassName +
       raise Exception.Create('Result type not supported: ' + Element.ClassName +
         ' ' + Element.Name);
         ' ' + Element.Name);
   end;
   end;
 
 
+  function MakeAccessor(ConversionInfo: TConversionInfo;
+    const DataSource, ArrayIndex: String): String;
+  begin
+    Result := ConversionInfo.ConverterName + '(';
+    if ConversionInfo.TypecastFunction <> '' then
+      Result := Result + ConversionInfo.TypecastFunction + '(';
+    Result := Result + DataSource;
+    if ConversionInfo.TypecastFunction <> '' then
+      Result := Result + ')';
+    if ArrayIndex <> '' then
+      Result := Result + '[' + ArrayIndex + ']';
+    Result := Result + ')';
+  end;
+
   function GetParseValueFnName(PasType: TPasType): String;
   function GetParseValueFnName(PasType: TPasType): String;
   var
   var
     s: String;
     s: String;
@@ -370,12 +389,12 @@ type
       if LocalMember.ClassType = TPasProperty then
       if LocalMember.ClassType = TPasProperty then
       begin
       begin
         ConversionInfo := GetConversionInfo(LocalMember, Result);
         ConversionInfo := GetConversionInfo(LocalMember, Result);
-	s := 'AWriter.AddStructMember(Result, ''' + LocalMember.Name + ''', ' +
-	  ConversionInfo.ConverterName;
 	if ConversionInfo.ArgIsParent then
 	if ConversionInfo.ArgIsParent then
-	  s := s + '(Inst))'
+	  s := 'Inst'
 	else
 	else
-	  s := s + '(Inst.' + LocalMember.Name + '))';
+	  s := 'Inst.' + LocalMember.Name;
+	s := 'AWriter.AddStructMember(Result, ''' + LocalMember.Name + ''', ' +
+	  MakeAccessor(ConversionInfo, s, '') + ')';
 	Commands.Commands.Add(s);
 	Commands.Commands.Add(s);
       end;
       end;
     end;
     end;
@@ -420,11 +439,12 @@ type
       '0', MethodPrefix + ArraySizeProp.Name + ' - 1');
       '0', MethodPrefix + ArraySizeProp.Name + ' - 1');
     ForLoop.Body := TPasImplCommand.Create('', ForLoop);
     ForLoop.Body := TPasImplCommand.Create('', ForLoop);
     ConversionInfo := GetConversionInfo(Member.VarType, Result);
     ConversionInfo := GetConversionInfo(Member.VarType, Result);
-    s := 'AWriter.AddArrayElement(Result, ' + ConversionInfo.ConverterName;
     if ConversionInfo.ArgIsParent then
     if ConversionInfo.ArgIsParent then
-      s := s + '(Inst))'
+      s := 'Inst'
     else
     else
-      s := s + '(Inst.' + Member.Name + '[i]))';
+      s := 'Inst.' + Member.Name + '[i]';
+    s := 'AWriter.AddArrayElement(Result, ' +
+      MakeAccessor(ConversionInfo, s, '') + ')';
     TPasImplCommand(ForLoop.Body).Command := s;
     TPasImplCommand(ForLoop.Body).Command := s;
   end;
   end;
 
 
@@ -493,6 +513,7 @@ var
 
 
   var
   var
     Commands: TPasImplCommands;
     Commands: TPasImplCommands;
+    s: String;
   begin
   begin
     CreateBranch(Member.Name);
     CreateBranch(Member.Name);
     Commands := TPasImplCommands.Create('', IfElse);
     Commands := TPasImplCommands.Create('', IfElse);
@@ -508,10 +529,11 @@ var
     end else
     end else
     begin
     begin
       // function
       // function
+      s := MethodPrefix + Member.Name +
+        MakeProcArgs(TPasProcedure(Member).ProcType.Args);
       Commands.Commands.Add('AWriter.WriteResponse(' +
       Commands.Commands.Add('AWriter.WriteResponse(' +
-        GetConversionInfo(TPasFunctionType(TPasFunction(Member).ProcType).
-	ResultEl.ResultType, ProcImpl).ConverterName + '(' + MethodPrefix +
-	Member.Name + MakeProcArgs(TPasProcedure(Member).ProcType.Args) + '))');
+        MakeAccessor(GetConversionInfo(TPasFunctionType(TPasFunction(Member).
+	  ProcType).ResultEl.ResultType, ProcImpl), s, '') + ')');
     end;
     end;
   end;
   end;
 
 
@@ -554,8 +576,8 @@ var
 	  LocalIfElse.IfBranch := TPasImplCommand.Create('', LocalIfElse);
 	  LocalIfElse.IfBranch := TPasImplCommand.Create('', LocalIfElse);
 	  TPasImplCommand(LocalIfElse.IfBranch).Command :=
 	  TPasImplCommand(LocalIfElse.IfBranch).Command :=
 	    'AWriter.WriteResponse(' +
 	    'AWriter.WriteResponse(' +
-	    GetConversionInfo(Member, ProcImpl).ConverterName + '(' +
-	    Copy(MethodPrefix, 1, Length(MethodPrefix) - 1) + '))';
+	    MakeAccessor(GetConversionInfo(Member, ProcImpl),
+	      Copy(MethodPrefix, 1, Length(MethodPrefix) - 1), '') + ')';
 
 
 	  LocalIfElse.ElseBranch := TPasImplCommand.Create('', LocalIfElse);
 	  LocalIfElse.ElseBranch := TPasImplCommand.Create('', LocalIfElse);
 	  TPasImplCommand(LocalIfElse.ElseBranch).Command :=
 	  TPasImplCommand(LocalIfElse.ElseBranch).Command :=
@@ -569,8 +591,8 @@ var
 	    LocalIfElse.IfBranch := TPasImplCommand.Create('', LocalIfElse);
 	    LocalIfElse.IfBranch := TPasImplCommand.Create('', LocalIfElse);
 	    TPasImplCommand(LocalIfElse.IfBranch).Command :=
 	    TPasImplCommand(LocalIfElse.IfBranch).Command :=
 	       'AWriter.WriteResponse(' +
 	       'AWriter.WriteResponse(' +
-	       GetConversionInfo(Member, ProcImpl).ConverterName + '(' +
-	       MethodPrefix + Member.Name + '))';
+	       MakeAccessor(GetConversionInfo(Member, ProcImpl),
+	         MethodPrefix + Member.Name, '') + ')';
 	    LocalIfElse.ElseBranch := TPasImplCommand.Create('', LocalIfElse);
 	    LocalIfElse.ElseBranch := TPasImplCommand.Create('', LocalIfElse);
 	    TPasImplCommand(LocalIfElse.ElseBranch).Command := s + ', ' + s2 + ')';
 	    TPasImplCommand(LocalIfElse.ElseBranch).Command := s + ', ' + s2 + ')';
 	  end else
 	  end else
@@ -586,21 +608,21 @@ var
 	LocalIfElse.IfBranch := TPasImplCommand.Create('', LocalIfElse);
 	LocalIfElse.IfBranch := TPasImplCommand.Create('', LocalIfElse);
 	TPasImplCommand(LocalIfElse.IfBranch).Command :=
 	TPasImplCommand(LocalIfElse.IfBranch).Command :=
 	   'AWriter.WriteResponse(' +
 	   'AWriter.WriteResponse(' +
-	   GetConversionInfo(Member, ProcImpl).ConverterName + '(' +
-	   Copy(MethodPrefix, 1, Length(MethodPrefix) - 1) + '))';
+	   MakeAccessor(GetConversionInfo(Member, ProcImpl),
+	     Copy(MethodPrefix, 1, Length(MethodPrefix) - 1), '') + ')';
 
 
 	LocalIfElse.ElseBranch := TPasImplCommand.Create('', LocalIfElse);
 	LocalIfElse.ElseBranch := TPasImplCommand.Create('', LocalIfElse);
 	TPasImplCommand(LocalIfElse.ElseBranch).Command :=
 	TPasImplCommand(LocalIfElse.ElseBranch).Command :=
 	  'AWriter.WriteResponse(' +
 	  'AWriter.WriteResponse(' +
-          GetConversionInfo(Member.VarType, ProcImpl).ConverterName + '(' +
-	  MethodPrefix + Member.Name + '[AParser.GetNext' +
-	  GetParseValueFnName(TPasArgument(Member.Args[0]).ArgType) + ']))';
+          MakeAccessor(GetConversionInfo(Member.VarType, ProcImpl),
+	    MethodPrefix + Member.Name, 'AParser.GetNext' +
+	    GetParseValueFnName(TPasArgument(Member.Args[0]).ArgType)) + ')';
       end else
       end else
       begin
       begin
         IfElse.IfBranch := TPasImplCommand.Create('', IfElse);
         IfElse.IfBranch := TPasImplCommand.Create('', IfElse);
         TPasImplCommand(IfElse.IfBranch).Command := 'AWriter.WriteResponse(' +
         TPasImplCommand(IfElse.IfBranch).Command := 'AWriter.WriteResponse(' +
-          GetConversionInfo(Member.VarType, ProcImpl).ConverterName + '(' +
-	  MethodPrefix + Member.Name + '))';
+          MakeAccessor(GetConversionInfo(Member.VarType, ProcImpl),
+	    MethodPrefix + Member.Name, '') + ')';
       end;
       end;
     end;
     end;
 
 
@@ -834,7 +856,10 @@ end.
 
 
 {
 {
   $Log$
   $Log$
-  Revision 1.2  2003-06-12 19:00:53  michael
+  Revision 1.3  2003-06-25 08:56:26  sg
+  * Added support for reading set properties
+
+  Revision 1.2  2003/06/12 19:00:53  michael
   * Supports usage of declarations from other units (as long as mkxmlrpc
   * Supports usage of declarations from other units (as long as mkxmlrpc
      parsed these units due to a --input=unitname command)
      parsed these units due to a --input=unitname command)