Bug in Delphi SOAP: arrays of TByteDynarrays don't work well.
There's a bug in the Delphi SOAP source code when using parameters like:
type
  MultiArray = array of TByteDynArray;
To fix this, first add $(DELPHI)\Source\Soap to your search path, or copy the file
OPtoSOAPDOMConv.pas to your local directory.
then modify the file as follows:
1. Locate the function ConvertSoapToNativeArrayElem.
2. add the following as a subfunction:
// DEEPAK changed 3.12.2004 fix for arrays of 
//  TByteDynArray
function TestDimDynArray( var Res : Pointer ) : boolean;
var ArrayLen : integer;
  DynP : Pointer;
  TypeURI, TYpeName : InvString;
  S : string;
begin
  result := False;
  GetElementType(Node, TypeURI, TypeName);
  if (Dims = 1) and
     ((ElemInfo.Kind = tkInteger) or
      (ElemInfo.Kind = tkChar)) and
     (GetTypeData(ElemInfo).OrdType = otUByte) and
       { Some SOAP implementations don't 
          send the XML Namespace!! }
     (((TypeName ='base64Binary')) or
      ((TypeURI = SSoap11EncodingS5) and 
        (TypeName = 'base64')) or
        { Some SOAP implementations don't 
                send the type!! }
        (TypeName = '' )) then
    begin
      S := DecodeString(Node.Text);
      ArrayLen := Length(S);
      DynP := Pointer(PInteger(DataP)^);
      DynArraySetLength(DynP, TypeInfo(TByteDynArray), 
               1,  @ArrayLen);
      Move(S[1], DynP^, Length(S));
      Res := DynP;
      Result := True;
    end;
  end;
  // end DEEPAK
3. in the procedure, after following code:
end else if Dims = 1 then
begin
add:
  // DEEPAK 03.12.2004 line added
  if not TestDimDynArray(Result) then   
  begin
     [ NOW put everything from 
          Size := ntElementChildCount(Node);
      to
          if Size > 0 then
             ReadRow(RootNode, Node, CurElem,  
                                 Size, PElem, ElemInfo);
      in this block]
  end;
(essentially, byte dynarrays must be handled differently, even when you
have an array of bytearrays)


2 Comments:
is this only when you use:
array of TByteDynArray;
or could it be affected when you are using SomeFunction:TByteDinArray by itself?
It's only when you use Array of TByteDynArray. Using TByteDynArray itself is not a problem.
Post a Comment
<< Home