unit uRpcLogEntry;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, TRpcb;
type
TDisplayFormat = (dfFormatFullWithoutClientName,dfFormatFullWithClientName,
dfFormatForList);
TMyString = class(TObject)
private
FString: String;
public
Constructor Create(Str: String);
procedure Append(Str: String);
function ToString: String;
end;
TRpcLogEntry = class(TObject)
private
mUniqueClientId: Integer;
mClientName: String;
mConnectionIndex: Integer;
mContext: String;
mUniqueId: Integer; // unique rpc id
mRpcName: String;
mRpcParamsString: String;
mRpcResults: String;
mRpcEndDateTime: Double;
mRpcDuration: Integer;
mRpcParams: TParams;
protected
procedure SetParamsString(Value: String);
public
Constructor Create; overload;
Constructor Create(uniqueClientId: Integer; clientName: String;
connectionIndex: Integer; rpcUniqueId: Integer; rpcEndDateTime: Double;
rpcDuration: Integer; context, rpcName, rpcParams, rpcResults: String); overload;
property StrResults: String read mRpcResults write mRpcResults;
property EndDateTime: double read mRpcEndDateTime write mRpcEndDateTime;
property Duration: Integer read mRpcDuration write mRpcDuration;
property Params: TParams read mRpcParams;
property UniqueClientId: Integer read mUniqueClientId write mUniqueClientId;
property ClientName: String read mClientName write mClientName;
property ConnectionIndex: Integer read mConnectionIndex write mConnectionIndex;
property UniqueId: Integer read mUniqueId write mUniqueId;
property Context: String read mContext write mContext;
property Name: String read mRpcName write mRpcName;
property ParamsString: String read mRpcParamsString write SetParamsString;
function CreateDisplayString(format: TDisplayFormat): String;
function ToString: String;
function CreateClipboardString: String;
function CreateParamsDisplayString: String;
function CreateResultsDisplayString: String;
end;
const
kHeaderStartTag: String = '________________________RPC START____________________';
kRpcTag: String = 'RPC>'#09#09#09;
kRpcDebugIdTag: String = 'RPC DEBUG ID>'#09;
kClientNameTag: String = 'CLIENT NAME>'#09#09;
kClientDebugIdTag: String = 'CLIENT DEBUG ID>'#09;
kContextTag: String = 'CONTEXT>'#09#09;
kDurationTag: String = 'DURATION>'#09#09;
// kTimeDateTag: String = 'END TIME>'#09#09;
kParamsTag: String = '________________________PARAMS_______________________';
kResultsTag: String = '________________________RESULTS______________________';
kHeaderEndTag: String = '________________________RPC END______________________';
function PosNext(SubString: String; CurStart: Integer; S: String): Integer;
implementation
function PosNext(SubString: string; CurStart: Integer; S: String): Integer;
var
Str1: String;
begin
Str1 := Copy(S,CurStart,Length(S));
Result := CurStart + Pos(SubString,Str1)-1;
end;
function TMyString.ToString: string;
begin
Result := FString;
end;
procedure TMyString.Append(Str: string);
begin
FString := FString + Str;
end;
constructor TMyString.Create(Str: string);
begin
FString := Str;
end;
procedure TRpcLogEntry.SetParamsString(Value: string);
begin
mRpcParamsString := value;
// TODO:
// now break the string into a string array and
// shove it into the Params
// Just rebuild the mParams
if (mRpcParams <> nil) then
begin
mRpcParams.Free;
mRpcParams := nil;
end;
mRpcParams := TParams.Create(Application);
// mRpcParams.
end;
///
/// Summary description for RpcLogEntry.
///
Constructor TRpcLogEntry.Create;
begin
inherited;
end;
Constructor TRpcLogEntry.Create(uniqueClientId: Integer; clientName: String;
connectionIndex: Integer; rpcUniqueId: Integer; rpcEndDateTime: Double;
rpcDuration: Integer; context, rpcName, rpcParams, rpcResults: String);
begin
mUniqueClientId := uniqueClientId;
mClientName := clientName;
if (context = '') then
mContext := ''
else
mContext := context;
mConnectionIndex := connectionIndex;
mUniqueId := rpcUniqueId;
if (rpcName = '') then
mrpcName := ''
else
mrpcName := rpcName;
if(rpcParams = '') then
mrpcParamsString := ''
else
mrpcParamsString := rpcParams;
if(rpcResults = '') then
mrpcResults := ''
else
mrpcResults := rpcResults;
mRpcEndDateTime := rpcEndDateTime;
mRpcDuration := rpcDuration;
end;
function TRpcLogEntry.ToString: String;
begin
Result := CreateDisplayString(dfFormatForList);
end;
///
/// CreateDisplayString returns a string with the rpc params
/// formated based on the DisplayFormat format
///
///
///
///
const
kInitialStringBuilderSize: Integer = 1000;
kNamePad: Integer = 31;
krpcIdPad: Integer = 5;
kcIdpad: Integer = 7;
kDurationPad: Integer = 3;
kLiteral: String = 'literal';
kReference: String = 'reference';
kList: String = 'list';
kUndefined: String = 'undefined';
function TRpcLogEntry.CreateDisplayString(format: TDisplayFormat): String;
var
ResultVal: TMyString;
begin
ResultVal := TMyString.Create('');
case (format) of
dfFormatFullWithClientName:
begin
ResultVal.Append(kHeaderStartTag);
ResultVal.Append(#13#10 + kRpcTag + Name);
ResultVal.Append(#13#10 + kRpcDebugIdTag + IntToStr(UniqueId));
ResultVal.Append(#13#10 + kClientNameTag + ClientName);
ResultVal.Append(#13#10 + kClientDebugIdTag + IntToStr(UniqueClientId));
ResultVal.Append(#13#10 + kContextTag + Context);
ResultVal.Append(#13#10 + kDurationTag + IntToStr(Duration) + 'ms');
//ResultVal.Append(#13#10 + kTimeDateTag + EndDateTime);
ResultVal.Append(#13#10 + kParamsTag + CreateParamsDisplayString);
ResultVal.Append(#13#10 + kResultsTag + CreateResultsDisplayString);
ResultVal.Append(#13#10 + kHeaderEndTag);
end;
dfFormatForList:
begin
// ResultVal.Append(Name+#09rpcId:='+UniqueId+#09cId:='+UniqueClientId+' time:='+Duration+'ms '+ClientName);
{ if(Duration < 1)
durationStr := '<1'
else
durationStr := Duration.ToString();
ResultVal.Append( Name.PadRight(kNamePad)+
' cId:='+UniqueClientId.ToString().PadRight(kcIdpad)+
' time:='+duration.PadLeft(kDurationPad)+'ms'+
' rpcId:='+UniqueId.ToString().PadRight(krpcIdPad)+
ClientName);
}
end;
else
begin
ResultVal.Append(kHeaderStartTag);
ResultVal.Append(#13#10 + kRpcTag + Name);
ResultVal.Append(#13#10 + kRpcDebugIdTag + IntToStr(UniqueId));
//ResultVal.Append(#13#10 + kClientNameTag + ClientName);
//ResultVal.Append(#13#10 + kClientDebugIdTag + UniqueClientId);
ResultVal.Append(#13#10 + kContextTag + Context);
ResultVal.Append(#13#10 + kDurationTag + IntToStr(Duration) + 'ms');
//ResultVal.Append(#13#10 + kTimeDateTag + EndDateTime);
ResultVal.Append(#13#10 + kParamsTag + CreateParamsDisplayString());
ResultVal.Append(#13#10 + kResultsTag + CreateResultsDisplayString());
ResultVal.Append(#13#10 + kHeaderEndTag);
// Default case is FormatFullWithoutClientName
end;
end;
Result := ResultVal.ToString();
end;
function TRpcLogEntry.CreateClipboardString: String;
var
ResultVal: TMyString;
begin
ResultVal := TMyString.Create('');
ResultVal.Append(kHeaderStartTag);
ResultVal.Append(#13#10#13#10+kRpcTag+Name);
ResultVal.Append(#13#10+kRpcDebugIdTag+ IntToStr(UniqueId));
ResultVal.Append(#13#10+kClientNameTag+ClientName);
ResultVal.Append(#13#10+kClientDebugIdTag+ IntToStr(UniqueClientId));
ResultVal.Append(#13#10+kContextTag+Context);
ResultVal.Append(#13#10+kDurationTag+ IntToStr(Duration));
ResultVal.Append(#13#10#13#10+kParamsTag+#13#10);
ResultVal.Append(CreateParamsDisplayString);
ResultVal.Append(#13#10#13#10+kResultsTag+#13#10);
ResultVal.Append(CreateResultsDisplayString);
ResultVal.Append(#13#10#13#10+kHeaderEndTag+#13#10#13#10);
Result := ResultVal.ToString();
end;
// const char kSEP_FS = (char)28;
const kSEP_GS: String = #29;
const kSEP_US: String = #30;
const kSEP_RS: String = #31;
function TRpcLogEntry.CreateParamsDisplayString: String;
var
Str: String;
Chr: Char;
Chr1: String;
TypeStr{, x, y}: String;
ResultVal: TMyString;
i, {j,} CurrStart: Integer;
LengthOfRpcParams: Integer;
EndOfSegment: Integer;
ARef, AVal: String;
Str2: String;
begin
ResultVal := TMyString.Create('');
LengthOfRpcParams := Length(mRpcParamsString);
if LengthOfRpcParams > 0 then
begin
Str := mRpcParamsString;
CurrStart := 1;
i := 1;
// for i:=0 to Pred(Params.Count) do
while CurrStart < LengthOfRpcParams do
begin
Chr1 := Copy(Str,CurrStart,1);
Chr := PChar(Chr1)^;
case Chr of //
'L': typeStr := kLiteral;
'R': typeStr := kReference;
'M': typeStr := kList;
else typeStr := kUndefined ;
end; // case
if i <> 1 then
ResultVal.Append(#13#10);
ResultVal.Append(TypeStr+#9);
CurrStart := CurrStart + 2;
if TypeStr = kList then
begin
EndOfSegment := 0;
while Copy(Str,CurrStart,1) <> kSep_GS do
begin
EndOfSegment := PosNext(kSep_US,CurrStart,Str);
ARef := Copy(Str,CurrStart,EndOfSegment-CurrStart);
CurrStart := EndOfSegment + 1;
EndOfSegment := PosNext(kSep_RS,CurrStart,Str);
AVal := Copy(Str,CurrStart,EndOfSegment-CurrStart);
CurrStart := EndOfSegment + 1;
ResultVal.Append(#13#10#9+ARef+#9+AVal);
Str2 := #13#10#9+Aref+#9+Aval;
Aval := Str2;
end; // while
if EndOfSegment = 0 then
EndOfSegment := PosNext(kSep_GS,CurrStart,Str);
CurrStart := EndOfSegment + 1;
end
else
begin
EndOfSegment := PosNext(kSEP_GS,CurrStart,Str);
ResultVal.Append(Copy(Str,CurrStart,EndOfSegment-CurrStart));
CurrStart := EndOfSegment + 1;
end;
Inc(i);
end; // while
end;
{
else
Assert(False);
}
{
if (i<>0) then
ResultVal.Append(#13#10);
ResultVal.Append(typeStr+#09+Params[i].Value);
if (Params[i].PType = List) then
begin
for j:=0 to Pred(Params[i].Mult.Count) do
begin
x := Params[i].Mult.Subscript(j);
y := Params[i].Mult[x];
ResultVal.Append(#13#10#09+'('+x+'):='+y);
end
end
end;
}
Result := ResultVal.ToString;
end;
function TRpcLogEntry.CreateResultsDisplayString: String;
begin
Result := StrResults;
end;
end.