This is an example of a self contained Trace Handler object. It checks for the existence of a text file called TracingOn.txt and if found will install itself at run time and a trace file will be created. Any trace statements coded in to the application will be output to this trace file.
Copy and paste the source in to a new RDMLX reusable part. Save and compile.
Function Options(*DIRECT)
Begin_Com Role(*EXTENDS #PRIM_OBJT *implements #prim_app.iTraceHandler)
Define Field(#FilHandle) Type(*dec) Length(3) Decimals(0)
Define_Com Class(#prim_alph) Name(#Tab)
Evtroutine Handling(#Com_Owner.CreateInstance)
#Tab := (09).asChar
#Com_owner.InstallTracing
Endroutine
Mthroutine Name(InstallTracing) Help('Plug in the trace handler to the Application') Access(*private)
* This example uses a text file as the trigger to implement user tracing.
* Alternately you might consider using a registry entry
If (#Com_owner.FileExists( (*Sys_dir + "TracingOn.txt") ))
* Set this object as the system help handler
#Sys_appln.TraceHandler <= #Com_owner
Endif
Endroutine
Mthroutine Name(Initialize) Options(*redefine) Access(*private)
#Com_owner.OpenTraceFile
Endroutine
Mthroutine Name(Terminate) Options(*redefine) Access(*private)
#Com_owner.CloseTraceFile
Endroutine
Mthroutine Name(TraceMessage) Help('Executed whenever #sys_appln.TraceMessageData or #sys_appln.TraceMessageText is used') Options(*redefine) Access(*private)
#Com_owner.WriteToFile( #ComponentName #Description #LineNumber #MessageText )
Endroutine
Mthroutine Name(OpenTraceFile) Help('Create a new trace outputfile') Access(*private)
Use Builtin(Stm_File_Open) With_Args(#Com_owner.GetNextFile Append N Y) To_Get(#FilHandle #io$sts)
Endroutine
Mthroutine Name(WriteToFile) Help('Write an entry in the trace output file') Access(*private)
Define_Map For(*Input) Class(#prim_alph) Name(#ComponentName)
Define_Map For(*Input) Class(#prim_alph) Name(#Description)
Define_Map For(*Input) Class(#prim_nmbr) Name(#LineNumber)
Define_Map For(*Input) Class(#prim_alph) Name(#MessageText)
Define_Com Class(#prim_Dat) Name(#Now)
#MessageText := #Now.now.AsLocalizedDateTime.AsString + #Tab + #ComponentName + #Tab + #LineNumber.asstring + #Tab + #MessageText
Use Builtin(Stm_File_Write) With_Args(#FilHandle #MessageText) To_Get(#io$sts)
Endroutine
Mthroutine Name(CloseTraceFile) Access(*private)
Use Builtin(Stm_File_Close) With_Args(#FilHandle) To_Get(#io$sts)
Endroutine
Mthroutine Name(TracingState) Options(*redefine)
#MessageTracingActive := True
Endroutine
Mthroutine Name(GetNextFile) Access(*Private)
Define_Map For(*Result) Class(#Prim_alph) Name(#Result)
Define_Com Class(#prim_nmbr) Name(#Extension)
Begin_Loop Using(#Extension)
#Result := *Sys_dir + "UserTrace" + "." + #Extension.asstring.rightAdjust( 3 "0" )
Leave If(*Not #Com_owner.FileExists( #Result ))
End_Loop
Endroutine
Mthroutine Name(FileExists) Access(*private)
Define_Map For(*input) Class(#prim_alph) Name(#Path)
Define_Map For(*result) Class(#prim_boln) Name(#Result)
Use Builtin(OV_FILE_SERVICE) With_Args(Check_File #Path) To_Get(#io$sts)
#Result := (#io$sts = OK)
Endroutine
End_Com