123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258 |
- {
- This file is part of the Free Component library.
- Copyright (c) 2005 by Michael Van Canneyt, member of
- the Free Pascal development team
- Debugserver client interface, based on SimpleIPC
- See the file COPYING.FPC, included in this distribution,
- for details about the copyright.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- **********************************************************************}
- {$mode objfpc}
- {$h+}
- unit dbugintf;
- interface
- Type
- TDebugLevel = (dlInformation,dlWarning,dlError);
- procedure SendBoolean(const Identifier: string; const Value: Boolean);
- procedure SendDateTime(const Identifier: string; const Value: TDateTime);
- procedure SendInteger(const Identifier: string; const Value: Integer; HexNotation: Boolean = False);
- procedure SendPointer(const Identifier: string; const Value: Pointer);
- procedure SendDebugEx(const Msg: string; MType: TDebugLevel);
- procedure SendDebug(const Msg: string);
- procedure SendMethodEnter(const MethodName: string);
- procedure SendMethodExit(const MethodName: string);
- procedure SendSeparator;
- procedure SendDebugFmt(const Msg: string; const Args: array of const);
- procedure SendDebugFmtEx(const Msg: string; const Args: array of const; MType: TDebugLevel);
- { low-level routines }
- Function StartDebugServer : integer;
- Procedure InitDebugClient;
- Const
- SendError : String = '';
- ResourceString
- SProcessID = 'Process %s';
- SEntering = '> Entering ';
- SExiting = '< Exiting ';
- SSeparator = '>-=-=-=-=-=-=-=-=-=-=-=-=-=-=-<';
- implementation
- Uses
- SysUtils, classes,msgintf, process, simpleipc;
- Const
- DmtInformation = lctInformation;
- DmtWarning = lctWarning;
- DmtError = lctError;
- ErrorLevel : Array[TDebugLevel] of integer
- = (dmtInformation,dmtWarning,dmtError);
- IndentChars = 2;
-
- var
- DebugClient : TSimpleIPCClient = nil;
- MsgBuffer : TMemoryStream = Nil;
- ServerID : Integer;
- Indent : Integer = 0;
-
- Procedure WriteMessage(Const Msg : TDebugMessage);
- begin
- MsgBuffer.Seek(0,soFrombeginning);
- WriteDebugMessageToStream(MsgBuffer,Msg);
- DebugClient.SendMessage(mtUnknown,MsgBuffer);
- end;
- procedure SendDebugMessage(Var Msg : TDebugMessage);
- begin
- try
- If (DebugClient=Nil) then
- InitDebugClient;
- if (Indent>0) then
- Msg.Msg:=StringOfChar(' ',Indent)+Msg.Msg;
- WriteMessage(Msg);
- except
- On E : Exception do
- SendError:=E.Message;
- end;
- end;
- procedure SendBoolean(const Identifier: string; const Value: Boolean);
- Const
- Booleans : Array[Boolean] of string = ('False','True');
- begin
- SendDebugFmt('%s = %s',[Identifier,Booleans[value]]);
- end;
- procedure SendDateTime(const Identifier: string; const Value: TDateTime);
- begin
- SendDebugFmt('%s = %s',[Identifier,DateTimeToStr(Value)]);
- end;
- procedure SendInteger(const Identifier: string; const Value: Integer; HexNotation: Boolean = False);
- Const
- Msgs : Array[Boolean] of string = ('%s = %d','%s = %x');
- begin
- SendDebugFmt(Msgs[HexNotation],[Identifier,Value]);
- end;
- procedure SendPointer(const Identifier: string; const Value: Pointer);
- begin
- SendDebugFmt('%s = %p',[Identifier,Value]);
- end;
- procedure SendDebugEx(const Msg: string; MType: TDebugLevel);
- Var
- Mesg : TDebugMessage;
- begin
- Mesg.MsgTimeStamp:=Now;
- Mesg.MsgType:=ErrorLevel[MTYpe];
- Mesg.Msg:=Msg;
- SendDebugMessage(Mesg);
- end;
- procedure SendDebug(const Msg: string);
- Var
- Mesg : TDebugMessage;
- begin
- Mesg.MsgTimeStamp:=Now;
- Mesg.MsgType:=dmtInformation;
- Mesg.Msg:=Msg;
- SendDebugMessage(Mesg);
- end;
- procedure SendMethodEnter(const MethodName: string);
- begin
- SendDebug(SEntering+MethodName);
- inc(Indent,IndentChars);
- end;
- procedure SendMethodExit(const MethodName: string);
- begin
- Dec(Indent,IndentChars);
- If (Indent<0) then
- Indent:=0;
- SendDebug(SExiting+MethodName);
- end;
- procedure SendSeparator;
- begin
- SendDebug(SSeparator);
- end;
- procedure SendDebugFmt(const Msg: string; const Args: array of const);
- Var
- Mesg : TDebugMessage;
- begin
- Mesg.MsgTimeStamp:=Now;
- Mesg.MsgType:=dmtInformation;
- Mesg.Msg:=Format(Msg,Args);
- SendDebugMessage(Mesg);
- end;
- procedure SendDebugFmtEx(const Msg: string; const Args: array of const; MType: TDebugLevel);
- Var
- Mesg : TDebugMessage;
- begin
- Mesg.MsgTimeStamp:=Now;
- Mesg.MsgType:=ErrorLevel[mType];
- Mesg.Msg:=Format(Msg,Args);
- SendDebugMessage(Mesg);
- end;
- function StartDebugServer : Integer;
- begin
- With TProcess.Create(Nil) do
- Try
- CommandLine:='debugserver';
- Execute;
- Result:=ProcessID;
- Finally
- Free;
- end;
- end;
- procedure FreeDebugClient;
- Var
- msg : TDebugMessage;
- begin
- try
- If (DebugClient<>Nil) and
- (DebugClient.ServerRunning) then
- begin
- Msg.MsgType:=lctStop;
- Msg.MsgTimeStamp:=Now;
- Msg.Msg:=Format(SProcessID,[ApplicationName]);
- WriteMessage(Msg);
- end;
- FreeAndNil(MsgBuffer);
- FreeAndNil(DebugClient);
- except
- end;
- end;
- Procedure InitDebugClient;
- Var
- msg : TDebugMessage;
- I : Integer;
-
- begin
- DebugClient:=TSimpleIPCClient.Create(Nil);
- DebugClient.ServerID:=DebugServerID;
- If not DebugClient.ServerRunning then
- begin
- ServerID:=StartDebugServer;
- I:=0;
- While (I<10) and not DebugClient.ServerRunning do
- begin
- Inc(I);
- Sleep(100);
- end;
- end;
- DebugClient.Connect;
- MsgBuffer:=TMemoryStream.Create;
- Msg.MsgType:=lctIdentify;
- Msg.MsgTimeStamp:=Now;
- Msg.Msg:=Format(SProcessID,[ApplicationName]);
- WriteMessage(Msg);
- end;
- Initialization
- Finalization
- FreeDebugClient;
- end.
|