You've already forked lazarus-ccr
Part 1
FPC UnicodeString support (+ test cases) WideString support (+ test cases) git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@555 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
@ -44,11 +44,18 @@ type
|
||||
dtInt64U, dtInt64S,
|
||||
dtBool, dtEnum,
|
||||
dtSingle, dtDouble, dtExtended, dtCurrency,
|
||||
dtString,
|
||||
dtAnsiString, dtWideString,
|
||||
{$IFDEF WST_UNICODESTRING}
|
||||
dtUnicodeString,
|
||||
{$ENDIF WST_UNICODESTRING}
|
||||
dtObject, dtArray
|
||||
);
|
||||
|
||||
PStringBuffer = ^TStringBuffer;
|
||||
PAnsiStringBuffer = ^TAnsiStringBuffer;
|
||||
PWideStringBuffer = ^TWideStringBuffer;
|
||||
{$IFDEF WST_UNICODESTRING}
|
||||
PUnicodeStringBuffer = ^TUnicodeStringBuffer;
|
||||
{$ENDIF WST_UNICODESTRING}
|
||||
PObjectBuffer = ^TObjectBuffer;
|
||||
PArrayBuffer = ^TArrayBuffer;
|
||||
PDataBuffer = ^TDataBuffer;
|
||||
@ -71,14 +78,30 @@ type
|
||||
dtExtended : ( ExtendedData : TFloat_Extended_10 );
|
||||
dtCurrency : ( CurrencyData : TFloat_Currency_8 );
|
||||
|
||||
dtString : ( StrData : PStringBuffer );
|
||||
dtAnsiString : ( AnsiStrData : PAnsiStringBuffer );
|
||||
dtWideString : ( WideStrData : PWideStringBuffer );
|
||||
{$IFDEF WST_UNICODESTRING}
|
||||
dtUnicodeString : ( UnicodeStrData : PUnicodeStringBuffer );
|
||||
{$ENDIF WST_UNICODESTRING}
|
||||
dtObject : ( ObjectData : PObjectBuffer );
|
||||
dtArray : ( ArrayData : PArrayBuffer );
|
||||
End;
|
||||
|
||||
TStringBuffer = Record
|
||||
Data : String;
|
||||
End;
|
||||
TAnsiStringBuffer = record
|
||||
Data : TAnsiStringData;
|
||||
end;
|
||||
|
||||
TWideStringBuffer = record
|
||||
Data : TWideStringData;
|
||||
end;
|
||||
|
||||
{$IFDEF WST_UNICODESTRING}
|
||||
TUnicodeStringBuffer = record
|
||||
Data : TUnicodeStringData;
|
||||
end;
|
||||
{$ENDIF WST_UNICODESTRING}
|
||||
|
||||
|
||||
|
||||
PObjectBufferItem = ^TObjectBufferItem;
|
||||
TObjectBufferItem = Record
|
||||
@ -203,11 +226,23 @@ type
|
||||
Const ATypeInfo : PTypeInfo;
|
||||
Const AData : TInt64S
|
||||
);{$IFDEF USE_INLINE}inline;{$ENDIF}
|
||||
procedure PutStr(
|
||||
procedure PutAnsiStr(
|
||||
Const AName : String;
|
||||
Const ATypeInfo : PTypeInfo;
|
||||
Const AData : String
|
||||
Const AData : AnsiString
|
||||
);{$IFDEF USE_INLINE}inline;{$ENDIF}
|
||||
procedure PutWideStr(
|
||||
Const AName : String;
|
||||
Const ATypeInfo : PTypeInfo;
|
||||
Const AData : WideString
|
||||
);{$IFDEF USE_INLINE}inline;{$ENDIF}
|
||||
{$IFDEF WST_UNICODESTRING}
|
||||
procedure PutUnicodeStr(
|
||||
Const AName : String;
|
||||
Const ATypeInfo : PTypeInfo;
|
||||
Const AData : UnicodeString
|
||||
);{$IFDEF USE_INLINE}inline;{$ENDIF}
|
||||
{$ENDIF WST_UNICODESTRING}
|
||||
procedure PutEnum(
|
||||
Const AName : String;
|
||||
Const ATypeInfo : PTypeInfo;
|
||||
@ -260,11 +295,23 @@ type
|
||||
Var AName : String;
|
||||
Var AData : Int64
|
||||
);{$IFDEF USE_INLINE}inline;{$ENDIF}
|
||||
procedure GetStr(
|
||||
procedure GetAnsiStr(
|
||||
Const ATypeInfo : PTypeInfo;
|
||||
Var AName : String;
|
||||
Var AData : String
|
||||
Var AData : AnsiString
|
||||
);{$IFDEF USE_INLINE}inline;{$ENDIF}
|
||||
procedure GetWideStr(
|
||||
const ATypeInfo : PTypeInfo;
|
||||
var AName : String;
|
||||
var AData : WideString
|
||||
);{$IFDEF USE_INLINE}inline;{$ENDIF}
|
||||
{$IFDEF WST_UNICODESTRING}
|
||||
procedure GetUnicodeStr(
|
||||
const ATypeInfo : PTypeInfo;
|
||||
var AName : String;
|
||||
var AData : UnicodeString
|
||||
);{$IFDEF USE_INLINE}inline;{$ENDIF}
|
||||
{$ENDIF WST_UNICODESTRING}
|
||||
procedure GetObj(
|
||||
Const ATypeInfo : PTypeInfo;
|
||||
Var AName : String;
|
||||
@ -402,7 +449,11 @@ Begin
|
||||
dtExtended : APrinterProc( s + ARoot^.Name + ' = ' + FloatToStr(ARoot^.ExtendedData) );
|
||||
dtCurrency : APrinterProc( s + ARoot^.Name + ' = ' + FloatToStr(ARoot^.CurrencyData) );
|
||||
|
||||
dtString : APrinterProc( s + ARoot^.Name + ' = ' + ARoot^.StrData^.Data );
|
||||
dtAnsiString : APrinterProc( s + ARoot^.Name + ' = ' + ARoot^.AnsiStrData^.Data );
|
||||
dtWideString : APrinterProc( s + ARoot^.Name + ' = ' + ARoot^.WideStrData^.Data );
|
||||
{$IFDEF WST_UNICODESTRING}
|
||||
dtUnicodeString : APrinterProc( s + ARoot^.Name + ' = ' + ARoot^.UnicodeStrData^.Data );
|
||||
{$ENDIF WST_UNICODESTRING}
|
||||
dtObject :
|
||||
Begin
|
||||
APrinterProc( s + ARoot^.Name + ' = ');
|
||||
@ -494,13 +545,29 @@ begin
|
||||
Result^.Name := AName;
|
||||
Result^.DataType := ADataType;
|
||||
Case Result^.DataType Of
|
||||
dtString :
|
||||
dtAnsiString :
|
||||
Begin
|
||||
i := SizeOf(TStringBuffer);
|
||||
Result^.StrData := wst_GetMem(i);
|
||||
FillChar(Result^.StrData^,i,#0);
|
||||
Result^.StrData^.Data := '';
|
||||
i := SizeOf(TAnsiStringBuffer);
|
||||
Result^.AnsiStrData := wst_GetMem(i);
|
||||
FillChar(Result^.AnsiStrData^,i,#0);
|
||||
Result^.AnsiStrData^.Data := '';
|
||||
End;
|
||||
dtWideString :
|
||||
begin
|
||||
i := SizeOf(TWideStringBuffer);
|
||||
Result^.WideStrData := wst_GetMem(i);
|
||||
FillChar(Result^.WideStrData^,i,#0);
|
||||
Result^.WideStrData^.Data := '';
|
||||
end;
|
||||
{$IFDEF WST_UNICODESTRING}
|
||||
dtUnicodeString :
|
||||
begin
|
||||
i := SizeOf(TUnicodeStringBuffer);
|
||||
Result^.UnicodeStrData := wst_GetMem(i);
|
||||
FillChar(Result^.UnicodeStrData^,i,#0);
|
||||
Result^.UnicodeStrData^.Data := '';
|
||||
end;
|
||||
{$ENDIF WST_UNICODESTRING}
|
||||
dtObject :
|
||||
Begin
|
||||
Result^.ObjectData := wst_GetMem(SizeOf(TObjectBuffer));
|
||||
@ -559,7 +626,7 @@ Begin
|
||||
Exit;
|
||||
i := Ord(ARoot^.DataType);
|
||||
ADest.WriteInt32S(i);
|
||||
ADest.WriteStr(ARoot^.Name);
|
||||
ADest.WriteAnsiStr(ARoot^.Name);
|
||||
Case ARoot^.DataType Of
|
||||
dtInt8S : ADest.WriteInt8S(ARoot^.Int8S);
|
||||
dtInt8U : ADest.WriteInt8U(ARoot^.Int8U);
|
||||
@ -575,7 +642,11 @@ Begin
|
||||
dtExtended : ADest.WriteExtended(ARoot^.ExtendedData);
|
||||
dtCurrency : ADest.WriteCurrency(ARoot^.CurrencyData);
|
||||
|
||||
dtString : ADest.WriteStr(ARoot^.StrData^.Data);
|
||||
dtAnsiString : ADest.WriteAnsiStr(ARoot^.AnsiStrData^.Data);
|
||||
dtWideString : ADest.WriteWideStr(ARoot^.WideStrData^.Data);
|
||||
{$IFDEF WST_UNICODESTRING}
|
||||
dtUnicodeString : ADest.WriteUnicodeStr(ARoot^.UnicodeStrData^.Data);
|
||||
{$ENDIF WST_UNICODESTRING}
|
||||
dtBool : ADest.WriteBool(ARoot^.BoolData);
|
||||
dtEnum : ADest.WriteEnum(ARoot^.EnumData);
|
||||
dtObject :
|
||||
@ -620,7 +691,7 @@ Begin
|
||||
If AStoreRdr.IsAtEof() Then
|
||||
Exit;
|
||||
i := AStoreRdr.ReadInt32S();
|
||||
s := AStoreRdr.ReadStr();
|
||||
s := AStoreRdr.ReadAnsiStr();
|
||||
If ( TDataType(i) < dtArray ) Then
|
||||
Result := CreateObjBuffer(TDataType(i),s);
|
||||
Case TDataType(i) Of
|
||||
@ -638,7 +709,11 @@ Begin
|
||||
dtExtended : Result^.ExtendedData := AStoreRdr.ReadExtended();
|
||||
dtCurrency : Result^.CurrencyData := AStoreRdr.ReadCurrency();
|
||||
|
||||
dtString : Result^.StrData^.Data := AStoreRdr.ReadStr();
|
||||
dtAnsiString : Result^.AnsiStrData^.Data := AStoreRdr.ReadAnsiStr();
|
||||
dtWideString : Result^.WideStrData^.Data := AStoreRdr.ReadWideStr();
|
||||
{$IFDEF WST_UNICODESTRING}
|
||||
dtUnicodeString : Result^.UnicodeStrData^.Data := AStoreRdr.ReadUnicodeStr();
|
||||
{$ENDIF WST_UNICODESTRING}
|
||||
dtBool : Result^.BoolData := AStoreRdr.ReadBool();
|
||||
dtEnum : Result^.EnumData := AStoreRdr.ReadEnum();
|
||||
dtObject :
|
||||
@ -698,12 +773,26 @@ Var
|
||||
Begin
|
||||
AOwner^.Name := '';
|
||||
Case AOwner^.DataType Of
|
||||
dtString :
|
||||
dtAnsiString :
|
||||
Begin
|
||||
AOwner^.StrData^.Data := '';
|
||||
Freemem(AOwner^.StrData);
|
||||
AOwner^.StrData := Nil;
|
||||
AOwner^.AnsiStrData^.Data := '';
|
||||
Freemem(AOwner^.AnsiStrData);
|
||||
AOwner^.AnsiStrData := Nil;
|
||||
End;
|
||||
dtWideString :
|
||||
begin
|
||||
AOwner^.WideStrData^.Data := '';
|
||||
Freemem(AOwner^.WideStrData);
|
||||
AOwner^.WideStrData := Nil;
|
||||
end;
|
||||
{$IFDEF WST_UNICODESTRING}
|
||||
dtUnicodeString :
|
||||
begin
|
||||
AOwner^.UnicodeStrData^.Data := '';
|
||||
Freemem(AOwner^.UnicodeStrData);
|
||||
AOwner^.UnicodeStrData := Nil;
|
||||
end;
|
||||
{$ENDIF WST_UNICODESTRING}
|
||||
dtObject :
|
||||
Begin
|
||||
ClearObjectBuffer(AOwner^.ObjectData);
|
||||
@ -915,15 +1004,35 @@ begin
|
||||
End;
|
||||
end;
|
||||
|
||||
procedure TBaseBinaryFormatter.PutStr(
|
||||
procedure TBaseBinaryFormatter.PutAnsiStr(
|
||||
const AName : String;
|
||||
const ATypeInfo : PTypeInfo;
|
||||
const AData : String
|
||||
const AData : AnsiString
|
||||
);
|
||||
begin
|
||||
StackTop().CreateBuffer(AName,dtString)^.StrData^.Data := AData;
|
||||
StackTop().CreateBuffer(AName,dtAnsiString)^.AnsiStrData^.Data := AData;
|
||||
end;
|
||||
|
||||
procedure TBaseBinaryFormatter.PutWideStr(
|
||||
const AName: String;
|
||||
const ATypeInfo: PTypeInfo;
|
||||
const AData: WideString
|
||||
);
|
||||
begin
|
||||
StackTop().CreateBuffer(AName,dtWideString)^.WideStrData^.Data := AData;
|
||||
end;
|
||||
|
||||
{$IFDEF WST_UNICODESTRING}
|
||||
procedure TBaseBinaryFormatter.PutUnicodeStr(
|
||||
const AName: String;
|
||||
const ATypeInfo: PTypeInfo;
|
||||
const AData: UnicodeString
|
||||
);
|
||||
begin
|
||||
StackTop().CreateBuffer(AName,dtUnicodeString)^.UnicodeStrData^.Data := AData;
|
||||
end;
|
||||
{$ENDIF WST_UNICODESTRING}
|
||||
|
||||
procedure TBaseBinaryFormatter.PutEnum(
|
||||
const AName: String;
|
||||
const ATypeInfo: PTypeInfo;
|
||||
@ -1043,15 +1152,35 @@ begin
|
||||
AData := GetDataBuffer(AName)^.Int64S;
|
||||
end;
|
||||
|
||||
procedure TBaseBinaryFormatter.GetStr(
|
||||
procedure TBaseBinaryFormatter.GetAnsiStr(
|
||||
const ATypeInfo: PTypeInfo;
|
||||
var AName: String;
|
||||
var AData: String
|
||||
var AData: AnsiString
|
||||
);
|
||||
begin
|
||||
AData := GetDataBuffer(AName)^.StrData^.Data;
|
||||
AData := GetDataBuffer(AName)^.AnsiStrData^.Data;
|
||||
end;
|
||||
|
||||
procedure TBaseBinaryFormatter.GetWideStr(
|
||||
const ATypeInfo: PTypeInfo;
|
||||
var AName: String;
|
||||
var AData: WideString
|
||||
);
|
||||
begin
|
||||
AData := GetDataBuffer(AName)^.WideStrData^.Data;
|
||||
end;
|
||||
|
||||
{$IFDEF WST_UNICODESTRING}
|
||||
procedure TBaseBinaryFormatter.GetUnicodeStr(
|
||||
const ATypeInfo: PTypeInfo;
|
||||
var AName: String;
|
||||
var AData: UnicodeString
|
||||
);
|
||||
begin
|
||||
AData := GetDataBuffer(AName)^.UnicodeStrData^.Data;
|
||||
end;
|
||||
{$ENDIF WST_UNICODESTRING}
|
||||
|
||||
procedure TBaseBinaryFormatter.GetObj(
|
||||
const ATypeInfo: PTypeInfo;
|
||||
var AName: String;
|
||||
@ -1194,18 +1323,34 @@ end;
|
||||
procedure TBaseBinaryFormatter.Put(const AName: String; const ATypeInfo: PTypeInfo;const AData);
|
||||
Var
|
||||
int64Data : Int64;
|
||||
strData : string;
|
||||
ansiStrData : AnsiString;
|
||||
objData : TObject;
|
||||
boolData : Boolean;
|
||||
enumData : TEnumData;
|
||||
floatDt : TFloat_Extended_10;
|
||||
wideStrData : WideString;
|
||||
{$IFDEF WST_UNICODESTRING}
|
||||
unicodeStrData : UnicodeString;
|
||||
{$ENDIF WST_UNICODESTRING}
|
||||
begin
|
||||
Case ATypeInfo^.Kind Of
|
||||
tkLString{$IFDEF FPC},tkAString{$ENDIF} :
|
||||
Begin
|
||||
strData := String(AData);
|
||||
PutStr(AName,ATypeInfo,strData);
|
||||
ansiStrData := String(AData);
|
||||
PutAnsiStr(AName,ATypeInfo,ansiStrData);
|
||||
End;
|
||||
tkWString :
|
||||
begin
|
||||
wideStrData := WideString(AData);
|
||||
PutWideStr(AName,ATypeInfo,wideStrData);
|
||||
end;
|
||||
{$IFDEF WST_UNICODESTRING}
|
||||
tkUString :
|
||||
begin
|
||||
unicodeStrData := UnicodeString(AData);
|
||||
PutUnicodeStr(AName,ATypeInfo,unicodeStrData);
|
||||
end;
|
||||
{$ENDIF WST_UNICODESTRING}
|
||||
tkInt64{$IFDEF FPC},tkQWord{$ENDIF} :
|
||||
Begin
|
||||
int64Data := Int64(AData);
|
||||
@ -1290,14 +1435,30 @@ var
|
||||
boolData : Boolean;
|
||||
enumData : TEnumData;
|
||||
floatDt : TFloat_Extended_10;
|
||||
wideStrData : WideString;
|
||||
{$IFDEF WST_UNICODESTRING}
|
||||
unicodeStrData : UnicodeString;
|
||||
{$ENDIF WST_UNICODESTRING}
|
||||
begin
|
||||
CheckScope();
|
||||
case ATypeInfo^.Kind of
|
||||
tkLString{$IFDEF FPC},tkAString{$ENDIF} :
|
||||
begin
|
||||
strData := string(AData);
|
||||
StackTop().CreateInnerBuffer(dtString)^.StrData^.Data := strData;
|
||||
StackTop().CreateInnerBuffer(dtAnsiString)^.AnsiStrData^.Data := strData;
|
||||
end;
|
||||
tkWString :
|
||||
begin
|
||||
wideStrData := WideString(AData);
|
||||
StackTop().CreateInnerBuffer(dtWideString)^.WideStrData^.Data := wideStrData;
|
||||
end;
|
||||
{$IFDEF WST_UNICODESTRING}
|
||||
tkUString :
|
||||
begin
|
||||
unicodeStrData := UnicodeString(AData);
|
||||
StackTop().CreateInnerBuffer(dtUnicodeString)^.UnicodeStrData^.Data := unicodeStrData;
|
||||
end;
|
||||
{$ENDIF WST_UNICODESTRING}
|
||||
tkInt64 :
|
||||
begin
|
||||
int64SData := Int64(AData);
|
||||
@ -1403,7 +1564,7 @@ begin
|
||||
ftCurr :
|
||||
begin
|
||||
floatDt := Currency(AData);
|
||||
StackTop().CreateInnerBuffer(dtExtended)^.ExtendedData := floatDt;
|
||||
StackTop().CreateInnerBuffer(dtExtended)^.CurrencyData := floatDt;
|
||||
end;
|
||||
ftComp :
|
||||
begin
|
||||
@ -1430,6 +1591,10 @@ Var
|
||||
enumData : TEnumData;
|
||||
floatDt : TFloat_Extended_10;
|
||||
recObject : Pointer;
|
||||
wideStrData : WideString;
|
||||
{$IFDEF WST_UNICODESTRING}
|
||||
unicodeStrData : UnicodeString;
|
||||
{$ENDIF WST_UNICODESTRING}
|
||||
begin
|
||||
Case ATypeInfo^.Kind Of
|
||||
tkInt64{$IFDEF FPC},tkQWord{$ENDIF} :
|
||||
@ -1441,9 +1606,23 @@ begin
|
||||
tkLString{$IFDEF FPC},tkAString{$ENDIF} :
|
||||
Begin
|
||||
strData := '';
|
||||
GetStr(ATypeInfo,AName,strData);
|
||||
GetAnsiStr(ATypeInfo,AName,strData);
|
||||
String(AData) := strData;
|
||||
End;
|
||||
tkWString :
|
||||
begin
|
||||
wideStrData := '';
|
||||
GetWideStr(ATypeInfo,AName,wideStrData);
|
||||
WideString(AData) := wideStrData;
|
||||
end;
|
||||
{$IFDEF WST_UNICODESTRING}
|
||||
tkUString :
|
||||
begin
|
||||
unicodeStrData := '';
|
||||
GetUnicodeStr(ATypeInfo,AName,unicodeStrData);
|
||||
UnicodeString(AData) := unicodeStrData;
|
||||
end;
|
||||
{$ENDIF WST_UNICODESTRING}
|
||||
tkClass :
|
||||
Begin
|
||||
objData := TObject(AData);
|
||||
@ -1536,7 +1715,11 @@ begin
|
||||
tkLString
|
||||
{$IFDEF FPC},
|
||||
tkAString
|
||||
{$ENDIF} : string(AData) := dataBuffer^.StrData^.Data;
|
||||
{$ENDIF} : string(AData) := dataBuffer^.AnsiStrData^.Data;
|
||||
tkWString : WideString(AData) := dataBuffer^.WideStrData^.Data;
|
||||
{$IFDEF WST_UNICODESTRING}
|
||||
tkUString : UnicodeString(AData) := dataBuffer^.UnicodeStrData^.Data;
|
||||
{$ENDIF WST_UNICODESTRING}
|
||||
|
||||
tkClass, tkRecord : raise EBinaryFormatterException.Create('Inner Scope value must be a "simple type" value.');
|
||||
{$IFDEF FPC}
|
||||
|
@ -214,6 +214,18 @@ type
|
||||
Const ATypeInfo : PTypeInfo;
|
||||
Const AData : String
|
||||
);{$IFDEF USE_INLINE}inline;{$ENDIF}
|
||||
{$IFDEF WST_UNICODESTRING}
|
||||
procedure PutUnicodeStr(
|
||||
Const AName : String;
|
||||
Const ATypeInfo : PTypeInfo;
|
||||
Const AData : UnicodeString
|
||||
);{$IFDEF USE_INLINE}inline;{$ENDIF}
|
||||
{$ENDIF WST_UNICODESTRING}
|
||||
procedure PutWideStr(
|
||||
Const AName : String;
|
||||
Const ATypeInfo : PTypeInfo;
|
||||
Const AData : WideString
|
||||
);{$IFDEF USE_INLINE}inline;{$ENDIF}
|
||||
procedure PutFloat(
|
||||
Const AName : String;
|
||||
Const ATypeInfo : PTypeInfo;
|
||||
@ -263,6 +275,18 @@ type
|
||||
Var AName : String;
|
||||
Var AData : String
|
||||
);{$IFDEF USE_INLINE}inline;{$ENDIF}
|
||||
{$IFDEF WST_UNICODESTRING}
|
||||
procedure GetUnicodeStr(
|
||||
Const ATypeInfo : PTypeInfo;
|
||||
Var AName : String;
|
||||
Var AData : UnicodeString
|
||||
);{$IFDEF USE_INLINE}inline;{$ENDIF}
|
||||
{$ENDIF WST_UNICODESTRING}
|
||||
procedure GetWideStr(
|
||||
Const ATypeInfo : PTypeInfo;
|
||||
Var AName : String;
|
||||
Var AData : WideString
|
||||
);{$IFDEF USE_INLINE}inline;{$ENDIF}
|
||||
procedure GetObj(
|
||||
Const ATypeInfo : PTypeInfo;
|
||||
Var AName : String;
|
||||
@ -449,6 +473,26 @@ begin
|
||||
StackTop().CreateStringBuffer(AName,AData);
|
||||
end;
|
||||
|
||||
{$IFDEF WST_UNICODESTRING}
|
||||
procedure TJsonRpcBaseFormatter.PutUnicodeStr(
|
||||
const AName: String;
|
||||
const ATypeInfo: PTypeInfo;
|
||||
const AData: UnicodeString
|
||||
);
|
||||
begin
|
||||
StackTop().CreateStringBuffer(AName,AData);
|
||||
end;
|
||||
{$ENDIF WST_UNICODESTRING}
|
||||
|
||||
procedure TJsonRpcBaseFormatter.PutWideStr(
|
||||
const AName: String;
|
||||
const ATypeInfo: PTypeInfo;
|
||||
const AData: WideString
|
||||
);
|
||||
begin
|
||||
StackTop().CreateStringBuffer(AName,AData);
|
||||
end;
|
||||
|
||||
procedure TJsonRpcBaseFormatter.PutFloat(
|
||||
const AName : String;
|
||||
const ATypeInfo : PTypeInfo;
|
||||
@ -537,6 +581,26 @@ begin
|
||||
AData := GetDataBuffer(AName).AsString;
|
||||
end;
|
||||
|
||||
{$IFDEF WST_UNICODESTRING}
|
||||
procedure TJsonRpcBaseFormatter.GetUnicodeStr(
|
||||
const ATypeInfo: PTypeInfo;
|
||||
var AName: String;
|
||||
var AData: UnicodeString
|
||||
);
|
||||
begin
|
||||
AData := GetDataBuffer(AName).AsString;
|
||||
end;
|
||||
{$ENDIF WST_UNICODESTRING}
|
||||
|
||||
procedure TJsonRpcBaseFormatter.GetWideStr(
|
||||
const ATypeInfo: PTypeInfo;
|
||||
var AName: String;
|
||||
var AData: WideString
|
||||
);
|
||||
begin
|
||||
AData := GetDataBuffer(AName).AsString;
|
||||
end;
|
||||
|
||||
procedure TJsonRpcBaseFormatter.GetObj(
|
||||
const ATypeInfo : PTypeInfo;
|
||||
var AName : String;
|
||||
@ -736,6 +800,10 @@ Var
|
||||
boolData : Boolean;
|
||||
enumData : TEnumIntType;
|
||||
floatDt : Extended;
|
||||
{$IFDEF WST_UNICODESTRING}
|
||||
unicodeStrData : UnicodeString;
|
||||
{$ENDIF WST_UNICODESTRING}
|
||||
wideStrData : WideString;
|
||||
begin
|
||||
Case ATypeInfo^.Kind Of
|
||||
tkLString{$IFDEF FPC},tkAString{$ENDIF} :
|
||||
@ -743,6 +811,18 @@ begin
|
||||
strData := String(AData);
|
||||
PutStr(AName,ATypeInfo,strData);
|
||||
End;
|
||||
{$IFDEF WST_UNICODESTRING}
|
||||
tkUString :
|
||||
begin
|
||||
unicodeStrData := UnicodeString(AData);
|
||||
PutUnicodeStr(AName,ATypeInfo,unicodeStrData);
|
||||
end;
|
||||
{$ENDIF WST_UNICODESTRING}
|
||||
tkWString :
|
||||
begin
|
||||
wideStrData := WideString(AData);
|
||||
PutWideStr(AName,ATypeInfo,wideStrData);
|
||||
end;
|
||||
tkInt64{$IFDEF FPC},tkQWord{$ENDIF} :
|
||||
Begin
|
||||
int64Data := Int64(AData);
|
||||
@ -825,6 +905,10 @@ var
|
||||
boolData : Boolean;
|
||||
enumData : TEnumIntType;
|
||||
floatDt : Extended;
|
||||
wideStrData : WideString;
|
||||
{$IFDEF WST_UNICODESTRING}
|
||||
unicodeStrData : UnicodeString;
|
||||
{$ENDIF WST_UNICODESTRING}
|
||||
begin
|
||||
locName := s_inner_value;
|
||||
Case ATypeInfo^.Kind Of
|
||||
@ -833,6 +917,18 @@ begin
|
||||
strData := String(AData);
|
||||
PutStr(locName,ATypeInfo,strData);
|
||||
End;
|
||||
tkWString :
|
||||
begin
|
||||
wideStrData := WideString(AData);
|
||||
PutWideStr(locName,ATypeInfo,wideStrData);
|
||||
end;
|
||||
{$IFDEF WST_UNICODESTRING}
|
||||
tkUString :
|
||||
begin
|
||||
unicodeStrData := UnicodeString(AData);
|
||||
PutUnicodeStr(locName,ATypeInfo,unicodeStrData);
|
||||
end;
|
||||
{$ENDIF WST_UNICODESTRING}
|
||||
tkInt64{$IFDEF FPC},tkQWord{$ENDIF} :
|
||||
Begin
|
||||
int64Data := Int64(AData);
|
||||
@ -904,6 +1000,10 @@ Var
|
||||
enumData : TEnumIntType;
|
||||
floatDt : Extended;
|
||||
recObject : Pointer;
|
||||
{$IFDEF WST_UNICODESTRING}
|
||||
unicodeStrData : UnicodeString;
|
||||
{$ENDIF WST_UNICODESTRING}
|
||||
WideStrData : WideString;
|
||||
begin
|
||||
Case ATypeInfo^.Kind Of
|
||||
tkInt64{$IFDEF FPC},tkQWord{$ENDIF} :
|
||||
@ -918,6 +1018,20 @@ begin
|
||||
GetStr(ATypeInfo,AName,strData);
|
||||
String(AData) := strData;
|
||||
End;
|
||||
{$IFDEF WST_UNICODESTRING}
|
||||
tkUString :
|
||||
Begin
|
||||
unicodeStrData := '';
|
||||
GetUnicodeStr(ATypeInfo,AName,unicodeStrData);
|
||||
UnicodeString(AData) := unicodeStrData;
|
||||
End;
|
||||
{$ENDIF WST_UNICODESTRING}
|
||||
tkWString :
|
||||
Begin
|
||||
WideStrData := '';
|
||||
GetWideStr(ATypeInfo,AName,WideStrData);
|
||||
WideString(AData) := WideStrData;
|
||||
End;
|
||||
tkClass :
|
||||
Begin
|
||||
objData := TObject(AData);
|
||||
@ -1002,6 +1116,10 @@ var
|
||||
enumData : TEnumIntType;
|
||||
floatDt : Extended;
|
||||
recObject : Pointer;
|
||||
wideStrData : WideString;
|
||||
{$IFDEF WST_UNICODESTRING}
|
||||
unicodeStrData : UnicodeString;
|
||||
{$ENDIF WST_UNICODESTRING}
|
||||
begin
|
||||
locName := s_inner_value;
|
||||
Case ATypeInfo^.Kind Of
|
||||
@ -1017,6 +1135,20 @@ begin
|
||||
GetStr(ATypeInfo,locName,strData);
|
||||
String(AData) := strData;
|
||||
End;
|
||||
tkWString :
|
||||
begin
|
||||
wideStrData := '';
|
||||
GetWideStr(ATypeInfo,locName,wideStrData);
|
||||
WideString(AData) := wideStrData;
|
||||
end;
|
||||
{$IFDEF WST_UNICODESTRING}
|
||||
tkUString :
|
||||
begin
|
||||
unicodeStrData := '';
|
||||
GetUnicodeStr(ATypeInfo,locName,unicodeStrData);
|
||||
UnicodeString(AData) := unicodeStrData;
|
||||
end;
|
||||
{$ENDIF WST_UNICODESTRING}
|
||||
tkClass, tkRecord :
|
||||
Begin
|
||||
raise EJsonRpcException.Create('Inner Scope value must be a "simple type" value.');
|
||||
|
@ -633,6 +633,32 @@ type
|
||||
property Value : string read FValue write FValue;
|
||||
end;
|
||||
|
||||
{ TComplexWideStringContentRemotable }
|
||||
|
||||
TComplexWideStringContentRemotable = class(TBaseComplexSimpleContentRemotable)
|
||||
private
|
||||
FValue: Widestring;
|
||||
protected
|
||||
class procedure SaveValue(AObject : TBaseRemotable; AStore : IFormatterBase);override;
|
||||
class procedure LoadValue(var AObject : TObject; AStore : IFormatterBase);override;
|
||||
public
|
||||
property Value : Widestring read FValue write FValue;
|
||||
end;
|
||||
|
||||
{$IFDEF WST_UNICODESTRING}
|
||||
{ TComplexUnicodeStringContentRemotable }
|
||||
|
||||
TComplexUnicodeStringContentRemotable = class(TBaseComplexSimpleContentRemotable)
|
||||
private
|
||||
FValue: UnicodeString;
|
||||
protected
|
||||
class procedure SaveValue(AObject : TBaseRemotable; AStore : IFormatterBase);override;
|
||||
class procedure LoadValue(var AObject : TObject; AStore : IFormatterBase);override;
|
||||
public
|
||||
property Value : UnicodeString read FValue write FValue;
|
||||
end;
|
||||
{$ENDIF WST_UNICODESTRING}
|
||||
|
||||
{ TBase64StringExtRemotable }
|
||||
|
||||
TBase64StringExtRemotable = class(TBaseComplexSimpleContentRemotable)
|
||||
@ -1509,6 +1535,10 @@ begin
|
||||
|
||||
r.Register(sXSD_NS,TypeInfo(string),'string').AddPascalSynonym('string');
|
||||
r.Register(sXSD_NS,TypeInfo(AnsiString),'ansistring').AddPascalSynonym('ansistring');
|
||||
r.Register(sXSD_NS,TypeInfo(WideString),'widestring').AddPascalSynonym('widestring');
|
||||
{$IFDEF WST_UNICODESTRING}
|
||||
r.Register(sXSD_NS,TypeInfo(UnicodeString),'UnicodeString').AddPascalSynonym('unicodestring');
|
||||
{$ENDIF WST_UNICODESTRING}
|
||||
r.Register(sXSD_NS,TypeInfo(anyURI),'anyURI').AddPascalSynonym('anyURI');
|
||||
|
||||
r.Register(sXSD_NS,TypeInfo(boolean),'boolean').AddPascalSynonym('boolean');
|
||||
@ -1577,6 +1607,10 @@ begin
|
||||
r.Register(sXSD_NS,TypeInfo(TComplexFloatSingleContentRemotable),'Single').AddPascalSynonym('TComplexFloatSingleContentRemotable');
|
||||
|
||||
r.Register(sXSD_NS,TypeInfo(TComplexStringContentRemotable),'string').AddPascalSynonym('TComplexStringContentRemotable');
|
||||
r.Register(sXSD_NS,TypeInfo(TComplexWideStringContentRemotable),'widestring').AddPascalSynonym('TComplexWideStringContentRemotable');
|
||||
{$IFDEF WST_UNICODESTRING}
|
||||
r.Register(sXSD_NS,TypeInfo(TComplexUnicodeStringContentRemotable),'unicodestring').AddPascalSynonym('TComplexUnicodeStringContentRemotable');
|
||||
{$ENDIF WST_UNICODESTRING}
|
||||
r.Register(sXSD_NS,TypeInfo(TComplexBooleanContentRemotable),'boolean').AddPascalSynonym('TComplexBooleanContentRemotable');
|
||||
end;
|
||||
|
||||
@ -5119,6 +5153,52 @@ begin
|
||||
(AObject as TComplexStringContentRemotable).Value := i;
|
||||
end;
|
||||
|
||||
{ TComplexWideStringContentRemotable }
|
||||
|
||||
class procedure TComplexWideStringContentRemotable.SaveValue(
|
||||
AObject: TBaseRemotable;
|
||||
AStore: IFormatterBase
|
||||
);
|
||||
begin
|
||||
AStore.PutScopeInnerValue(TypeInfo(WideString),(AObject as TComplexWideStringContentRemotable).Value);
|
||||
end;
|
||||
|
||||
class procedure TComplexWideStringContentRemotable.LoadValue(
|
||||
var AObject: TObject;
|
||||
AStore: IFormatterBase
|
||||
);
|
||||
var
|
||||
i : WideString;
|
||||
begin
|
||||
i := '';
|
||||
AStore.GetScopeInnerValue(TypeInfo(WideString),i);
|
||||
(AObject as TComplexWideStringContentRemotable).Value := i;
|
||||
end;
|
||||
|
||||
{$IFDEF WST_UNICODESTRING}
|
||||
{ TComplexUnicodeStringContentRemotable }
|
||||
|
||||
class procedure TComplexUnicodeStringContentRemotable.SaveValue(
|
||||
AObject: TBaseRemotable;
|
||||
AStore: IFormatterBase
|
||||
);
|
||||
begin
|
||||
AStore.PutScopeInnerValue(TypeInfo(UnicodeString),(AObject as TComplexUnicodeStringContentRemotable).Value);
|
||||
end;
|
||||
|
||||
class procedure TComplexUnicodeStringContentRemotable.LoadValue(
|
||||
var AObject: TObject;
|
||||
AStore: IFormatterBase
|
||||
);
|
||||
var
|
||||
i : UnicodeString;
|
||||
begin
|
||||
i := '';
|
||||
AStore.GetScopeInnerValue(TypeInfo(UnicodeString),i);
|
||||
(AObject as TComplexUnicodeStringContentRemotable).Value := i;
|
||||
end;
|
||||
{$ENDIF WST_UNICODESTRING}
|
||||
|
||||
{ TDateRemotable }
|
||||
|
||||
procedure TDateRemotable.SetDate(const AValue: TDateTime);
|
||||
@ -6271,6 +6351,7 @@ begin
|
||||
end;
|
||||
|
||||
|
||||
|
||||
initialization
|
||||
initialize_base_service_intf();
|
||||
|
||||
|
@ -152,7 +152,7 @@ type
|
||||
const ANameSpace : string;
|
||||
Const AName : String;
|
||||
Const ATypeInfo : PTypeInfo;
|
||||
Const AData : string
|
||||
Const AData : DOMString
|
||||
):TDOMNode;
|
||||
function PutEnum(
|
||||
const ANameSpace : string;
|
||||
@ -178,6 +178,20 @@ type
|
||||
Const ATypeInfo : PTypeInfo;
|
||||
Const AData : String
|
||||
):TDOMNode;{$IFDEF USE_INLINE}inline;{$ENDIF}
|
||||
{$IFDEF WST_UNICODESTRING}
|
||||
function PutUnicodeStr(
|
||||
const ANameSpace : string;
|
||||
Const AName : String;
|
||||
Const ATypeInfo : PTypeInfo;
|
||||
Const AData : UnicodeString
|
||||
):TDOMNode;{$IFDEF USE_INLINE}inline;{$ENDIF}
|
||||
{$ENDIF WST_UNICODESTRING}
|
||||
function PutWideStr(
|
||||
const ANameSpace : string;
|
||||
Const AName : String;
|
||||
Const ATypeInfo : PTypeInfo;
|
||||
Const AData : WideString
|
||||
):TDOMNode;{$IFDEF USE_INLINE}inline;{$ENDIF}
|
||||
function PutFloat(
|
||||
const ANameSpace : string;
|
||||
Const AName : String;
|
||||
@ -234,6 +248,20 @@ type
|
||||
Var AName : String;
|
||||
Var AData : String
|
||||
);{$IFDEF USE_INLINE}inline;{$ENDIF}
|
||||
{$IFDEF WST_UNICODESTRING}
|
||||
procedure GetUnicodeStr(
|
||||
Const ATypeInfo : PTypeInfo;
|
||||
const ANameSpace : string;
|
||||
Var AName : String;
|
||||
Var AData : UnicodeString
|
||||
);{$IFDEF USE_INLINE}inline;{$ENDIF}
|
||||
{$ENDIF WST_UNICODESTRING}
|
||||
procedure GetWideStr(
|
||||
Const ATypeInfo : PTypeInfo;
|
||||
const ANameSpace : string;
|
||||
Var AName : String;
|
||||
Var AData : WideString
|
||||
);{$IFDEF USE_INLINE}inline;{$ENDIF}
|
||||
procedure GetObj(
|
||||
Const ATypeInfo : PTypeInfo;
|
||||
Var AName : String;
|
||||
@ -715,7 +743,7 @@ function TSOAPBaseFormatter.InternalPutData(
|
||||
const ANameSpace : string;
|
||||
const AName : String;
|
||||
const ATypeInfo : PTypeInfo;
|
||||
const AData : string
|
||||
const AData : DOMString
|
||||
): TDOMNode;
|
||||
Var
|
||||
namespaceLongName, namespaceShortName, strName, strNodeName, s : string;
|
||||
@ -813,6 +841,28 @@ begin
|
||||
Result := InternalPutData(ANameSpace,AName,ATypeInfo,AData);
|
||||
end;
|
||||
|
||||
{$IFDEF WST_UNICODESTRING}
|
||||
function TSOAPBaseFormatter.PutUnicodeStr(
|
||||
const ANameSpace: string;
|
||||
const AName: String;
|
||||
const ATypeInfo: PTypeInfo;
|
||||
const AData: UnicodeString
|
||||
): TDOMNode;
|
||||
begin
|
||||
Result := InternalPutData(ANameSpace,AName,ATypeInfo,AData);
|
||||
end;
|
||||
{$ENDIF WST_UNICODESTRING}
|
||||
|
||||
function TSOAPBaseFormatter.PutWideStr(
|
||||
const ANameSpace: string;
|
||||
const AName: String;
|
||||
const ATypeInfo: PTypeInfo;
|
||||
const AData: WideString
|
||||
) : TDOMNode;
|
||||
begin
|
||||
Result := InternalPutData(ANameSpace,AName,ATypeInfo,AData);
|
||||
end;
|
||||
|
||||
procedure TSOAPBaseFormatter.PutObj(
|
||||
const AName : String;
|
||||
const ATypeInfo : PTypeInfo;
|
||||
@ -976,6 +1026,28 @@ begin
|
||||
AData := GetNodeValue(ANameSpace,AName);
|
||||
end;
|
||||
|
||||
{$IFDEF WST_UNICODESTRING}
|
||||
procedure TSOAPBaseFormatter.GetUnicodeStr(
|
||||
const ATypeInfo: PTypeInfo;
|
||||
const ANameSpace: string;
|
||||
var AName: String;
|
||||
var AData: UnicodeString
|
||||
);
|
||||
begin
|
||||
AData := GetNodeValue(ANameSpace,AName);
|
||||
end;
|
||||
{$ENDIF WST_UNICODESTRING}
|
||||
|
||||
procedure TSOAPBaseFormatter.GetWideStr(
|
||||
const ATypeInfo: PTypeInfo;
|
||||
const ANameSpace: string;
|
||||
var AName: String;
|
||||
var AData: WideString
|
||||
);
|
||||
begin
|
||||
AData := GetNodeValue(ANameSpace,AName);
|
||||
end;
|
||||
|
||||
procedure TSOAPBaseFormatter.GetObj(
|
||||
const ATypeInfo : PTypeInfo;
|
||||
var AName : String;
|
||||
@ -1466,6 +1538,10 @@ Var
|
||||
boolData : Boolean;
|
||||
enumData : TEnumIntType;
|
||||
floatDt : Extended;
|
||||
{$IFDEF WST_UNICODESTRING}
|
||||
unicodeStrData : UnicodeString;
|
||||
{$ENDIF WST_UNICODESTRING}
|
||||
wideStrData : WideString;
|
||||
begin
|
||||
Case ATypeInfo^.Kind Of
|
||||
tkInt64{$IFDEF FPC},tkQWord{$ENDIF} :
|
||||
@ -1478,6 +1554,18 @@ begin
|
||||
strData := String(AData);
|
||||
PutStr(ANameSpace,AName,ATypeInfo,strData);
|
||||
End;
|
||||
{$IFDEF WST_UNICODESTRING}
|
||||
tkUString :
|
||||
Begin
|
||||
unicodeStrData := UnicodeString(AData);
|
||||
PutUnicodeStr(ANameSpace,AName,ATypeInfo,unicodeStrData);
|
||||
End;
|
||||
{$ENDIF WST_UNICODESTRING}
|
||||
tkWString :
|
||||
Begin
|
||||
wideStrData := WideString(AData);
|
||||
PutWideStr(ANameSpace,AName,ATypeInfo,wideStrData);
|
||||
End;
|
||||
tkClass :
|
||||
Begin
|
||||
objData := TObject(AData);
|
||||
@ -1561,6 +1649,10 @@ Var
|
||||
dataBuffer : string;
|
||||
frmt : string;
|
||||
prcsn,i : Integer;
|
||||
wideStrData : WideString;
|
||||
{$IFDEF WST_UNICODESTRING}
|
||||
unicodeStrData : UnicodeString;
|
||||
{$ENDIF WST_UNICODESTRING}
|
||||
{strm : TStringStream;
|
||||
locDoc : TwstXMLDocument;
|
||||
locNode : TDOMNode;}
|
||||
@ -1584,6 +1676,18 @@ begin
|
||||
strData := string(AData);
|
||||
dataBuffer := strData;
|
||||
end;
|
||||
tkWString :
|
||||
begin
|
||||
wideStrData := WideString(AData);
|
||||
dataBuffer := wideStrData;
|
||||
end;
|
||||
{$IFDEF WST_UNICODESTRING}
|
||||
tkUString :
|
||||
begin
|
||||
unicodeStrData := UnicodeString(AData);
|
||||
dataBuffer := unicodeStrData;
|
||||
end;
|
||||
{$ENDIF WST_UNICODESTRING}
|
||||
tkClass :
|
||||
begin
|
||||
raise ESOAPException.Create('Inner Scope value must be a "simple type" value.');
|
||||
@ -1684,6 +1788,10 @@ Var
|
||||
enumData : TEnumIntType;
|
||||
floatDt : Extended;
|
||||
recObject : Pointer;
|
||||
{$IFDEF WST_UNICODESTRING}
|
||||
unicodeStrData : UnicodeString;
|
||||
{$ENDIF WST_UNICODESTRING}
|
||||
wideStrData : WideString;
|
||||
begin
|
||||
Case ATypeInfo^.Kind Of
|
||||
tkInt64{$IFDEF FPC},tkQWord{$ENDIF} :
|
||||
@ -1698,6 +1806,20 @@ begin
|
||||
GetStr(ATypeInfo,ANameSpace,AName,strData);
|
||||
String(AData) := strData;
|
||||
End;
|
||||
{$IFDEF WST_UNICODESTRING}
|
||||
tkUString :
|
||||
begin
|
||||
unicodeStrData := '';
|
||||
GetUnicodeStr(ATypeInfo,ANameSpace,AName,unicodeStrData);
|
||||
UnicodeString(AData) := unicodeStrData;
|
||||
end;
|
||||
{$ENDIF WST_UNICODESTRING}
|
||||
tkWString :
|
||||
begin
|
||||
wideStrData := '';
|
||||
GetWideStr(ATypeInfo,ANameSpace,AName,wideStrData);
|
||||
WideString(AData) := wideStrData;
|
||||
end;
|
||||
tkClass :
|
||||
Begin
|
||||
objData := TObject(AData);
|
||||
@ -1793,6 +1915,10 @@ begin
|
||||
tkQWord : QWord(AData) := StrToInt64Def(Trim(dataBuffer),0);
|
||||
{$ENDIF}
|
||||
tkLString{$IFDEF FPC},tkAString{$ENDIF} : string(AData) := dataBuffer;
|
||||
tkWString : WideString(AData) := dataBuffer;
|
||||
{$IFDEF WST_UNICODESTRING}
|
||||
tkUString : UnicodeString(AData) := dataBuffer;
|
||||
{$ENDIF WST_UNICODESTRING}
|
||||
tkClass :
|
||||
begin
|
||||
raise ESOAPException.Create('Inner Scope value must be a "simple type" value.');
|
||||
|
@ -172,7 +172,7 @@ type
|
||||
function InternalPutData(
|
||||
const AName : string;
|
||||
const AType : TXmlRpcDataType;
|
||||
const AData : string
|
||||
const AData : DOMString
|
||||
):TDOMNode;{$IFDEF USE_INLINE}inline;{$ENDIF}
|
||||
function PutEnum(
|
||||
Const AName : String;
|
||||
@ -196,6 +196,18 @@ type
|
||||
Const ATypeInfo : PTypeInfo;
|
||||
Const AData : String
|
||||
):TDOMNode;{$IFDEF USE_INLINE}inline;{$ENDIF}
|
||||
{$IFDEF WST_UNICODESTRING}
|
||||
function PutUnicodeStr(
|
||||
Const AName : String;
|
||||
Const ATypeInfo : PTypeInfo;
|
||||
Const AData : UnicodeString
|
||||
):TDOMNode;{$IFDEF USE_INLINE}inline;{$ENDIF}
|
||||
{$ENDIF WST_UNICODESTRING}
|
||||
function PutWideStr(
|
||||
Const AName : String;
|
||||
Const ATypeInfo : PTypeInfo;
|
||||
Const AData : WideString
|
||||
):TDOMNode;{$IFDEF USE_INLINE}inline;{$ENDIF}
|
||||
function PutFloat(
|
||||
Const AName : String;
|
||||
Const ATypeInfo : PTypeInfo;
|
||||
@ -245,6 +257,18 @@ type
|
||||
Var AName : String;
|
||||
Var AData : String
|
||||
);{$IFDEF USE_INLINE}inline;{$ENDIF}
|
||||
{$IFDEF WST_UNICODESTRING}
|
||||
procedure GetUnicodeStr(
|
||||
Const ATypeInfo : PTypeInfo;
|
||||
Var AName : String;
|
||||
Var AData : UnicodeString
|
||||
);{$IFDEF USE_INLINE}inline;{$ENDIF}
|
||||
{$ENDIF WST_UNICODESTRING}
|
||||
procedure GetWideStr(
|
||||
Const ATypeInfo : PTypeInfo;
|
||||
Var AName : String;
|
||||
Var AData : WideString
|
||||
);{$IFDEF USE_INLINE}inline;{$ENDIF}
|
||||
procedure GetObj(
|
||||
Const ATypeInfo : PTypeInfo;
|
||||
Var AName : String;
|
||||
@ -751,7 +775,7 @@ end;
|
||||
function TXmlRpcBaseFormatter.InternalPutData(
|
||||
const AName : string;
|
||||
const AType : TXmlRpcDataType;
|
||||
const AData : string
|
||||
const AData : DOMString
|
||||
): TDOMNode;
|
||||
begin
|
||||
Result := StackTop().CreateBuffer(AName,AType).AppendChild(FDoc.CreateTextNode(AData));
|
||||
@ -809,6 +833,34 @@ begin
|
||||
);
|
||||
end;
|
||||
|
||||
{$IFDEF WST_UNICODESTRING}
|
||||
function TXmlRpcBaseFormatter.PutUnicodeStr(
|
||||
const AName: String;
|
||||
const ATypeInfo: PTypeInfo;
|
||||
const AData: UnicodeString
|
||||
) : TDOMNode;
|
||||
begin
|
||||
Result := InternalPutData(
|
||||
AName,
|
||||
xdtString,
|
||||
AData//StringReplace(StringReplace(AData,'<','<',[rfReplaceAll]),'&','&',[rfReplaceAll])
|
||||
);
|
||||
end;
|
||||
{$ENDIF WST_UNICODESTRING}
|
||||
|
||||
function TXmlRpcBaseFormatter.PutWideStr(
|
||||
const AName: String;
|
||||
const ATypeInfo: PTypeInfo;
|
||||
const AData: WideString
|
||||
) : TDOMNode;
|
||||
begin
|
||||
Result := InternalPutData(
|
||||
AName,
|
||||
xdtString,
|
||||
AData//StringReplace(StringReplace(AData,'<','<',[rfReplaceAll]),'&','&',[rfReplaceAll])
|
||||
);
|
||||
end;
|
||||
|
||||
procedure TXmlRpcBaseFormatter.PutObj(
|
||||
const AName : String;
|
||||
const ATypeInfo : PTypeInfo;
|
||||
@ -945,6 +997,26 @@ begin
|
||||
AData := GetNodeValue(AName);
|
||||
end;
|
||||
|
||||
{$IFDEF WST_UNICODESTRING}
|
||||
procedure TXmlRpcBaseFormatter.GetUnicodeStr(
|
||||
const ATypeInfo: PTypeInfo;
|
||||
var AName: String;
|
||||
var AData: UnicodeString
|
||||
);
|
||||
begin
|
||||
AData := GetNodeValue(AName);
|
||||
end;
|
||||
{$ENDIF WST_UNICODESTRING}
|
||||
|
||||
procedure TXmlRpcBaseFormatter.GetWideStr(
|
||||
const ATypeInfo: PTypeInfo;
|
||||
var AName: String;
|
||||
var AData: WideString
|
||||
);
|
||||
begin
|
||||
AData := GetNodeValue(AName);
|
||||
end;
|
||||
|
||||
procedure TXmlRpcBaseFormatter.GetObj(
|
||||
const ATypeInfo : PTypeInfo;
|
||||
var AName : String;
|
||||
@ -1138,6 +1210,10 @@ Var
|
||||
{$IFDEF FPC}boolData : Boolean;{$ENDIF}
|
||||
enumData : TEnumIntType;
|
||||
floatDt : Extended;
|
||||
{$IFDEF WST_UNICODESTRING}
|
||||
unicodeStrData : UnicodeString;
|
||||
{$ENDIF WST_UNICODESTRING}
|
||||
wideStrData : WideString;
|
||||
begin
|
||||
Case ATypeInfo^.Kind Of
|
||||
tkInt64{$IFDEF FPC},tkQWord{$ENDIF} :
|
||||
@ -1150,6 +1226,18 @@ begin
|
||||
strData := String(AData);
|
||||
PutStr(AName,ATypeInfo,strData);
|
||||
End;
|
||||
tkWString :
|
||||
Begin
|
||||
wideStrData := WideString(AData);
|
||||
PutWideStr(AName,ATypeInfo,wideStrData);
|
||||
End;
|
||||
{$IFDEF WST_UNICODESTRING}
|
||||
tkUString :
|
||||
Begin
|
||||
unicodeStrData := UnicodeString(AData);
|
||||
PutUnicodeStr(AName,ATypeInfo,unicodeStrData);
|
||||
End;
|
||||
{$ENDIF WST_UNICODESTRING}
|
||||
tkClass :
|
||||
Begin
|
||||
objData := TObject(AData);
|
||||
@ -1222,6 +1310,10 @@ Var
|
||||
dataBuffer : string;
|
||||
frmt : string;
|
||||
prcsn,i : Integer;
|
||||
wideStrData : WideString;
|
||||
{$IFDEF WST_UNICODESTRING}
|
||||
unicodeStrData : UnicodeString;
|
||||
{$ENDIF WST_UNICODESTRING}
|
||||
begin
|
||||
CheckScope();
|
||||
Case ATypeInfo^.Kind Of
|
||||
@ -1242,6 +1334,18 @@ begin
|
||||
strData := string(AData);
|
||||
dataBuffer := strData;
|
||||
end;
|
||||
tkWString :
|
||||
begin
|
||||
wideStrData := WideString(AData);
|
||||
dataBuffer := wideStrData;
|
||||
end;
|
||||
{$IFDEF WST_UNICODESTRING}
|
||||
tkUString :
|
||||
begin
|
||||
unicodeStrData := UnicodeString(AData);
|
||||
dataBuffer := unicodeStrData;
|
||||
end;
|
||||
{$ENDIF WST_UNICODESTRING}
|
||||
tkClass :
|
||||
begin
|
||||
raise EXmlRpcException.Create('Inner Scope value must be a "simple type" value.');
|
||||
@ -1331,6 +1435,10 @@ Var
|
||||
enumData : TEnumIntType;
|
||||
floatDt : Extended;
|
||||
recObject : Pointer;
|
||||
{$IFDEF WST_UNICODESTRING}
|
||||
unicodeStrData : UnicodeString;
|
||||
{$ENDIF WST_UNICODESTRING}
|
||||
wideStrData : WideString;
|
||||
begin
|
||||
Case ATypeInfo^.Kind Of
|
||||
tkInt64{$IFDEF FPC},tkQWord{$ENDIF} :
|
||||
@ -1345,6 +1453,20 @@ begin
|
||||
GetStr(ATypeInfo,AName,strData);
|
||||
String(AData) := strData;
|
||||
End;
|
||||
{$IFDEF WST_UNICODESTRING}
|
||||
tkUString :
|
||||
begin
|
||||
unicodeStrData := '';
|
||||
GetUnicodeStr(ATypeInfo,AName,unicodeStrData);
|
||||
UnicodeString(AData) := unicodeStrData;
|
||||
end;
|
||||
{$ENDIF WST_UNICODESTRING}
|
||||
tkWString :
|
||||
begin
|
||||
wideStrData := '';
|
||||
GetWideStr(ATypeInfo,AName,wideStrData);
|
||||
WideString(AData) := wideStrData;
|
||||
end;
|
||||
tkClass :
|
||||
Begin
|
||||
objData := TObject(AData);
|
||||
@ -1429,6 +1551,10 @@ begin
|
||||
tkQWord : QWord(AData) := StrToInt64Def(Trim(dataBuffer),0);
|
||||
{$ENDIF}
|
||||
tkLString{$IFDEF FPC},tkAString{$ENDIF} : string(AData) := dataBuffer;
|
||||
tkWString : WideString(AData) := dataBuffer;
|
||||
{$IFDEF WST_UNICODESTRING}
|
||||
tkUString : UnicodeString(AData) := dataBuffer;
|
||||
{$ENDIF WST_UNICODESTRING}
|
||||
tkClass :
|
||||
begin
|
||||
raise EXmlRpcException.Create('Inner Scope value must be a "simple type" value.');
|
||||
|
@ -30,7 +30,11 @@ Type
|
||||
TInt64S = Int64; TInt64U = QWord;
|
||||
TBoolData = Boolean;
|
||||
TEnumData = Int64;
|
||||
TStringData = AnsiString;
|
||||
TAnsiStringData = AnsiString;
|
||||
TWideStringData = WideString;
|
||||
{$IFDEF WST_UNICODESTRING}
|
||||
TUnicodeStringData = UnicodeString;
|
||||
{$ENDIF WST_UNICODESTRING}
|
||||
|
||||
TFloat_Single_4 = Single;
|
||||
TFloat_Double_8 = Double;
|
||||
@ -53,7 +57,11 @@ Type
|
||||
|
||||
procedure WriteBool(Const AData : TBoolData);
|
||||
procedure WriteEnum(Const AData : TEnumData);
|
||||
procedure WriteStr(Const AData : TStringData);
|
||||
procedure WriteAnsiStr(Const AData : TAnsiStringData);
|
||||
procedure WriteWideStr(Const AData : TWideStringData);
|
||||
{$IFDEF WST_UNICODESTRING}
|
||||
procedure WriteUnicodeStr(Const AData : TUnicodeStringData);
|
||||
{$ENDIF WST_UNICODESTRING}
|
||||
|
||||
procedure WriteSingle(Const AData : TFloat_Single_4);
|
||||
procedure WriteDouble(Const AData : TFloat_Double_8);
|
||||
@ -78,7 +86,11 @@ Type
|
||||
|
||||
function ReadBool():TBoolData;
|
||||
function ReadEnum():TEnumData;
|
||||
function ReadStr():TStringData;
|
||||
function ReadAnsiStr():TAnsiStringData;
|
||||
function ReadWideStr():TWideStringData;
|
||||
{$IFDEF WST_UNICODESTRING}
|
||||
function ReadUnicodeStr():TUnicodeStringData;
|
||||
{$ENDIF WST_UNICODESTRING}
|
||||
|
||||
function ReadSingle():TFloat_Single_4;
|
||||
function ReadDouble():TFloat_Double_8;
|
||||
@ -89,6 +101,7 @@ Type
|
||||
function CreateBinaryReader(AStream : TStream):IDataStoreReader;{$IFDEF USE_INLINE}inline;{$ENDIF}
|
||||
function CreateBinaryWriter(AStream : TStream):IDataStore;{$IFDEF USE_INLINE}inline;{$ENDIF}
|
||||
|
||||
{These routines transform their argument to "Big Endian" alignment}
|
||||
procedure ReverseBytes(var AData; const ALength : Integer);{$IFDEF USE_INLINE}{$IFDEF ENDIAN_BIG}inline;{$ENDIF}{$ENDIF}
|
||||
function Reverse_16(const AValue:Word):Word;{$IFDEF USE_INLINE}inline;{$ENDIF}
|
||||
function Reverse_32(const AValue:DWord):DWord;{$IFDEF USE_INLINE}inline;{$ENDIF}
|
||||
@ -164,6 +177,26 @@ begin
|
||||
ReverseBytes(Result,8);
|
||||
end;
|
||||
|
||||
{$IFDEF ENDIAN_BIG}
|
||||
procedure Reverse_Array(var AValue; const AArrayLength, AItemSize : PtrInt);{$IFDEF USE_INLINE}inline;{$ENDIF}
|
||||
begin
|
||||
end;
|
||||
{$ELSE ENDIAN_BIG}
|
||||
procedure Reverse_Array(var AValue; const AArrayLength, AItemSize : PtrInt);
|
||||
var
|
||||
p : PByte;
|
||||
i : PtrInt;
|
||||
begin
|
||||
if ( AArrayLength > 0 ) and ( AItemSize > 1 ) then begin
|
||||
p := @AValue;
|
||||
for i := 0 to Pred(AArrayLength) do begin
|
||||
ReverseBytes(p^,AItemSize);
|
||||
Inc(p,AItemSize);
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
{$ENDIF ENDIAN_BIG}
|
||||
|
||||
Type
|
||||
{ TDataStore }
|
||||
|
||||
@ -185,7 +218,11 @@ Type
|
||||
|
||||
procedure WriteBool(Const AData : TBoolData);
|
||||
procedure WriteEnum(Const AData : TEnumData);
|
||||
procedure WriteStr(Const AData : TStringData);
|
||||
procedure WriteAnsiStr(Const AData : TAnsiStringData);
|
||||
procedure WriteWideStr(Const AData : TWideStringData);
|
||||
{$IFDEF WST_UNICODESTRING}
|
||||
procedure WriteUnicodeStr(Const AData : TUnicodeStringData);
|
||||
{$ENDIF WST_UNICODESTRING}
|
||||
|
||||
procedure WriteSingle(Const AData : TFloat_Single_4);
|
||||
procedure WriteDouble(Const AData : TFloat_Double_8);
|
||||
@ -216,8 +253,12 @@ Type
|
||||
|
||||
function ReadBool():TBoolData;
|
||||
function ReadEnum():TEnumData;
|
||||
function ReadStr():TStringData;
|
||||
|
||||
function ReadAnsiStr():TAnsiStringData;
|
||||
function ReadWideStr():TWideStringData;
|
||||
{$IFDEF WST_UNICODESTRING}
|
||||
function ReadUnicodeStr():TUnicodeStringData;
|
||||
{$ENDIF WST_UNICODESTRING}
|
||||
|
||||
function ReadSingle():TFloat_Single_4;
|
||||
function ReadDouble():TFloat_Double_8;
|
||||
function ReadExtended():TFloat_Extended_10;
|
||||
@ -344,7 +385,7 @@ begin
|
||||
WriteInt64S(AData);
|
||||
end;
|
||||
|
||||
procedure TDataStore.WriteStr(const AData: TStringData);
|
||||
procedure TDataStore.WriteAnsiStr(const AData: TAnsiStringData);
|
||||
Var
|
||||
i : TInt32S;
|
||||
begin
|
||||
@ -354,6 +395,52 @@ begin
|
||||
FStream.Write(AData[1],i);
|
||||
end;
|
||||
|
||||
procedure TDataStore.WriteWideStr(const AData: TWideStringData);
|
||||
|
||||
procedure LocalWrite();
|
||||
var
|
||||
locData : TWideStringData;
|
||||
begin
|
||||
locData := AData;
|
||||
UniqueString(locData);
|
||||
Reverse_Array(Pointer(locData)^,Length(locData),SizeOf(WideChar));
|
||||
FStream.Write(Pointer(locData)^, ( Length(locData) * SizeOf(WideChar) ) );
|
||||
end;
|
||||
|
||||
var
|
||||
i : TInt32S;
|
||||
begin
|
||||
i := Length(AData);
|
||||
WriteInt32S(i);
|
||||
if ( i > 0 ) then begin
|
||||
LocalWrite();
|
||||
end;
|
||||
end;
|
||||
|
||||
{$IFDEF WST_UNICODESTRING}
|
||||
procedure TDataStore.WriteUnicodeStr(const AData: TUnicodeStringData);
|
||||
|
||||
procedure LocalWrite();
|
||||
var
|
||||
locData : TUnicodeStringData;
|
||||
begin
|
||||
locData := AData;
|
||||
UniqueString(locData);
|
||||
Reverse_Array(Pointer(locData)^,Length(locData),SizeOf(UnicodeChar));
|
||||
FStream.Write(Pointer(locData)^, ( Length(locData) * SizeOf(UnicodeChar) ) );
|
||||
end;
|
||||
|
||||
var
|
||||
i : TInt32S;
|
||||
begin
|
||||
i := Length(AData);
|
||||
WriteInt32S(i);
|
||||
if ( i > 0 ) then begin
|
||||
LocalWrite();
|
||||
end;
|
||||
end;
|
||||
{$ENDIF WST_UNICODESTRING}
|
||||
|
||||
{
|
||||
procedure TDataStore.WriteSingle(const AData: TFloat_Single_4);
|
||||
begin
|
||||
@ -476,7 +563,7 @@ begin
|
||||
Result := ReadInt64S();
|
||||
end;
|
||||
|
||||
function TDataStoreReader.ReadStr(): TStringData;
|
||||
function TDataStoreReader.ReadAnsiStr(): TAnsiStringData;
|
||||
Var
|
||||
i : TInt32S;
|
||||
begin
|
||||
@ -486,6 +573,32 @@ begin
|
||||
FStream.ReadBuffer(Result[1],i);
|
||||
end;
|
||||
|
||||
function TDataStoreReader.ReadWideStr(): TWideStringData;
|
||||
var
|
||||
i : TInt32S;
|
||||
begin
|
||||
i := ReadInt32S();
|
||||
SetLength(Result,i);
|
||||
if ( i > 0 ) then begin
|
||||
FStream.ReadBuffer(Pointer(Result)^, ( i * SizeOf(WideChar) ) );
|
||||
Reverse_Array(Pointer(Result)^,i,SizeOf(WideChar));
|
||||
end;
|
||||
end;
|
||||
|
||||
{$IFDEF WST_UNICODESTRING}
|
||||
function TDataStoreReader.ReadUnicodeStr(): TUnicodeStringData;
|
||||
var
|
||||
i : TInt32S;
|
||||
begin
|
||||
i := ReadInt32S();
|
||||
SetLength(Result,i);
|
||||
if ( i > 0 ) then begin
|
||||
FStream.ReadBuffer(Pointer(Result)^, ( i * SizeOf(UnicodeChar) ) );
|
||||
Reverse_Array(Pointer(Result)^,i,SizeOf(UnicodeChar));
|
||||
end;
|
||||
end;
|
||||
{$ENDIF WST_UNICODESTRING}
|
||||
|
||||
function TDataStoreReader.ReadSingle(): TFloat_Single_4;
|
||||
begin
|
||||
FStream.Read(Result,SizeOf(Result));
|
||||
|
@ -166,7 +166,7 @@ end;
|
||||
procedure THTTPTransport.SendAndReceive(ARequest, AResponse: TStream);
|
||||
{$IFDEF WST_DBG}
|
||||
Var
|
||||
s : string;
|
||||
s : TBinaryString;
|
||||
i : Int64;
|
||||
{$ENDIF WST_DBG}
|
||||
begin
|
||||
|
@ -17,7 +17,7 @@ interface
|
||||
|
||||
uses
|
||||
Classes, SysUtils,
|
||||
service_intf, imp_utils, base_service_intf,
|
||||
service_intf, imp_utils, base_service_intf, wst_types,
|
||||
WSocket;
|
||||
|
||||
|
||||
@ -161,9 +161,9 @@ procedure TTCPTransport.SendAndReceive(ARequest, AResponse: TStream);
|
||||
Var
|
||||
wrtr : IDataStore;
|
||||
buffStream : TMemoryStream;
|
||||
strBuff : string;
|
||||
strBuff : TBinaryString;
|
||||
{$IFDEF WST_DBG}
|
||||
s : string;
|
||||
s : TBinaryString;
|
||||
i : Int64;
|
||||
{$ENDIF WST_DBG}
|
||||
begin
|
||||
@ -171,13 +171,13 @@ begin
|
||||
Try
|
||||
wrtr := CreateBinaryWriter(buffStream);
|
||||
wrtr.WriteInt32S(0);
|
||||
wrtr.WriteStr(Target);
|
||||
wrtr.WriteStr(ContentType);
|
||||
wrtr.WriteStr(Self.Format);
|
||||
wrtr.WriteAnsiStr(Target);
|
||||
wrtr.WriteAnsiStr(ContentType);
|
||||
wrtr.WriteAnsiStr(Self.Format);
|
||||
SetLength(strBuff,ARequest.Size);
|
||||
ARequest.Position := 0;
|
||||
ARequest.Read(strBuff[1],Length(strBuff));
|
||||
wrtr.WriteStr(strBuff);
|
||||
wrtr.WriteAnsiStr(strBuff);
|
||||
buffStream.Position := 0;
|
||||
wrtr.WriteInt32S(buffStream.Size-4);
|
||||
|
||||
|
@ -120,13 +120,13 @@ begin
|
||||
try
|
||||
wrtr := CreateBinaryWriter(buffStream);
|
||||
wrtr.WriteInt32S(0);
|
||||
wrtr.WriteStr(Target);
|
||||
wrtr.WriteStr(ContentType);
|
||||
wrtr.WriteStr(Self.Format);
|
||||
wrtr.WriteAnsiStr(Target);
|
||||
wrtr.WriteAnsiStr(ContentType);
|
||||
wrtr.WriteAnsiStr(Self.Format);
|
||||
SetLength(strBuff,ARequest.Size);
|
||||
ARequest.Position := 0;
|
||||
ARequest.Read(strBuff[1],Length(strBuff));
|
||||
wrtr.WriteStr(strBuff);
|
||||
wrtr.WriteAnsiStr(strBuff);
|
||||
buffStream.Position := 0;
|
||||
wrtr.WriteInt32S(buffStream.Size-4);
|
||||
buffStream.Position := 0;
|
||||
|
@ -26,10 +26,7 @@ uses
|
||||
//IdTCPServer,
|
||||
{$ENDIF}
|
||||
IdSocketHandle,
|
||||
server_listener;
|
||||
|
||||
{$INCLUDE wst.inc}
|
||||
{$INCLUDE wst_delphi.inc}
|
||||
server_listener, wst_types;
|
||||
|
||||
const
|
||||
sSERVER_PORT = 1234;
|
||||
@ -139,7 +136,7 @@ var
|
||||
locInStream, locOutStream : TMemoryStream;
|
||||
wrtr : IDataStore;
|
||||
rdr : IDataStoreReader;
|
||||
buff, trgt,ctntyp, frmt : string;
|
||||
buff, trgt,ctntyp, frmt : TBinaryString;
|
||||
rqst : IRequestBuffer;
|
||||
i : PtrUInt;
|
||||
begin
|
||||
@ -157,10 +154,10 @@ begin
|
||||
{$ENDIF}
|
||||
if ( ReadInputBuffer(locInStream) >= SizeOf(LongInt) ) then begin
|
||||
rdr := CreateBinaryReader(locInStream);
|
||||
trgt := rdr.ReadStr();
|
||||
ctntyp := rdr.ReadStr();
|
||||
frmt := rdr.ReadStr();
|
||||
buff := rdr.ReadStr();
|
||||
trgt := rdr.ReadAnsiStr();
|
||||
ctntyp := rdr.ReadAnsiStr();
|
||||
frmt := rdr.ReadAnsiStr();
|
||||
buff := rdr.ReadAnsiStr();
|
||||
|
||||
{$IFDEF WST_DBG}
|
||||
WriteLn(buff);
|
||||
@ -178,7 +175,7 @@ begin
|
||||
locOutStream.Read(buff[1],i);
|
||||
locOutStream.Size := 0;
|
||||
wrtr := CreateBinaryWriter(locOutStream);
|
||||
wrtr.WriteStr(buff);
|
||||
wrtr.WriteAnsiStr(buff);
|
||||
locOutStream.Position := 0;
|
||||
{$IFDEF INDY_10}
|
||||
AContext.Connection.IOHandler.Write(locOutStream,locOutStream.Size,False);
|
||||
|
Reference in New Issue
Block a user