Project

General

Profile

Statistics
| Revision:

vdfsplat / AppSrc / cDebuggerEngine.pkg @ 64

History | View | Annotate | Download (32.9 KB)

1
//TH-Header
2
//*****************************************************************************************
3
// Copyright (c)  2013 Antwise Solutions
4
// All rights reserved.
5
//
6
// $FileName    : cDebuggerEngine
7
// $ProjectName : Splat ! Vdf Debugger
8
// $Authors     : Wil van Antwerpen
9
// $Created     : 12.14.2013  23:42
10
// $Type        : GPLv2
11
//
12
// Contents:
13
//
14
//*****************************************************************************************
15
//TH-RevisionStart
16
//TH-RevisionEnd
17

    
18
Use cIniFile.pkg
19
use VDFBase.pkg
20
Use vdfdebug.pkg
21
Use vWin32fh.pkg
22

    
23
Struct tBreakPoints
24
  Boolean  bEnabled
25
  String   sFileName
26
  UInteger iLine
27
  Boolean  bHasCondition
28
  String   sExpression
29
  String   sLine
30
End_Struct // tBreakPoints
31

    
32
//
33
// This mixin makes sure that all of the components sync up to the
34
// correct debugger version by asking the main component what vdf
35
// version it is.
36
//
37
Class cDebugComponentMixin is a Mixin
38

    
39
  Procedure DetermineRuntimeVersion
40
    Integer iRuntimeVersion
41
    Handle  hoDebugger
42
    
43
    Get phoDebugger To hoDebugger
44
    If (hoDebugger) Begin
45
      Get piRuntimeVersion of hoDebugger To iRuntimeVersion
46
      Set piRuntimeVersion to iRuntimeVersion
47
    End
48
  End_Procedure // DetermineRuntimeVersion
49
  
50
End_Class // cDebugComponentMixin
51

    
52

    
53
Class cCallStack is a cComCCallStack
54
  Import_Class_Protocol cDebugComponentMixin
55
  
56
  Procedure Construct_Object
57
    Forward Send Construct_Object
58
    
59
    Send Construct_Object_Callback
60
  End_Procedure // Construct_Object
61
  
62
  //
63
  // Mechanism to have the ability to set normal properties for the object
64
  // in the parent object view.
65
  //
66
  Procedure Construct_Object_Callback
67
    Handle hoParent
68
    Handle hoSelf
69
    
70
    Move Self To hoSelf
71
    Set phoCallStack     To hoSelf
72
    Get phoCallStackHost To hoParent // parent object
73
    If (hoParent) Begin
74
      Send CreateObjectCallback of hoParent hoSelf
75
    End
76
  End_Procedure // Construct_Object_Callback
77

    
78
// None of the below is being used
79
//
80
//  Procedure Mouse_Click Integer iWindows Integer iPos
81
//    send info_box ("call stack"+trim(iWindows)*"("*trim(iPos))
82
//    Forward Send Mouse_Click iWindows iPos
83
//  End_Procedure // Mouse_Click
84
//
85
//  Procedure Mouse_Click2 Integer iWindows Integer iPos
86
//    Send info_box ("call TWO stack"+trim(iWindows)*"("*trim(iPos))
87
//    Forward Send Mouse_Click2 iWindows iPos
88
//  End_Procedure // Mouse_Click
89
//
90
//  Procedure OnClick
91
//    Send info_box ("call THREE stack")
92
//    //Forward Send Mouse_Click2 iWindows iPos
93
//  End_Procedure // Mouse_Click
94
//
95
//  Procedure Mouse_Down integer iWindowNumber integer iPosition
96
//    Send info_box ("call THREE stack")
97
//      forward send Mouse_Down iWindowNumber iPosition
98
//      //send DoSomething of oMyObject
99
//  End_Procedure  // Mouse_Down
100
//
101
//   Procedure OnComMessageClicked UInteger llcommandNo
102
//     Send info_box ("call four stack")
103
//   End_Procedure
104
  
105
   //Procedure RepaintCallStack
106
   //  Handle hWindow hVoid
107
   //  Get Window_Handle To hWindow
108
   //  If hWindow Move (InvalidateRect(hWindow,0,True)) To hVoid
109
   //End_Procedure // RepaintCallStack
110

    
111
//
112
// entering is being called, not yet found a way on getting the items in the list
113
//
114
  Procedure Entering Returns Integer
115
    Integer Rval
116
    Integer iItem
117
    Integer iCount
118
    
119
    Forward Get Msg_Entering To Rval  // Do Normal Entering
120
    // if entering is ok and single item check shadow state of that item.
121
    If (Rval=0) Begin
122
//      Get Item_Count To iCount
123
//      Get Current_Item To iItem
124
//      Showln ("entering stack "+trim(iCount)*"current"*trim(iItem))
125
      //  Get Shadow_State Item 0 To Rval
126
    End
127
    Procedure_Return Rval
128
  End_Procedure
129
  
130
End_Class // cCallStack
131

    
132
Class cMessageTrace is a cComCMessageTrace
133
  Import_Class_Protocol cDebugComponentMixin
134

    
135
  Procedure Construct_Object
136
    Forward Send Construct_Object
137
    
138
    Send Construct_Object_Callback
139
  End_Procedure // Construct_Object
140

    
141
  
142
  //
143
  // Mechanism to have the ability to set normal properties for the object
144
  // in the parent object view.
145
  //
146
  Procedure Construct_Object_Callback
147
    Handle hoParent
148
    Handle hoSelf
149
    
150
    Move Self To hoSelf
151
    Set phoTrace     To hoSelf
152
    Get phoTraceHost To hoParent // parent object
153
    If (hoParent) Begin
154
      Send CreateObjectCallback of hoParent hoSelf
155
    End
156
  End_Procedure // Construct_Object_Callback
157

    
158
        
159
  Procedure OnComMessageClicked UInteger llcommandNo
160
    Handle  hoDebugger
161
    Handle  hoEditor
162
    Integer iLine
163
    String  sFileName
164
    
165
    //send info_box ("OnComMessageClicked "*trim(llcommandNo))
166
    Get phoDebugger To hoDebugger
167
    Get phoEditor   To hoEditor
168
    If (hoDebugger and hoEditor and llcommandNo>0) Begin
169
      // Returns the source line from the specified command number
170
      //
171
      Get ComGetSourceLineFromCommand Of hoDebugger llcommandNo (&iLine) To sFileName
172
      //Send ComOpenFile of oCodeMax sFileName
173
      ////Set ComLanguage    of oCodeMax To "VDF"
174
      //Set ComReadOnly Of oCodeMax To True // NO changes allowed
175
      //Set ComColorSyntax of oCodeMax To True
176
      //Send doSetCaptionLabel sFileName
177
      Send doOpenSourceFileAtLine Of hoEditor sFileName iLine
178
      //If (iLine>10) Begin
179
      //  Move (iLine-4) To iLine // scroll up a bit
180
      //End
181
      //Send ComSetTopIndex of oCodeMax 0 iLine
182
      //send info_box ("OnComMessageClicked "*trim(llline)*sFileName)
183
    End
184
  End_Procedure
185
  
186
End_Class // cMessageTrace
187

    
188
Class cTablesWindow is a cComCTablesWindow
189
  Import_Class_Protocol cDebugComponentMixin
190

    
191
  Procedure Construct_Object
192
    Forward Send Construct_Object
193
    
194
    Send Construct_Object_Callback
195
  End_Procedure // Construct_Object
196

    
197
  
198
  //
199
  // Mechanism to have the ability to set normal properties for the object
200
  // in the parent object view.
201
  //
202
  Procedure Construct_Object_Callback
203
    Handle hoParent
204
    Handle hoSelf
205
    
206
    Move Self To hoSelf
207
    Set phoTablesWindow To hoSelf
208
    Get phoTablesHost   To hoParent // parent object
209
    If (hoParent) Begin
210
      Send CreateObjectCallback of hoParent hoSelf
211
    End
212
  End_Procedure // Construct_Object_Callback
213
  
214
  Procedure OnComCmdAddWatch String llsExpression
215
    Handle hoWatches
216
    
217
    Get phoWatches To hoWatches
218
    If (hoWatches) Begin
219
      Send ComAddWatch Of hoWatches llsExpression
220
    End
221
  End_Procedure // OnComCmdAddWatch
222
End_Class // cTablesWindow
223

    
224
Class cVariablesWindow is a cComCVariablesWindow
225
  Import_Class_Protocol cDebugComponentMixin
226

    
227
  Procedure Construct_Object
228
    Forward Send Construct_Object
229
  End_Procedure // Construct_Object
230
     
231
  Procedure OnComCmdAddWatch String llsExpression
232
    Handle hoWatches
233
    
234
    Get phoWatches To hoWatches
235
    If (hoWatches) Begin
236
      Send ComAddWatch Of hoWatches llsExpression
237
    End
238
  End_Procedure // OnComCmdAddWatch
239
  
240
End_Class // cVariablesWindow
241

    
242

    
243
Class cWatches is a cComCWatches
244
  Import_Class_Protocol cDebugComponentMixin
245

    
246
  Procedure Construct_Object
247
    Forward Send Construct_Object
248
    
249
    Send Construct_Object_Callback
250
  End_Procedure // Construct_Object
251

    
252
  
253
  //
254
  // Mechanism to have the ability to set normal properties for the object
255
  // in the parent object view.
256
  //
257
  Procedure Construct_Object_Callback
258
    Handle hoParent
259
    Handle hoSelf
260
    
261
    Move Self To hoSelf
262
    Set phoWatches     To hoSelf
263
    Get phoWatchesHost To hoParent // parent object
264
    If (hoParent) Begin
265
      Send CreateObjectCallback of hoParent hoSelf
266
    End
267
  End_Procedure // Construct_Object_Callback
268

    
269

    
270
End_Class // cWatches
271

    
272

    
273
Class cDebuggerEngine is a cComCDebuggerEngine
274
  Procedure Construct_Object
275
    Forward Send Construct_Object
276
    Property String         psApplicationFileName ""
277
    Property String         psIdeSrcPath          ""
278
    Property String         psBPFileName          "Splat-Breakpoints.ini"
279
    Property Boolean        pbEngineActive        False
280
    Property Boolean pbProgramStarted      False
281
    Property Boolean pbProgramPaused       False
282
    Property Boolean pbLimitedBreakMode    False
283
    Property Boolean pbDebugRestart        False
284
    Property String[]       pAllMessages
285
    Property String[]       pAllProperties
286
    Property String[]       pLanguageKeywords
287
    Property tBreakPoints[] pBreakPoints
288
    
289
    Set Name To "oDebuggerEngine"
290
  End_Procedure // Construct_Object
291

    
292
  
293
  Procedure DetermineRuntimeVersion
294
    Integer iRuntime
295
    
296
    Get piDebugfileVersion to iRuntime
297
    Set piRuntimeVersion   to iRuntime
298
  End_Procedure // DetermineRuntimeVersion
299

    
300
    // Hackish way to determine the IdeSrc folder
301
  Procedure LocateIdeSrcFolder String sApplication
302
    String  sIdeSrcPath
303
    String  sFolderName
304
    String  sWSPath
305
    Boolean bExists
306
    
307
    Move "" To sIdeSrcPath
308
    If (sApplication<>"") Begin
309
      Get ParseFolderName sApplication To sFolderName
310
      Get vParentPath sFolderName To sWSPath
311
      Get vFolderFormat sWSPath To sWSPath
312
      Move (sWSPath+"IdeSrc\") To sIdeSrcPath
313
      Get vFolderExists sIdeSrcPath To bExists
314
      If (bExists=false) Begin
315
        Move "" To sIdeSrcPath
316
        Send Info_Box ("Not able to find IdeSrc Path from folder:\n"+sFoldername+"Some features such as load/save breakpoints will not work.") "Info"
317
      End
318
    End
319
    Set psIdeSrcPath To sIdeSrcPath
320
  End_Procedure
321
  
322
  Procedure Set ApplicationFileName String sApplication
323
    Set psApplicationFileName To sApplication
324
    Send LocateIdeSrcFolder sApplication
325
  End_Procedure
326
  //
327
  // Enumeraties the all messages array as it has all properties as well.
328
  // A property has 2 items in the array.
329
  // First a "get_<property name>"
330
  // followed up by a "set_<property name>"
331
  //
332
  // We simply create the array with "<property name>" based on what we find.
333
  //
334
  // All property names are in lower case (as is the message array)
335
  //
336
  Procedure getAllProperties
337
    Integer  iCount
338
    Integer  iMsg
339
    Integer  iProp
340
    String   sMessage
341
    String[] AllMessages
342
    String[] AllProperties
343

    
344
    Move 0 To iProp
345
    Move (ResizeArray(AllProperties,0)) To AllProperties
346
    Get pAllMessages to AllMessages
347
    Move (SizeOfArray(AllMessages)) To iCount
348
    Decrement iCount
349
    For iMsg from 1 to iCount
350
      if (iMsg<iCount) begin
351
        if (left(AllMessages[iMsg],4)="get_") Begin
352
          Move AllMessages[iMsg] To sMessage
353
          Move (replace("get_",sMessage,"set_")) To sMessage
354
          If (AllMessages[iMsg+1]=sMessage) Begin
355
            Move (replace("set_",sMessage,"")) To sMessage
356
            Move sMessage To AllProperties[iProp]
357
            Increment iProp
358
          End
359
          Else If (AllMessages[iMsg-1]=sMessage) Begin
360
            Move (replace("set_",sMessage,"")) To sMessage
361
            Move sMessage To AllProperties[iProp]
362
            Increment iProp
363
          End
364
        End
365
      End
366
    Loop
367
    // Add functions safe to evaluate. we'll do this different later on.. now testing
368
    // and the idea works.. hmmm :D
369
    Move "selectedrow" to AllProperties[iProp]
370
    Set pAllProperties to AllProperties
371
  End_Procedure
372
  
373
  Function IsLanguageKeyword String sKeyword Returns Boolean
374
    Boolean  bIsKeyword
375
    Integer  iCount
376
    Integer  iKeyword
377
    String[] Keywords
378
    
379
    Move false to bIsKeyword
380
    Move (lowercase(sKeyWord)) To sKeyword
381
    If (sKeyword<>"") Begin
382
      Get pLanguageKeywords To Keywords
383
      Move (SizeOfArray(Keywords)) To iCount
384
      Decrement iCount
385
      For iKeyWord From 0 To iCount
386
        If (Keywords[iKeyword]=sKeyword) Begin
387
          Move True To bIsKeyword
388
          Move iCount To iKeyword // stop
389
        End
390
      Loop
391
    End
392
    Function_Return bIsKeyword
393
  End_Function
394
  
395
  Function IsVariableProperty String sVariable Returns Boolean
396
    Integer  iCount
397
    Integer  iProp
398
    Boolean  bIsProperty
399
    String[] AllProperties
400
    
401
    Move false to bisProperty
402
    Move (lowercase(sVariable)) To sVariable
403
    If (sVariable<>"") Begin
404
      Get pAllProperties to AllProperties
405
      Move (SizeOfArray(AllProperties)) To iCount
406
      Decrement iCount
407
      For iProp From 0 To iCount
408
        If (AllProperties[iProp]=sVariable) Begin
409
          Move True To bIsProperty
410
          Move iCount To iProp // stop
411
        End
412
      Loop
413
    End
414
    Function_Return bIsProperty
415
  End_function
416
  
417
  Function IsVariableProcedure String sVariable Returns Boolean
418
    Integer  iCount
419
    Integer  iMethod
420
    Boolean  bIsMethod
421
    String[] AllMessages
422
    
423
    Move false to bisMethod
424
    Move (lowercase(sVariable)) To sVariable
425
    If (sVariable<>"") Begin
426
      Move ("msg_"+sVariable) to sVariable
427
      Get pAllMessages to AllMessages
428
      Move (SizeOfArray(AllMessages)) To iCount
429
      Decrement iCount
430
      For iMethod From 0 To iCount
431
        If (AllMessages[iMethod]=sVariable) Begin
432
          Move True To bIsMethod
433
          Move iCount To iMethod // stop
434
        End
435
      Loop
436
    End
437
    Function_Return bIsMethod
438
  End_Function
439
  
440
  //
441
  // This will treat functions and properties both as function, so first
442
  // test if the variable isn't a property to exclude that.
443
  //
444
  Function IsVariableFunction String sVariable Returns Boolean
445
    Integer  iCount
446
    Integer  iMethod
447
    Boolean  bIsMethod
448
    String[] AllMessages
449
    
450
    Move false to bisMethod
451
    Move (lowercase(sVariable)) To sVariable
452
    If (sVariable<>"") Begin
453
      Move ("get_"+sVariable) to sVariable
454
      Get pAllMessages to AllMessages
455
      Move (SizeOfArray(AllMessages)) To iCount
456
      Decrement iCount
457
      For iMethod From 0 To iCount
458
        If (AllMessages[iMethod]=sVariable) Begin
459
          Move True To bIsMethod
460
          Move iCount To iMethod // stop
461
        End
462
      Loop
463
    End
464
    Function_Return bIsMethod
465
  End_Function
466
  
467
  Procedure UpdateBreakPointsGrid
468
    Handle  hoGrid
469
    
470
    Get phoBreakpointsGrid To hoGrid
471
    If (hoGrid) Begin
472
      Send LoadData Of hoGrid
473
    End
474
  End_Procedure
475
  
476
  //
477
  // Tries to find the breakpoint in the array, returns -1 if not found
478
  //
479
  Function FindBreakPointinArray String sFile Uinteger iLine Returns integer
480
    Integer iPos
481
    Integer iBreak
482
    Integer iCount
483
    tBreakPoints[] BP
484
    
485
    Move -1 To iPos
486
    Get pBreakPoints To BP
487
    Move (Lowercase(sFile)) To sFile
488
    Move (SizeOfArray(BP)) To iCount
489
    For iBreak from 0 To (iCount-1)
490
      If (lowercase(BP[iBreak].sFileName)=sFile and BP[iBreak].iLine=iLine) Begin
491
        Move iBreak To iPos
492
        Move iCount To iBreak // stop
493
      End
494
    Loop
495
    Function_Return iPos
496
  End_Function
497

    
498

    
499
  Procedure AddBreakPointToArray String sFile UInteger iLine
500
    Integer iCount
501
    Integer iBreak
502
    String  sLine
503
    Handle  hoEditor
504
    tBreakPoints[] BP
505
    
506
    Get FindBreakPointInArray sFile iLine To iBreak
507
    If (iBreak=-1) Begin
508
      Get pBreakPoints To BP
509
      Move (SizeOfArray(BP)) To iCount
510
      Move True   To BP[iCount].bEnabled
511
      Move sFile  To BP[iCount].sFileName
512
      Move iline  To BP[iCount].iLine
513
      Move false  To BP[iCount].bHasCondition
514
      
515
      Get phoEditor To hoEditor
516
      If (hoEditor) begin
517
        Get ComGetLine of hoEditor iLine To sLine
518
        Move (Rtrim(sLine)) To sLine
519
        Move sLine To BP[iCount].sLine
520
      End
521
      Set pBreakPoints To BP
522
    End
523
  End_Procedure
524

    
525

    
526
  Procedure EnableBreakPoint String sFile UInteger iLine
527
    Integer iBreak
528
    Integer retVal
529
    tBreakPoints[] BP
530
    
531
    Get FindBreakPointInArray sFile iLine To iBreak
532
    If (iBreak<>-1) Begin
533
      Get pBreakPoints To BP
534
      If (BP[iBreak].bEnabled=false) Begin
535
        Move True   To BP[iBreak].bEnabled
536
        Get ComSetBreakPoint sFile iLine to retVal
537
        
538
        Set pBreakPoints To BP
539
        
540
        Send UpdateBreakPointsGrid
541
      End
542
    End
543
  End_Procedure
544

    
545

    
546
  Procedure DisableBreakPoint String sFile UInteger iLine
547
    Integer retVal
548
    Integer iBreak
549
    tBreakPoints[] BP
550
    
551
    Get FindBreakPointInArray sFile iLine To iBreak
552
    If (iBreak<>-1) Begin
553
      Get pBreakPoints To BP
554
      If (BP[iBreak].bEnabled) Begin
555
        Move False   To BP[iBreak].bEnabled
556
        Get ComRemoveBreakPoint sFile iLine to retVal
557
        Set pBreakPoints To BP
558
      
559
        Send UpdateBreakPointsGrid
560
      End
561
    End
562
  End_Procedure
563
  
564
  Procedure RemoveBreakPointFromArray integer iPos
565
    Integer iCount
566
    tBreakPoints[] BP
567

    
568
    If (iPos>-1) Begin
569
      Get pBreakPoints To BP
570
      Move (SizeOfArray(BP)) To iCount
571
      If (iPos<iCount) Begin
572
        Move (RemoveFromArray(BP,iPos)) To BP
573
        Set pBreakPoints To BP
574
      End
575
    End
576
  End_Procedure
577

    
578

    
579
  // Sets the specified breakpoint
580
  Function SetBreakPoint String llfile UInteger ByRef llline Returns Boolean
581
    Boolean retVal
582
    Integer iLine
583
    
584
    Move llline To iLine
585
    Get ComSetBreakPoint llfile (&llline) to retVal
586
    If (retVal) Begin
587
      Send AddBreakPointToArray llfile iLine
588
      
589
      Send UpdateBreakPointsGrid
590
    End
591
    Function_Return retVal
592
  End_Function
593

    
594
  // Removes the specified breakpoint
595
  Function RemoveBreakPoint String llfile UInteger llline Returns Boolean
596
    Integer iPos
597
    Boolean retVal
598
    
599
    Get ComRemoveBreakPoint llfile llline to retVal
600
    If (retVal) Begin
601
      Get FindBreakPointInArray llfile llline To iPos
602
      Send RemoveBreakPointFromArray iPos
603
      
604
      Send UpdateBreakPointsGrid
605
    End
606
    Function_Return retVal
607
  End_Function
608

    
609

    
610
  // Introduced in vdf15.0
611
  // Sets the specified conditional breakpoint expression
612
  Function SetBreakPointCondition String llfile UInteger ByRef llline String llexpr Returns Boolean
613
    Boolean retVal
614
    
615
    Get ComSetBreakPointCondition llfile (&llline) llexpr to retVal
616
    If (retVal) Begin
617
    End
618
    Function_Return retVal
619
  End_Function
620
  
621
  //
622
  // Loads the breakpoints from the array that got loaded from a disk file.
623
  //
624
  Procedure SetBreakPointsFromArray
625
    Integer  iBreak
626
    Integer  iCount
627
    String   sFileName
628
    UInteger iLine
629
    Boolean  retVal
630
    Boolean  bEnabled
631
    Boolean  bIsValid
632
    tBreakPoints[] BP
633
    
634
    Get pBreakPoints To BP
635
    Move (SizeOfArray(BP)) To iCount
636
    For iBreak from 0 To (iCount-1)
637
      Move BP[iBreak].bEnabled  To bEnabled
638
      If (bEnabled) Begin
639
        Move BP[iBreak].sFileName To sFileName
640
        Move BP[iBreak].iLine     To iLine
641
        Get ComIsValidSourceFile sFileName To bIsValid
642
        If (bIsValid) Begin
643
          Get ComSetBreakPoint sFileName (&iLine) to retVal
644
        End
645
      End
646
    Loop
647
  End_Procedure // SetBreakPointsFromArray
648
  
649
  Function HasBreakPoints Returns Boolean
650
    Integer  iCount
651
    Boolean  bHasBreakPoints
652
    tBreakPoints[] BP
653
    
654
    Get pBreakPoints To BP
655
    Move (SizeOfArray(BP)) To iCount
656
    If (iCount>0) Move True To bHasBreakPoints
657
    Else Move False To bHasBreakPoints
658
    Function_Return bHasBreakPoints
659
  End_Function
660
  
661
  Procedure LoadBreakPointsFromDisk
662
    Boolean bExists
663
    Integer iVoid
664
    Integer iPos
665
    Integer iBreak
666
    Integer iCount
667
    String  sPath
668
    String  sBPFile
669
    String  sSection
670
    String  sKey
671
    String  sValue
672
    Handle  hoSections
673
    Handle  hoIni
674
    tBreakPoints[] BP
675
    
676
    Get psIdeSrcPath To sPath
677
    If (sPath<>"") Begin     // Only try to save if we could find a matching IdeSrc path
678
      Get psBPFileName To sBPFile
679
      Get vFolderFormat sPath To sPath
680
      Move (sPath+sBPFile) to sBPFile
681

    
682
      Get Create (RefClass(cIniFile)) To hoIni
683
      If (hoIni) Begin
684
        Set psFileName of hoIni To sBPFile
685
        Get Create (RefClass(Array)) To hoSections
686
        If (hoSections) Begin
687
          Send ReadSections of hoIni hoSections
688
          Get Item_Count of hoSections To iCount
689
          For iBreak from 0 To (iCount-1)
690
            Get Value of hoSections Item iBreak To sSection
691
            //Move ("Breakpoint"+trim(iBreak)) To sSection
692
            Get ReadString of hoIni sSection "Enabled"      "0" To BP[iBreak].bEnabled
693
            Get ReadString of hoIni sSection "FileName"     ""  To BP[iBreak].sFileName
694
            Get ReadString of hoIni sSection "Line"         "0" To BP[iBreak].iLine
695
            Get ReadString of hoIni sSection "Source"       ""  To BP[iBreak].sLine
696
            Get ReadString of hoIni sSection "HasCondition" "0" To BP[iBreak].bHasCondition
697
            Get ReadString of hoIni sSection "Expression"   ""  To BP[iBreak].sExpression
698
          Loop
699
          Send Destroy of hoSections
700
        End
701
           
702
        Send Destroy of hoIni
703
      End
704
      Set pBreakPoints To BP
705
      Send SetBreakPointsFromArray
706
//      Move (SizeOfArray(BP)) To iCount
707
    End
708
  End_Procedure
709
  
710
  Procedure SaveBreakPointsToDisk
711
    Boolean bExists
712
    Integer iVoid
713
    Integer iPos
714
    Integer iBreak
715
    Integer iCount
716
    String  sPath
717
    String  sBPFile
718
    String  sSection
719
    String  sKey
720
    String  sValue
721
    Handle  hoIni
722
    tBreakPoints[] BP
723
    
724
    Get psIdeSrcPath To sPath
725
    If (sPath<>"") Begin     // Only try to save if we could find a matching IdeSrc path
726
      Get psBPFileName To sBPFile
727
      Get vFolderFormat sPath To sPath
728
      Move (sPath+sBPFile) to sBPFile
729
      // If it exists already, then delete it.
730
      Get vFilePathExists sBPFile To bExists
731
      If (bExists) Begin
732
        Get vDeleteFile sBPFile To iVoid
733
      End
734
      Get Create (RefClass(cIniFile)) To hoIni
735
      If (hoIni) Begin
736
        Set psFileName of hoIni To sBPFile
737
               
738
        
739
        Get pBreakPoints To BP
740
        Move (SizeOfArray(BP)) To iCount
741
        For iBreak from 0 To (iCount-1)
742
          Move ("Breakpoint"+trim(iBreak)) To sSection
743
          Send WriteString of hoIni sSection "Enabled"      BP[iBreak].bEnabled
744
          Send WriteString of hoIni sSection "FileName"     BP[iBreak].sFileName
745
          Send WriteString of hoIni sSection "Line"         BP[iBreak].iLine
746
          Send WriteString of hoIni sSection "Source"       BP[iBreak].sLine
747
          Send WriteString of hoIni sSection "HasCondition" BP[iBreak].bHasCondition
748
          Send WriteString of hoIni sSection "Expression"   BP[iBreak].sExpression
749
        Loop
750
           
751
        Send Destroy of hoIni
752
        
753
        // ToDo: Remove
754
        //Send info_Box "saved breakpoints"
755
      End
756
    End
757
  End_Procedure
758
  
759
  // Introduced in vdf15.0
760
  // Occurs if there was an error evaluating a conditional breakpoint
761
  Procedure OnComBreakPointError String lltext
762
    Send Info_Box lltext "VdfSplat Info Error on conditional breakpoint"
763
  End_Procedure
764

    
765

    
766
  // Occurs after program has been successfully initialized
767
  Procedure OnComProgramInit
768
    String[] AllMessages
769
    Set pbProgramStarted To True
770
    Set pbProgramPaused  To False
771

    
772
    Get ComGetAllMessages To AllMessages
773
    Set pAllMessages To AllMessages
774
    Send GetAllProperties
775
    Send LoadBreakPointsFromDisk
776
  End_Procedure
777

    
778
  // Occurs after the program exits
779
  Procedure OnComProgramExit
780
    Boolean  bStartedFromCLI
781
    Boolean  bRestartMode
782
    String[] Empty
783
    Set pbProgramStarted To False
784
    Set pbProgramPaused  To False
785
    Send SaveBreakPointsToDisk
786
    Set ApplicationFileName To ""
787
    Move (ResizeArray(Empty,0))   To Empty
788
    Set pAllMessages      To Empty
789
    Set pAllProperties    To Empty
790
    Set pLanguageKeywords To Empty
791
    Get pbDebugRestart to bRestartMode
792
    If (bRestartMode) Begin
793
      Send DoDebugRun
794
    End
795
    Else Begin
796
      Get pbStartedFromCLI of ghoApplication To bStartedFromCLI
797
      If (bStartedFromCli) Begin
798
        // debug session was started from the command line.
799
        // Stopping the debug session normally should stop the debugger as well.
800
        Send Exit_Application
801
      End
802
    End
803
  End_Procedure
804

    
805
  // Occurs if there is an error starting the program
806
  Procedure OnComProgramStartupError String llerrorMessage
807
    Set pbProgramStarted To False
808
    Send Info_Box llerrorMessage "start up error"
809
  End_Procedure
810

    
811
  // Occurs if there is an error initializing the program
812
  Procedure OnComProgramInitError String llerrorMessage
813
    Set pbProgramStarted To False
814
    Send Info_Box (llErrorMessage) "Custom Error INIT"
815
  End_Procedure
816
  
817
  Procedure SetDebuggerAsForegroundApp
818
    Handle  hoEditor
819
    Handle  hWnd
820
    Integer iVoid
821
    Get phoEditor To hoEditor
822
    If (hoEditor) Begin
823
      Get Window_Handle of hoEditor To hWnd
824
      If (hWnd) Begin
825
        Move (SetForegroundWindow(hWnd)) To iVoid
826
      End
827
    End
828
  End_Procedure // SetDebuggerAsForegroundApp
829
  
830
  //
831
  // Hook to be used
832
  // Called from OnComProgramPaused
833
  //
834
  // Occurs when the program execution is paused
835
  Procedure OnProgramPaused String llfile UInteger llline Boolean lllimitedBreakMode
836
    Handle hoEditor
837
    String sBreakMode
838
    
839
    Get phoEditor   To hoEditor
840
    If (hoEditor) Begin
841
      If lllimitedBreakMode Begin
842
        Move "limited Break mode" To sBreakMode
843
        //Else Move "Unlimited Break mode" to sBreakMode
844
        Send info_Box ("Pausing program\n"+sBreakMode) "VdfSplat Info"
845
      End
846
      Else Begin
847
        Send SetDebuggerAsForegroundApp
848
      End
849
      Send doOpenSourceFileAtLine of hoEditor llfile llline
850
      Send doActivateDebugPanels  // only displays if exists or not.
851
    End
852
  End_Procedure
853
  
854
  //
855
  // Occurs when the program execution is paused
856
  Procedure OnComProgramPaused String llfile UInteger llline Boolean lllimitedBreakMode
857
    Set pbProgramPaused    To True
858
    Set pbLimitedBreakMode To lllimitedBreakMode
859
    Send OnProgramPaused llfile llline lllimitedBreakMode
860
  End_Procedure
861

    
862
  // Occurs when the program execution resumes
863
  Procedure OnComProgramContinue
864
    Set pbProgramPaused    To False
865
    Set pbLimitedBreakMode To False
866
  End_Procedure
867

    
868
  // Occurs after a change requiring views to be refreshed
869
  Procedure OnUpdateView String sFileName UInteger iLine
870
    Handle hoEditor
871
    
872
    Get phoEditor To hoEditor
873
    If (hoEditor) begin
874
      //Send Info_Box "OnComUpdateView" (llfile*"llline = "*trim(llline))
875
      Send doOpenSourceFileAtLine of hoEditor sFileName iLine
876
    End
877
  End_Procedure
878

    
879
  // Occurs after a change requiring views to be refreshed
880
  Procedure OnComUpdateView String sFileName UInteger iLine
881
    Send OnUpdateView sFileName iLine
882
  End_Procedure
883

    
884
  // Occurs when a new message is executed
885
  Procedure OnComNewMessage Integer llbSteppin
886
  End_Procedure
887

    
888
  // Occurs if an unhandled program exception is detected
889
  Procedure OnComUnhandledProgramException String lldescription
890
    Send Info_box lldescription "FATAL Error"
891
  End_Procedure
892

    
893
  // Occurs if there is an incoming request for another web app session. You can abandon the current session and switch to the new session or deny the new session and continue debugging the current session
894
  Procedure OnComAcceptWebAppSession Boolean ByRef llacceptNewSession
895
  End_Procedure
896

    
897
  // Occurs if there is a fatal web app error
898
  Procedure OnComWebAppError String lldescription
899
    Send Info_box lldescription "WebApp FATAL Error"
900
  End_Procedure
901

    
902
  // Occurs when a new webapp event log entry is added
903
  Procedure OnComWebAppLog Integer lleventId String lltext
904
    //Send Info_box lldescription "WebApp FATAL Error"
905
    Showln lleventid lltext
906
  End_Procedure
907
  
908
  Procedure AddKeyword String sWord
909
    Integer  iCount
910
    String[] Keywords
911
    
912
    Get pLanguageKeywords To Keywords
913
    Move (SizeOfArray(Keywords)) To iCount
914
    Move (Lowercase(sWord)) To Keywords[iCount]
915
    Set pLanguageKeywords To Keywords
916
  End_Procedure
917
  
918
  // Language keywords are not evaluated in the tooltip
919
  Procedure AddLanguageKeywords
920
    Send AddKeyword "End_Function"
921
    Send AddKeyword "End_Procedure"
922
    Send AddKeyword "Function"
923
    Send AddKeyword "Move"
924
    Send AddKeyword "Procedure"
925
    Send AddKeyword "Send"
926
    Send AddKeyword "Showln"
927
    Send AddKeyword "To"
928
    Send AddKeyword "UChar[]"
929
  End_Procedure
930

    
931
  
932
  Procedure doCreateCallStack
933
    Handle  hoParent
934
    Handle  hoCallStack
935
    Boolean bCreated
936

    
937
    Get phoCallStackHost To hoParent
938
    If (hoParent) Begin
939
      Get Create Of hoParent U_cCallStack To hoCallStack
940
      If (hoCallStack) Begin
941
        Set Name               Of hoCallStack To "oCallStack"
942
        Send CreateComObject   Of hoCallStack
943
        Get IsComObjectCreated Of hoCallStack To bCreated
944
        If (bCreated) Begin
945
          Send SetControlColumnWidth of hoCallStack hoCallStack
946
        End
947
      End
948
    End
949
  End_Procedure // doCreateCallStack
950

    
951
  
952
  Procedure doCreateWatches
953
    Handle  hoParent
954
    Handle  hoWatches
955
    Boolean bCreated
956

    
957
    Get phoWatchesHost To hoParent
958
    If (hoParent) Begin
959
      Get Create Of hoParent U_cWatches To hoWatches
960
      If (hoWatches) Begin
961
        Set Name               Of hoWatches To "oWatches"
962
        Send CreateComObject   Of hoWatches
963
        Get IsComObjectCreated Of hoWatches To bCreated
964
        If (bCreated) Begin
965
        End
966
      End
967
    End
968
  End_Procedure // doCreateWatches
969

    
970
  
971
  Procedure doCreateMessageTrace
972
    Handle  hoParent
973
    Handle  hoTrace
974
    Boolean bCreated
975

    
976
    Get phoTraceHost To hoParent
977
    If (hoParent) Begin
978
      Get Create Of hoParent U_cMessageTrace To hoTrace
979
      If (hoTrace) Begin
980
        Set Name               Of hoTrace To "oMessageTrace"
981
        Send CreateComObject   Of hoTrace
982
        Get IsComObjectCreated Of hoTrace To bCreated
983
        If (bCreated) Begin
984
        End
985
      End
986
    End
987
  End_Procedure // doCreateMessageTrace
988

    
989
  
990
  Procedure doCreateGlobalVariables
991
    Handle  hoParent
992
    Handle  hoVariables
993
    Boolean bCreated
994

    
995
    Get phoGlobalVarHost To hoParent
996
    If (hoParent) Begin
997
      Get Create Of hoParent U_cVariablesWindow To hoVariables
998
      If (hoVariables) Begin
999
        Set phoGlobalVariables To hoVariables
1000
        Set Name               Of hoVariables To "oGlobalVariables"
1001
        Send CreateObjectCallback of hoParent hoVariables
1002
        
1003
        Send CreateComObject   Of hoVariables
1004
        Get IsComObjectCreated Of hoVariables To bCreated
1005
        If (bCreated) Begin
1006
          Set ComWindowType Of hoVariables To 1 // global
1007
        End
1008
      End
1009
    End
1010
  End_Procedure // doCreateGlobalVariables
1011

    
1012
  
1013
  Procedure doCreateLocalVariables
1014
    Handle  hoParent
1015
    Handle  hoVariables
1016
    Boolean bCreated
1017

    
1018
    Get phoLocalVarHost To hoParent
1019
    If (hoParent) Begin
1020
      Get Create Of hoParent U_cVariablesWindow To hoVariables
1021
      If (hoVariables) Begin
1022
        Set phoLocalVariables  To hoVariables
1023
        Set Name               Of hoVariables To "oLocalVariables"
1024
        
1025
        Send CreateComObject   Of hoVariables
1026
        Get IsComObjectCreated Of hoVariables To bCreated
1027
        If (bCreated) Begin
1028
          Set ComWindowType Of hoVariables To 0 // locals
1029
        End
1030
        Send CreateObjectCallback of hoParent hoVariables
1031
      End
1032
    End
1033
  End_Procedure // doCreateLocalVariables
1034

    
1035
  
1036
  Procedure doCreateTablesWindow
1037
    Handle  hoParent
1038
    Handle  hoTables
1039
    Boolean bCreated
1040

    
1041
    Get phoTablesHost To hoParent
1042
    If (hoParent) Begin
1043
      Get Create Of hoParent U_cTablesWindow To hoTables
1044
      If (hoTables) Begin
1045
        Set Name               Of hoTables To "oTablesWindow"
1046
        Send CreateComObject   Of hoTables
1047
        Get IsComObjectCreated Of hoTables To bCreated
1048
        If (bCreated) Begin
1049
        End
1050
      End
1051
    End
1052
  End_Procedure // doCreateTables
1053

    
1054

    
1055
  // we MUST send activate to the debug panels to make them display.
1056
  Procedure doActivateDebugPanels
1057
    Handle  hoCallStack
1058
    Handle  hoLocalVars
1059
    Handle  hoGlobalVars
1060
    Boolean bCreated
1061

    
1062
    Get phoCallStack To hoCallStack
1063
    If (hoCallStack) Begin
1064
      Get IsComObjectCreated Of hoCallStack To bCreated
1065
      If (bCreated) Begin
1066
        Send Activate of hoCallStack
1067
      End
1068
    End
1069

    
1070
    Get phoLocalVariables To hoLocalVars
1071
    If (hoLocalVars) Begin
1072
      Get IsComObjectCreated Of hoLocalVars To bCreated
1073
      If (bCreated) Begin
1074
        Send Activate of hoLocalVars
1075
      End
1076
    End
1077

    
1078
    Get phoGlobalVariables To hoGlobalVars
1079
    If (hoGlobalVars) Begin
1080
      Get IsComObjectCreated Of hoGlobalVars To bCreated
1081
      If (bCreated) Begin
1082
        Send Activate of hoGlobalVars
1083
      End
1084
    End
1085
  End_Procedure
1086

    
1087

    
1088
  
1089
  Procedure DoCreateEngine
1090
    Boolean bCreated
1091
    Handle  hoDebugger
1092
    Handle  hoEditor
1093
    
1094
    Send CreateComObject
1095
    Get IsComObjectCreated to bCreated
1096
    If (bCreated) Begin
1097

    
1098
      Move Self To hoDebugger
1099
      Set pbEngineActive To True
1100
      Set phoDebugger to hoDebugger
1101
    End
1102

    
1103
    Send DoCreateCallStack
1104
    
1105
    Send DoCreateWatches
1106
    
1107
    Send DoCreateMessageTrace
1108
    
1109
    Send DoCreateGlobalVariables
1110
    
1111
    Send doCreateLocalVariables
1112
    
1113
    Send doCreateTablesWindow
1114
    
1115
    Send AddLanguageKeywords
1116
  End_Procedure // DoCreateEngine
1117

    
1118
  
1119
  Procedure OnCreate
1120
    forward Send OnCreate
1121
  End_Procedure // OnCreate
1122
  
1123
  
1124
End_Class // cDebuggerEngine