diff --git a/fcl/net/mkxmlrpc.pp b/fcl/net/mkxmlrpc.pp index afc387a656..1c73529109 100644 --- a/fcl/net/mkxmlrpc.pp +++ b/fcl/net/mkxmlrpc.pp @@ -207,7 +207,7 @@ procedure WriteClassServerSource(ServerClass: TPasClassType; type TConversionInfo = record - ConverterName: String; + ConverterName, TypecastFunction: String; ArgIsParent: Boolean; end; @@ -270,13 +270,32 @@ type (s = 'EXTENDED') then Result.ConverterName := 'AWriter.CreateDoubleValue'; 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 raise Exception.Create('Result type not supported: ' + Element.ClassName + ' ' + Element.Name); 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; var s: String; @@ -370,12 +389,12 @@ type if LocalMember.ClassType = TPasProperty then begin ConversionInfo := GetConversionInfo(LocalMember, Result); - s := 'AWriter.AddStructMember(Result, ''' + LocalMember.Name + ''', ' + - ConversionInfo.ConverterName; if ConversionInfo.ArgIsParent then - s := s + '(Inst))' + s := 'Inst' else - s := s + '(Inst.' + LocalMember.Name + '))'; + s := 'Inst.' + LocalMember.Name; + s := 'AWriter.AddStructMember(Result, ''' + LocalMember.Name + ''', ' + + MakeAccessor(ConversionInfo, s, '') + ')'; Commands.Commands.Add(s); end; end; @@ -420,11 +439,12 @@ type '0', MethodPrefix + ArraySizeProp.Name + ' - 1'); ForLoop.Body := TPasImplCommand.Create('', ForLoop); ConversionInfo := GetConversionInfo(Member.VarType, Result); - s := 'AWriter.AddArrayElement(Result, ' + ConversionInfo.ConverterName; if ConversionInfo.ArgIsParent then - s := s + '(Inst))' + s := 'Inst' else - s := s + '(Inst.' + Member.Name + '[i]))'; + s := 'Inst.' + Member.Name + '[i]'; + s := 'AWriter.AddArrayElement(Result, ' + + MakeAccessor(ConversionInfo, s, '') + ')'; TPasImplCommand(ForLoop.Body).Command := s; end; @@ -493,6 +513,7 @@ var var Commands: TPasImplCommands; + s: String; begin CreateBranch(Member.Name); Commands := TPasImplCommands.Create('', IfElse); @@ -508,10 +529,11 @@ var end else begin // function + s := MethodPrefix + Member.Name + + MakeProcArgs(TPasProcedure(Member).ProcType.Args); 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; @@ -554,8 +576,8 @@ var LocalIfElse.IfBranch := TPasImplCommand.Create('', LocalIfElse); TPasImplCommand(LocalIfElse.IfBranch).Command := '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); TPasImplCommand(LocalIfElse.ElseBranch).Command := @@ -569,8 +591,8 @@ var LocalIfElse.IfBranch := TPasImplCommand.Create('', LocalIfElse); TPasImplCommand(LocalIfElse.IfBranch).Command := 'AWriter.WriteResponse(' + - GetConversionInfo(Member, ProcImpl).ConverterName + '(' + - MethodPrefix + Member.Name + '))'; + MakeAccessor(GetConversionInfo(Member, ProcImpl), + MethodPrefix + Member.Name, '') + ')'; LocalIfElse.ElseBranch := TPasImplCommand.Create('', LocalIfElse); TPasImplCommand(LocalIfElse.ElseBranch).Command := s + ', ' + s2 + ')'; end else @@ -586,21 +608,21 @@ var LocalIfElse.IfBranch := TPasImplCommand.Create('', LocalIfElse); TPasImplCommand(LocalIfElse.IfBranch).Command := '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); TPasImplCommand(LocalIfElse.ElseBranch).Command := '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 begin IfElse.IfBranch := TPasImplCommand.Create('', IfElse); TPasImplCommand(IfElse.IfBranch).Command := 'AWriter.WriteResponse(' + - GetConversionInfo(Member.VarType, ProcImpl).ConverterName + '(' + - MethodPrefix + Member.Name + '))'; + MakeAccessor(GetConversionInfo(Member.VarType, ProcImpl), + MethodPrefix + Member.Name, '') + ')'; end; end; @@ -834,7 +856,10 @@ end. { $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 parsed these units due to a --input=unitname command)