You can subscribe to this list here.
2006 |
Jan
|
Feb
|
Mar
|
Apr
(20) |
May
(48) |
Jun
(8) |
Jul
(23) |
Aug
(41) |
Sep
(42) |
Oct
(22) |
Nov
(17) |
Dec
(36) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2007 |
Jan
(43) |
Feb
(42) |
Mar
(17) |
Apr
(39) |
May
(16) |
Jun
(35) |
Jul
(37) |
Aug
(47) |
Sep
(49) |
Oct
(9) |
Nov
(52) |
Dec
(37) |
2008 |
Jan
(48) |
Feb
(21) |
Mar
(7) |
Apr
(2) |
May
(5) |
Jun
(17) |
Jul
(17) |
Aug
(40) |
Sep
(58) |
Oct
(38) |
Nov
(19) |
Dec
(32) |
2009 |
Jan
(67) |
Feb
(46) |
Mar
(54) |
Apr
(34) |
May
(37) |
Jun
(52) |
Jul
(67) |
Aug
(72) |
Sep
(48) |
Oct
(35) |
Nov
(27) |
Dec
(12) |
2010 |
Jan
(56) |
Feb
(46) |
Mar
(19) |
Apr
(14) |
May
(21) |
Jun
(3) |
Jul
(13) |
Aug
(48) |
Sep
(34) |
Oct
(51) |
Nov
(16) |
Dec
(32) |
2011 |
Jan
(36) |
Feb
(14) |
Mar
(12) |
Apr
(3) |
May
(5) |
Jun
(24) |
Jul
(15) |
Aug
(30) |
Sep
(21) |
Oct
(4) |
Nov
(25) |
Dec
(23) |
2012 |
Jan
(45) |
Feb
(42) |
Mar
(19) |
Apr
(14) |
May
(13) |
Jun
(7) |
Jul
(3) |
Aug
(46) |
Sep
(21) |
Oct
(10) |
Nov
(2) |
Dec
|
2013 |
Jan
(5) |
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
From: <ou...@us...> - 2009-04-22 07:16:17
|
Revision: 2742 http://jcl.svn.sourceforge.net/jcl/?rev=2742&view=rev Author: outchy Date: 2009-04-22 07:16:06 +0000 (Wed, 22 Apr 2009) Log Message: ----------- Unicode compatibility. Reduce the numbers of calls to the subversion executable. Modified Paths: -------------- trunk/thirdparty/svn_cleaner/SvnCleaner.dpr Modified: trunk/thirdparty/svn_cleaner/SvnCleaner.dpr =================================================================== --- trunk/thirdparty/svn_cleaner/SvnCleaner.dpr 2009-04-20 23:18:19 UTC (rev 2741) +++ trunk/thirdparty/svn_cleaner/SvnCleaner.dpr 2009-04-22 07:16:06 UTC (rev 2742) @@ -42,7 +42,8 @@ JclFileUtils, JclSimpleXml, JclSysUtils, - JclAnsiStrings; + JclStrings, + JclStreams; type TSvnProperty = record @@ -118,6 +119,19 @@ end; end; +function FixEndOfLines(const Value: string): string; +var + Lines: TStrings; +begin + Lines := TStringList.Create; + try + StrToStrings(StrReplaceChar(Value, NativeLineFeed, NativeCarriageReturn), NativeCarriageReturn, Lines, False); + Result := StringsToStr(Lines, NativeLineBreak, False); + finally + Lines.Free; + end; +end; + procedure TSvnSettings.LoadFromXml(XmlNode: TJclSimpleXMLElem); function LoadProperty(Elem: TJclSimpleXmlElem): TSvnProperty; var @@ -129,20 +143,26 @@ if not Assigned(NameProp) then raise Exception.Create('no name property'); Result.Name := NameProp.Value; - Result.Value := ''; - for Index := 0 to Elem.Items.Count - 1 do + if Elem.Value <> '' then + Result.Value := FixEndOfLines(Elem.Value) + else begin - ValueElem := Elem.Items.Item[Index]; - if ValueElem.Name = 'value' then + Result.Value := ''; + for Index := 0 to Elem.Items.Count - 1 do begin - if Result.Value = '' then - Result.Value := ValueElem.Value + ValueElem := Elem.Items.Item[Index]; + if ValueElem.Name = 'value' then + begin + if Result.Value = '' then + Result.Value := ValueElem.Value + else + Result.Value := Result.Value + NativeLineBreak + ValueElem.Value; + end else - Result.Value := Result.Value + AnsiLineBreak + ValueElem.Value; - end - else - if ValueElem.Name <> '' then - raise Exception.CreateFmt('unknown item "%s"', [ValueElem.Name]); + if ValueElem.Name <> '' then + raise Exception.CreateFmt('unknown item "%s"', [ValueElem.Name]); + end; + Result.Value := FixEndOfLines(Result.Value); end; end; @@ -176,7 +196,7 @@ MySetting.Path := PathCanonicalize(PathGetRelativePath(GetCurrentDir, MyPath)); Masks := TStringList.Create; try - StrToStrings(MaskProp.Value, AnsiSpace, Masks); + StrToStrings(MaskProp.Value, NativeSpace, Masks); SetLength(MySetting.Masks, Masks.Count); for Index := 0 to Masks.Count - 1 do {$IFDEF MSWINDOWS} @@ -210,28 +230,80 @@ FSettings[High(FSettings)] := MySetting; end; end; + + procedure LoadTarget(Elem: TJclSimpleXmlElem); + var + PathProp: TJclSimpleXMLProp; + MySetting: TSvnSetting; + SubElem: TJclSimpleXMLElem; + Index: Integer; + begin + PathProp := Elem.Properties.ItemNamed['path']; + if not Assigned(PathProp) then + raise Exception.Create('no path property'); + MySetting.Path := PathProp.Value; + SetLength(MySetting.Masks, 0); + MySetting.Recurse := False; + MySetting.DirOnly := False; + SetLength(MySetting.Properties, 0); + for Index := 0 to Elem.Items.Count - 1 do + begin + SubElem := Elem.Items.Item[Index]; + if SubElem.Name = 'property' then + begin + SetLength(MySetting.Properties, Length(MySetting.Properties) + 1); + MySetting.Properties[High(MySetting.Properties)] := LoadProperty(SubElem); + end + else + if SubElem.Name <> '' then + raise Exception.CreateFmt('unknown item "%s"', [SubElem.Name]); + end; + if Length(MySetting.Properties) > 0 then + begin + SetLength(FSettings, Length(FSettings) + 1); + FSettings[High(FSettings)] := MySetting; + end; + end; var Elem: TJclSimpleXMLElem; Index: Integer; RootProp: TJclSimpleXMLProp; begin - RootProp := XmlNode.Properties.ItemNamed['root']; - if not Assigned(RootProp) then - raise Exception.Create('no root property'); - {$IFDEF MSWINDOWS} - FRoot := StringReplace(RootProp.Value, '/', DirDelimiter, [rfReplaceAll]); - {$ELSE ~MSWINDOWS} - FRoot := RootProp.Value; - {$ENDIF ~MSWINDOWS} - FRoot := PathCanonicalize(PathGetRelativePath(GetCurrentDir, FRoot)); - for Index := 0 to XmlNode.Items.Count - 1 do + if XmlNode.Name = 'svncleaner' then begin - Elem := XmlNode.Items.Item[Index]; - if Elem.Name = 'setting' then - LoadSetting(Elem, '.') - else - if Elem.Name <> '' then - raise Exception.CreateFmt('Unknown elem name "%s"', [Elem.Name]); + // svn cleaner setting file + RootProp := XmlNode.Properties.ItemNamed['root']; + if not Assigned(RootProp) then + raise Exception.Create('no root property'); + {$IFDEF MSWINDOWS} + FRoot := StringReplace(RootProp.Value, '/', DirDelimiter, [rfReplaceAll]); + {$ELSE ~MSWINDOWS} + FRoot := RootProp.Value; + {$ENDIF ~MSWINDOWS} + FRoot := PathCanonicalize(PathGetRelativePath(GetCurrentDir, FRoot)); + for Index := 0 to XmlNode.Items.Count - 1 do + begin + Elem := XmlNode.Items.Item[Index]; + if Elem.Name = 'setting' then + LoadSetting(Elem, '.') + else + if Elem.Name <> '' then + raise Exception.CreateFmt('Unknown elem name "%s"', [Elem.Name]); + end; + end + else + if XmlNode.Name = 'properties' then + begin + // "svn proplist" result file + for Index := 0 to XmlNode.Items.Count - 1 do + begin + Elem := XmlNode.Items.Item[Index]; + if Elem.Name = 'target' then + LoadTarget(Elem) + else + if Elem.Name <> '' then + raise Exception.CreateFmt('Unknown elem name "%s"', [Elem.Name]); + end; end; end; @@ -241,6 +313,8 @@ TSvnCleaner = class private FSettings: TSvnSettings; + FSvnProperties: TSvnSettings; + FSvnItems: TStrings; FSvnExe: string; function ExecuteSvn(const Argument: string): string; procedure CleanItem(const ItemName: string); @@ -250,184 +324,53 @@ procedure Execute; end; -procedure TSvnCleaner.CleanItem(const ItemName: string); - procedure ProcessProperties(const SvnResult: string); +constructor TSvnCleaner.Create(const XmlFileName: string); + procedure ParseSvnItems(RootElem: TJclSimpleXMLElem; Dest: TStrings); var - Lines: TStrings; - Line, Choice, PropFileName: string; - Index, IndexCheck, SepPos: Integer; - Properties, NewProperties: TSvnProperties; - Found: Boolean; + TargetIndex, EntryIndex: Integer; + TargetElem, EntryElem, WcStatusElem: TJclSimpleXMLElem; + PathProp, ItemProp: TJclSimpleXMLProp; + EntryPath: string; begin - Lines := TStringList.Create; - try - StrToStrings(SvnResult, AnsiLineBreak, Lines); - for Index := 1 to Lines.Count - 1 do - begin - Line := Lines.Strings[Index]; - if Pos(' ', Line) = 1 then - begin - SetLength(Properties, Length(Properties) + 1); - Line := Copy(Line, 3, Length(Line) - 2); - SepPos := Pos(' : ', Line); - if SepPos = 0 then - raise Exception.Create('could not determine property name'); - Properties[High(Properties)].Name := Copy(Line, 1, SepPos - 1); - Properties[High(Properties)].Value := Copy(Line, SepPos + 3, Length(Line) - SepPos - 2); - end - else - begin - if Length(Properties) = 0 then - raise Exception.Create('invalid sequence'); - Properties[High(Properties)].Value := Properties[High(Properties)].Value + AnsiLineBreak + Line; - end; - end; - finally - Lines.Free; - end; + if RootElem.Name <> 'status' then + raise Exception.CreateFmt('Unknown elem name "%s"', [RootElem.Name]); - NewProperties := FSettings.GetProperties(ItemName); - - for Index := Low(Properties) to High(Properties) do + for TargetIndex := 0 to RootElem.Items.Count - 1 do begin - Found := False; - for IndexCheck := Low(NewProperties) to High(NewProperties) do - if Properties[Index].Name = NewProperties[IndexCheck].Name then - begin - if (Properties[Index].Value <> NewProperties[IndexCheck].Value) - and ((Properties[Index].Value + AnsiLineBreak) <> NewProperties[IndexCheck].Value) - and (Properties[Index].Value <> (NewProperties[IndexCheck].Value + AnsiLineBreak)) then - begin - WriteLn('property "', Properties[Index].Name, '" for item "', ItemName, '" will be changed'); - WriteLn('old value: ', Properties[Index].Value); - WriteLn('new value: ', NewProperties[IndexCheck].Value); - repeat - Write('process? (y)es, (n)o, (a)bord: '); - ReadLn(Choice); - until (Choice = 'y') or (Choice = 'Y') or (Choice = 'n') or (Choice = 'N') or (Choice = 'a') or (Choice = 'A'); - case Choice[1] of - 'y', 'Y': - begin - PropFileName := ChangeFileExt(ParamStr(0), '.prop'); - StringToFile(PropFileName, NewProperties[IndexCheck].Value); - ExecuteSvn(Format('propset "%s" -F "%s" "%s"', [NewProperties[IndexCheck].Name, PropFileName, ItemName])); - end; - 'n', 'N': ; - 'a', 'A': - Abort; - end; - end; - Found := True; - Break; - end; - if not Found then - begin - WriteLn('property "', Properties[Index].Name, '" for item "', ItemName, '" will be deleted'); - WriteLn('old value: ', Properties[Index].Value); - repeat - Write('process? (y)es, (n)o, (a)bord: '); - ReadLn(Choice); - until (Choice = 'y') or (Choice = 'Y') or (Choice = 'n') or (Choice = 'N') or (Choice = 'a') or (Choice = 'A'); - case Choice[1] of - 'y', 'Y': - ExecuteSvn(Format('propdel "%s" "%s"', [Properties[Index].Name, ItemName])); - 'n', 'N': ; - 'a', 'A': - Abort; - end; - end; - end; + TargetElem := RootElem.Items.Item[TargetIndex]; + if TargetElem.Name <> 'target' then + raise Exception.CreateFmt('Unknown elem name "%s"', [TargetElem.Name]); - for Index := Low(NewProperties) to High(NewProperties) do - begin - Found := False; - for IndexCheck := Low(Properties) to High(Properties) do - if NewProperties[Index].Name = Properties[IndexCheck].Name then - begin - Found := True; - Break; - end; - if not Found then + for EntryIndex := 0 to TargetElem.Items.Count - 1 do begin - WriteLn('property "', NewProperties[Index].Name, '" for item "', ItemName, '" will be added'); - WriteLn('new value: ', NewProperties[Index].Value); - repeat - Write('process? (y)es, (n)o, (a)bord: '); - ReadLn(Choice); - until (Choice = 'y') or (Choice = 'Y') or (Choice = 'n') or (Choice = 'N') or (Choice = 'a') or (Choice = 'A'); - case Choice[1] of - 'y', 'Y': - begin - PropFileName := ChangeFileExt(ParamStr(0), '.prop'); - StringToFile(PropFileName, NewProperties[Index].Value); - ExecuteSvn(Format('propset "%s" -F "%s" "%s"', [NewProperties[Index].Name, PropFileName, ItemName])); - end; - 'n', 'N': ; - 'a', 'A': - Abort; - end; - end; - end; - end; + EntryElem := TargetElem.Items.Item[EntryIndex]; + if EntryElem.Name <> 'entry' then + raise Exception.CreateFmt('Unknown elem name "%s"', [EntryElem.Name]); + PathProp := EntryElem.Properties.ItemNamed['path']; + if not Assigned(PathProp) then + raise Exception.Create('no path prop'); + EntryPath := PathProp.Value; - procedure ProcessStatus(const SvnResult: string); - var - DirectoryXml: TJclSimpleXML; - RootNode, TargetNode, EntryNode, WcStatusNode: TJclSimpleXMLElem; - TargetIndex, EntryIndex, WcStatusIndex: Integer; - PathProp, ItemProp: TJclSimpleXMLProp; - begin - DirectoryXml := TJclSimpleXML.Create; - try - DirectoryXml.LoadFromString(SvnResult); - RootNode := DirectoryXml.Root; - if RootNode.Name <> 'status' then - raise Exception.Create('expecting status node'); - for TargetIndex := 0 to RootNode.Items.Count - 1 do - begin - TargetNode := RootNode.Items.Item[TargetIndex]; - if TargetNode.Name = 'target' then - begin - for EntryIndex := 0 to TargetNode.Items.Count - 1 do - begin - EntryNode := TargetNode.Items.Item[EntryIndex]; - if EntryNode.Name <> 'entry' then - raise Exception.Create('expecting entry node'); - PathProp := EntryNode.Properties.ItemNamed['path']; - if not Assigned(PathProp) then - raise Exception.Create('no path node'); - for WcStatusIndex := 0 to EntryNode.Items.Count - 1 do - begin - WcStatusNode := EntryNode.Items.Item[WcStatusIndex]; - if not Assigned(WcStatusNode) then - raise Exception.Create('expecting wc-status node'); - ItemProp := WcStatusNode.Properties.ItemNamed['item']; - if not Assigned(ItemProp) then - raise Exception.Create('expecting item prop'); - if (ItemProp.Value <> 'unversioned') and (PathProp.Value <> ItemName) then - CleanItem(PathProp.Value); - end; - end; - end - else - if TargetNode.Name <> '' then - raise Exception.Create('expecting target node'); + if (EntryElem.Items.Count <> 1) then + raise Exception.Create('invalid entry elem'); + + WcStatusElem := EntryElem.Items.Item[0]; + if WcStatusElem.Name <> 'wc-status' then + raise Exception.CreateFmt('Unknown elem name "%s"', [WcStatusElem.Name]); + + ItemProp := WcStatusElem.Properties.ItemNamed['item']; + if not Assigned(ItemProp) then + raise Exception.Create('no item prop'); + if ItemProp.Value <> 'unversioned' then + Dest.Add(EntryPath); end; - finally - DirectoryXml.Free; end; end; -begin - WriteLn('processing item "', ItemName, '"'); - ProcessProperties(ExecuteSvn(Format('proplist -v "%s"', [ItemName]))); - - if (FileGetAttr(ItemName) and faDirectory) <> 0 then - ProcessStatus(ExecuteSvn(Format('status -v --xml -N "%s"', [ItemName]))); -end; - -constructor TSvnCleaner.Create(const XmlFileName: string); var - AXmlSettings: TJclSimpleXML; + Xml: TJclSimpleXML; + StorageStream: TStream; + AStringStream: TJclStringStream; + SvnResult: string; begin inherited Create; FSvnExe := GetEnvironmentVariable('SVN'); @@ -437,30 +380,170 @@ ReadLn(FSvnExe); until FileExists(FSvnExe); FSettings := TSvnSettings.Create; - AXmlSettings := TJclSimpleXML.Create; + FSvnProperties := TSvnSettings.Create; + FSvnItems := TStringList.Create; + + Xml := TJclSimpleXML.Create; try - AXmlSettings.LoadFromFile(XmlFileName); - AXmlSettings.Options := AXmlSettings.Options - [sxoAutoCreate]; + // load svn cleaner options + Xml.LoadFromFile(XmlFileName); + Xml.Options := Xml.Options - [sxoAutoCreate]; - FSettings.LoadFromXml(AXmlSettings.Root); + FSettings.LoadFromXml(Xml.Root); + + StorageStream := TMemoryStream.Create; + try + AStringStream := TJclAutoStream.Create(StorageStream, False); + try + // retrieve the SVN properties + WriteLn('getting SVN properties...'); + SvnResult := ExecuteSvn('proplist -v --xml -R ' + FSettings.Root); + AStringStream.WriteString(SvnResult, 1, Length(SvnResult)); + AStringStream.Seek(0, soBeginning); + Xml.LoadFromStringStream(AStringStream); + FSvnProperties.LoadFromXml(Xml.Root); + + AStringStream.Size := 0; + + // retrieve the list of SVN items + WriteLn('getting SVN items...'); + SvnResult := ExecuteSvn('status -v --xml ' + FSettings.Root); + AStringStream.WriteString(SvnResult, 1, Length(SvnResult)); + AStringStream.Seek(0, soBeginning); + Xml.LoadFromStringStream(AStringStream); + ParseSvnItems(Xml.Root, FSvnItems); + finally + AStringStream.Free; + end; + finally + StorageStream.Free; + end; finally - AXmlSettings.Free; + Xml.Free; end; end; destructor TSvnCleaner.Destroy; begin + FSvnItems.Free; + FSvnProperties.Free; FSettings.Free; inherited Destroy; end; +procedure TSvnCleaner.CleanItem(const ItemName: string); +var + Choice, PropFileName: string; + Index, IndexCheck: Integer; + Properties, NewProperties: TSvnProperties; + Found: Boolean; +begin + WriteLn('processing item "', ItemName, '"'); + + Properties := FSvnProperties.GetProperties(ItemName); + NewProperties := FSettings.GetProperties(ItemName); + + for Index := Low(Properties) to High(Properties) do + begin + Found := False; + for IndexCheck := Low(NewProperties) to High(NewProperties) do + if Properties[Index].Name = NewProperties[IndexCheck].Name then + begin + if (Properties[Index].Value <> NewProperties[IndexCheck].Value) + and ((Properties[Index].Value + NativeLineBreak) <> NewProperties[IndexCheck].Value) + and (Properties[Index].Value <> (NewProperties[IndexCheck].Value + NativeLineBreak)) then + begin + WriteLn('property "', Properties[Index].Name, '" for item "', ItemName, '" will be changed'); + WriteLn('old value: ', Properties[Index].Value); + WriteLn('new value: ', NewProperties[IndexCheck].Value); + repeat + Write('process? (y)es, (n)o, (a)bord: '); + ReadLn(Choice); + until (Choice = 'y') or (Choice = 'Y') or (Choice = 'n') or (Choice = 'N') or (Choice = 'a') or (Choice = 'A'); + case Choice[1] of + 'y', 'Y': + begin + PropFileName := ChangeFileExt(ParamStr(0), '.prop'); + {$IFDEF SUPPORTS_UNICODE} + StringToFile(PropFileName, RawByteString(NewProperties[IndexCheck].Value)); + {$ELSE ~SUPPORTS_UNICODE} + StringToFile(PropFileName, NewProperties[IndexCheck].Value); + {$ENDIF ~SUPPORTS_UNICODE} + ExecuteSvn(Format('propset "%s" -F "%s" "%s"', [NewProperties[IndexCheck].Name, PropFileName, ItemName])); + end; + 'n', 'N': ; + 'a', 'A': + Abort; + end; + end; + Found := True; + Break; + end; + if not Found then + begin + WriteLn('property "', Properties[Index].Name, '" for item "', ItemName, '" will be deleted'); + WriteLn('old value: ', Properties[Index].Value); + repeat + Write('process? (y)es, (n)o, (a)bord: '); + ReadLn(Choice); + until (Choice = 'y') or (Choice = 'Y') or (Choice = 'n') or (Choice = 'N') or (Choice = 'a') or (Choice = 'A'); + case Choice[1] of + 'y', 'Y': + ExecuteSvn(Format('propdel "%s" "%s"', [Properties[Index].Name, ItemName])); + 'n', 'N': ; + 'a', 'A': + Abort; + end; + end; + end; + + for Index := Low(NewProperties) to High(NewProperties) do + begin + Found := False; + for IndexCheck := Low(Properties) to High(Properties) do + if NewProperties[Index].Name = Properties[IndexCheck].Name then + begin + Found := True; + Break; + end; + if not Found then + begin + WriteLn('property "', NewProperties[Index].Name, '" for item "', ItemName, '" will be added'); + WriteLn('new value: ', NewProperties[Index].Value); + repeat + Write('process? (y)es, (n)o, (a)bord: '); + ReadLn(Choice); + until (Choice = 'y') or (Choice = 'Y') or (Choice = 'n') or (Choice = 'N') or (Choice = 'a') or (Choice = 'A'); + case Choice[1] of + 'y', 'Y': + begin + PropFileName := ChangeFileExt(ParamStr(0), '.prop'); + {$IFDEF SUPPORTS_UNICODE} + StringToFile(PropFileName, RawByteString(NewProperties[Index].Value)); + {$ELSE ~SUPPORTS_UNICODE} + StringToFile(PropFileName, NewProperties[Index].Value); + {$ENDIF ~SUPPORTS_UNICODE} + ExecuteSvn(Format('propset "%s" -F "%s" "%s"', [NewProperties[Index].Name, PropFileName, ItemName])); + end; + 'n', 'N': ; + 'a', 'A': + Abort; + end; + end; + end; +end; + procedure TSvnCleaner.Execute; +var + Index: Integer; begin - CleanItem(FSettings.Root); + for Index := 0 to FSvnItems.Count - 1 do + CleanItem(FSvnItems.Strings[Index]); end; function TSvnCleaner.ExecuteSvn(const Argument: string): string; begin + Result := ''; JclSysUtils.Execute(Format('"%s" %s', [FSvnExe, Argument]), Result); end; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <usc...@us...> - 2009-04-20 23:18:23
|
Revision: 2741 http://jcl.svn.sourceforge.net/jcl/?rev=2741&view=rev Author: uschuster Date: 2009-04-20 23:18:19 +0000 (Mon, 20 Apr 2009) Log Message: ----------- fixed double attribute name in TJclSerializableLocationInfo.Serialize Modified Paths: -------------- branches/jcl-stack-trace/jcl/experts/stackviewer/JclDebugSerialization.pas Modified: branches/jcl-stack-trace/jcl/experts/stackviewer/JclDebugSerialization.pas =================================================================== --- branches/jcl-stack-trace/jcl/experts/stackviewer/JclDebugSerialization.pas 2009-04-19 19:40:23 UTC (rev 2740) +++ branches/jcl-stack-trace/jcl/experts/stackviewer/JclDebugSerialization.pas 2009-04-20 23:18:19 UTC (rev 2741) @@ -337,7 +337,7 @@ S := S + Format('+ $%x', [OffsetFromLineNumber]) else S := S + Format('- $%x', [-OffsetFromLineNumber]); - ASerializer.WriteString(Self, 'OffsetFromProcName', S); + ASerializer.WriteString(Self, 'OffsetFromLineNumber', S); end; if lievProcedureStartLocationInfo in Values then ASerializer.WriteString(Self, 'LineNumberOffsetFromProcedureStart', IntToStr(LineNumberOffsetFromProcedureStart)); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ou...@us...> - 2009-04-19 19:40:26
|
Revision: 2740 http://jcl.svn.sourceforge.net/jcl/?rev=2740&view=rev Author: outchy Date: 2009-04-19 19:40:23 +0000 (Sun, 19 Apr 2009) Log Message: ----------- Update the string seek position when Seek method is called and when the stream size is changed. Modified Paths: -------------- trunk/jcl/source/common/JclStreams.pas Modified: trunk/jcl/source/common/JclStreams.pas =================================================================== --- trunk/jcl/source/common/JclStreams.pas 2009-04-19 16:04:07 UTC (rev 2739) +++ trunk/jcl/source/common/JclStreams.pas 2009-04-19 19:40:23 UTC (rev 2740) @@ -529,8 +529,10 @@ FCharacterWriter: TJclStreamSetNextCharFunc; FPeekPosition: Int64; function GetCalcedSize: Int64; override; + procedure SetSize({$IFNDEF CLR}const{$ENDIF ~CLR} NewSize: Int64); override; public constructor Create(AStream: TStream; AOwnsStream: Boolean = False); virtual; + function Seek(const Offset: Int64; Origin: TSeekOrigin): Int64; override; function ReadString(var Buffer: string; Start, Count: Longint): Longint; overload; function ReadString(BufferSize: Longint = 4096): string; overload; function ReadAnsiString(var Buffer: AnsiString; Start, Count: Longint): Longint; overload; @@ -2990,6 +2992,18 @@ until ProcessedLength = 0; end; +function TJclStringStream.Seek(const Offset: Int64; Origin: TSeekOrigin): Int64; +begin + Result := inherited Seek(Offset, Origin); + FPeekPosition := FPosition; +end; + +procedure TJclStringStream.SetSize({$IFNDEF CLR}const{$ENDIF ~CLR} NewSize: Int64); +begin + inherited SetSize(NewSize); + FPeekPosition := FPosition; +end; + function TJclStringStream.SkipBOM: Longint; var Pos: Int64; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ou...@us...> - 2009-04-19 16:04:17
|
Revision: 2739 http://jcl.svn.sourceforge.net/jcl/?rev=2739&view=rev Author: outchy Date: 2009-04-19 16:04:07 +0000 (Sun, 19 Apr 2009) Log Message: ----------- Mantis 4736: JclExprEval: Wrong argument evaluation order Modified Paths: -------------- trunk/jcl/source/common/JclExprEval.pas Modified: trunk/jcl/source/common/JclExprEval.pas =================================================================== --- trunk/jcl/source/common/JclExprEval.pas 2009-04-19 08:38:49 UTC (rev 2738) +++ trunk/jcl/source/common/JclExprEval.pas 2009-04-19 16:04:07 UTC (rev 2739) @@ -3709,15 +3709,21 @@ end; function TExprUnaryFuncSym.Compile: TExprNode; +var + X: TExprNode; begin - Result := NodeFactory.CallUnaryFunc(FFunc, CompileFirstArg); + X := CompileFirstArg; EndArgs; + Result := NodeFactory.CallUnaryFunc(FFunc, X); end; function TExprUnaryFuncSym.Evaluate: TFloat; +var + X: TFloat; begin - Result := FFunc(EvalFirstArg); + X := EvalFirstArg; EndArgs; + Result := FFunc(X); end; //=== { TExprUnary32FuncSym } ================================================ @@ -3730,15 +3736,21 @@ end; function TExprUnary32FuncSym.Compile: TExprNode; +var + X: TExprNode; begin - Result := NodeFactory.CallUnary32Func(FFunc, CompileFirstArg); + X := CompileFirstArg; EndArgs; + Result := NodeFactory.CallUnary32Func(FFunc, X); end; function TExprUnary32FuncSym.Evaluate: TFloat; +var + X: TFloat; begin - Result := FFunc(EvalFirstArg); + X := EvalFirstArg; EndArgs; + Result := FFunc(X); end; //=== { TExprUnary64FuncSym } ================================================ @@ -3751,15 +3763,21 @@ end; function TExprUnary64FuncSym.Compile: TExprNode; +var + X: TExprNode; begin - Result := NodeFactory.CallUnary64Func(FFunc, CompileFirstArg); + X := CompileFirstArg; EndArgs; + Result := NodeFactory.CallUnary64Func(FFunc, X); end; function TExprUnary64FuncSym.Evaluate: TFloat; +var + X: TFloat; begin - Result := FFunc(EvalFirstArg); + X := EvalFirstArg; EndArgs; + Result := FFunc(X); end; //=== { TExprUnary80FuncSym } ================================================ @@ -3772,15 +3790,21 @@ end; function TExprUnary80FuncSym.Compile: TExprNode; +var + X: TExprNode; begin - Result := NodeFactory.CallUnary80Func(FFunc, CompileFirstArg); + X := CompileFirstArg; EndArgs; + Result := NodeFactory.CallUnary80Func(FFunc, X); end; function TExprUnary80FuncSym.Evaluate: TFloat; +var + X: TFloat; begin - Result := FFunc(EvalFirstArg); + X := EvalFirstArg; EndArgs; + Result := FFunc(X); end; //=== { TExprBinaryFuncSym } ================================================= @@ -3811,8 +3835,8 @@ begin X := EvalFirstArg; Y := EvalNextArg; + EndArgs; Result := FFunc(X, Y); - EndArgs; end; //=== { TExprBinary32FuncSym } =============================================== @@ -4005,10 +4029,14 @@ end; function TExprTernary80FuncSym.Compile: TExprNode; +var + X, Y, Z: TExprNode; begin - Result := NodeFactory.CallTernary80Func(FFunc, CompileFirstArg, - CompileNextArg, CompileNextArg); + X := CompileFirstArg; + Y := CompileNextArg; + Z := CompileNextArg; EndArgs; + Result := NodeFactory.CallTernary80Func(FFunc, X, Y, Z); end; function TExprTernary80FuncSym.Evaluate: TFloat; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ou...@us...> - 2009-04-19 08:38:53
|
Revision: 2738 http://jcl.svn.sourceforge.net/jcl/?rev=2738&view=rev Author: outchy Date: 2009-04-19 08:38:49 +0000 (Sun, 19 Apr 2009) Log Message: ----------- useless files. Removed Paths: ------------- trunk/website/delphi-jedi/img/Thumbs.db trunk/website/delphi-jedi/index_old.html Deleted: trunk/website/delphi-jedi/img/Thumbs.db =================================================================== (Binary files differ) Deleted: trunk/website/delphi-jedi/index_old.html =================================================================== --- trunk/website/delphi-jedi/index_old.html 2009-04-17 22:25:16 UTC (rev 2737) +++ trunk/website/delphi-jedi/index_old.html 2009-04-19 08:38:49 UTC (rev 2738) @@ -1,14 +0,0 @@ -<html> -<head> -<title>Jedi Code Library</title> -<meta name="author" content="\x88\xA4\xD7"> -<meta name="generator" content="Ulli Meybohms HTML EDITOR"> -</head> -<body text="#000000" bgcolor="#FFFFFF" link="#FF0000"> -<div align="center"><img src="bugreport.gif" alt="" border="0"> -<p> -<b><a href="mantis/login_page.php">Enter the issue tracker</a> -</b></p> -</div> -</body> -</html> \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <usc...@us...> - 2009-04-17 22:25:24
|
Revision: 2737 http://jcl.svn.sourceforge.net/jcl/?rev=2737&view=rev Author: uschuster Date: 2009-04-17 22:25:16 +0000 (Fri, 17 Apr 2009) Log Message: ----------- first round of cleanup (renamed some files, MPL headers, UNITVERSIONING) Modified Paths: -------------- branches/jcl-stack-trace/jcl/TODO.txt branches/jcl-stack-trace/jcl/experts/stackviewer/JclDebugSerialization.pas branches/jcl-stack-trace/jcl/experts/stackviewer/JclDebugXMLDeserializer.pas branches/jcl-stack-trace/jcl/experts/stackviewer/JclDebugXMLSerializer.pas branches/jcl-stack-trace/jcl/experts/stackviewer/JclStackTraceViewerAPI.pas branches/jcl-stack-trace/jcl/experts/stackviewer/JclStackTraceViewerExpert.dpk branches/jcl-stack-trace/jcl/experts/stackviewer/StackViewForm.dfm branches/jcl-stack-trace/jcl/experts/stackviewer/StackViewForm.pas branches/jcl-stack-trace/jcl/packages/d11/JclStackTraceViewerExpert.dpk branches/jcl-stack-trace/jcl/packages/d11/JclStackTraceViewerExpert.dproj branches/jcl-stack-trace/jcl/packages/d11/JclStackTraceViewerExpertDLL.dpr branches/jcl-stack-trace/jcl/packages/d11/JclStackTraceViewerExpertDLL.dproj branches/jcl-stack-trace/jcl/packages/d12/JclStackTraceViewerExpert.dpk branches/jcl-stack-trace/jcl/packages/d12/JclStackTraceViewerExpert.dproj branches/jcl-stack-trace/jcl/packages/d12/JclStackTraceViewerExpertDLL.dpr branches/jcl-stack-trace/jcl/packages/d12/JclStackTraceViewerExpertDLL.dproj branches/jcl-stack-trace/jcl/packages/xml/JclStackTraceViewerExpert-D.xml branches/jcl-stack-trace/jcl/packages/xml/JclStackTraceViewerExpertDLL-L.xml Added Paths: ----------- branches/jcl-stack-trace/jcl/experts/stackviewer/JclStackTraceViewerConfigFrame.dfm branches/jcl-stack-trace/jcl/experts/stackviewer/JclStackTraceViewerConfigFrame.pas branches/jcl-stack-trace/jcl/experts/stackviewer/JclStackTraceViewerExceptInfoFrame.dfm branches/jcl-stack-trace/jcl/experts/stackviewer/JclStackTraceViewerExceptInfoFrame.pas branches/jcl-stack-trace/jcl/experts/stackviewer/JclStackTraceViewerImpl.pas branches/jcl-stack-trace/jcl/experts/stackviewer/JclStackTraceViewerModuleFrame.dfm branches/jcl-stack-trace/jcl/experts/stackviewer/JclStackTraceViewerModuleFrame.pas branches/jcl-stack-trace/jcl/experts/stackviewer/JclStackTraceViewerOptions.pas branches/jcl-stack-trace/jcl/experts/stackviewer/JclStackTraceViewerStackFrame.dfm branches/jcl-stack-trace/jcl/experts/stackviewer/JclStackTraceViewerStackFrame.pas branches/jcl-stack-trace/jcl/experts/stackviewer/JclStackTraceViewerThreadFrame.dfm branches/jcl-stack-trace/jcl/experts/stackviewer/JclStackTraceViewerThreadFrame.pas Removed Paths: ------------- branches/jcl-stack-trace/jcl/experts/stackviewer/ExceptInfoFrame.dfm branches/jcl-stack-trace/jcl/experts/stackviewer/ExceptInfoFrame.pas branches/jcl-stack-trace/jcl/experts/stackviewer/ExceptionViewerOptionsUnit.pas branches/jcl-stack-trace/jcl/experts/stackviewer/ModuleFrame.dfm branches/jcl-stack-trace/jcl/experts/stackviewer/ModuleFrame.pas branches/jcl-stack-trace/jcl/experts/stackviewer/StackFrame.dfm branches/jcl-stack-trace/jcl/experts/stackviewer/StackFrame.pas branches/jcl-stack-trace/jcl/experts/stackviewer/StackTraceViewerConfigFrame.dfm branches/jcl-stack-trace/jcl/experts/stackviewer/StackTraceViewerConfigFrame.pas branches/jcl-stack-trace/jcl/experts/stackviewer/StackTraceViewerImpl.pas branches/jcl-stack-trace/jcl/experts/stackviewer/ThreadFrame.dfm branches/jcl-stack-trace/jcl/experts/stackviewer/ThreadFrame.pas Modified: branches/jcl-stack-trace/jcl/TODO.txt =================================================================== --- branches/jcl-stack-trace/jcl/TODO.txt 2009-04-15 22:40:28 UTC (rev 2736) +++ branches/jcl-stack-trace/jcl/TODO.txt 2009-04-17 22:25:16 UTC (rev 2737) @@ -31,9 +31,9 @@ * clean up/minor things - add and test desktop state stuff in DLL expert mode - use updated TJclFileEnumerator instead of TFileSearcher - - rename some files - - add MPL headers - - add UNITVERSIONING + - (partly done) rename some files + - (partly done) add MPL headers + - (partly done) add UNITVERSIONING * integrate it into the installation - generate packages, JclPackages*.* and resources.mak for 5 - 10 \ No newline at end of file Deleted: branches/jcl-stack-trace/jcl/experts/stackviewer/ExceptInfoFrame.dfm =================================================================== --- branches/jcl-stack-trace/jcl/experts/stackviewer/ExceptInfoFrame.dfm 2009-04-15 22:40:28 UTC (rev 2736) +++ branches/jcl-stack-trace/jcl/experts/stackviewer/ExceptInfoFrame.dfm 2009-04-17 22:25:16 UTC (rev 2737) @@ -1,35 +0,0 @@ -object frmException: TfrmException - Left = 0 - Top = 0 - Width = 320 - Height = 240 - TabOrder = 0 - object Label1: TLabel - Left = 3 - Top = 3 - Width = 56 - Height = 13 - Caption = 'ClassName:' - end - object Label2: TLabel - Left = 3 - Top = 22 - Width = 46 - Height = 13 - Caption = 'Message:' - end - object lbExceptionClassName: TLabel - Left = 65 - Top = 3 - Width = 9 - Height = 13 - Caption = ' ' - end - object lbExceptionMessage: TLabel - Left = 65 - Top = 22 - Width = 9 - Height = 13 - Caption = ' ' - end -end Deleted: branches/jcl-stack-trace/jcl/experts/stackviewer/ExceptInfoFrame.pas =================================================================== --- branches/jcl-stack-trace/jcl/experts/stackviewer/ExceptInfoFrame.pas 2009-04-15 22:40:28 UTC (rev 2736) +++ branches/jcl-stack-trace/jcl/experts/stackviewer/ExceptInfoFrame.pas 2009-04-17 22:25:16 UTC (rev 2737) @@ -1,45 +0,0 @@ -unit ExceptInfoFrame; - -interface - -uses - Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - StdCtrls, JclDebugSerialization; - -type - TfrmException = class(TFrame) - Label1: TLabel; - Label2: TLabel; - lbExceptionClassName: TLabel; - lbExceptionMessage: TLabel; - private - FException: TException; - procedure SetException(const Value: TException); - { Private declarations } - public - { Public declarations } - property Exception: TException read FException write SetException; - end; - -implementation - -{$R *.dfm} - -{ TfrmException } - -procedure TfrmException.SetException(const Value: TException); -begin - FException := Value; - if Assigned(FException) then - begin - lbExceptionClassName.Caption := FException.ExceptionClassName; - lbExceptionMessage.Caption := FException.ExceptionMessage; - end - else - begin - lbExceptionClassName.Caption := ''; - lbExceptionMessage.Caption := ''; - end; -end; - -end. Deleted: branches/jcl-stack-trace/jcl/experts/stackviewer/ExceptionViewerOptionsUnit.pas =================================================================== --- branches/jcl-stack-trace/jcl/experts/stackviewer/ExceptionViewerOptionsUnit.pas 2009-04-15 22:40:28 UTC (rev 2736) +++ branches/jcl-stack-trace/jcl/experts/stackviewer/ExceptionViewerOptionsUnit.pas 2009-04-17 22:25:16 UTC (rev 2737) @@ -1,43 +0,0 @@ -unit ExceptionViewerOptionsUnit; - -interface - -uses - Classes; - -type - TExceptionViewerOption = class(TPersistent) - private - FExpandTreeView: Boolean; - FModuleVersionAsRevision: Boolean; - protected - procedure AssignTo(Dest: TPersistent); override; - public - constructor Create; - property ExpandTreeView: Boolean read FExpandTreeView write FExpandTreeView; - property ModuleVersionAsRevision: Boolean read FModuleVersionAsRevision write FModuleVersionAsRevision; - end; - -implementation - -{ TExceptionViewerOption } - -constructor TExceptionViewerOption.Create; -begin - inherited Create; - FExpandTreeView := False; - FModuleVersionAsRevision := False; -end; - -procedure TExceptionViewerOption.AssignTo(Dest: TPersistent); -begin - if Dest is TExceptionViewerOption then - begin - TExceptionViewerOption(Dest).FExpandTreeView := ExpandTreeView; - TExceptionViewerOption(Dest).FModuleVersionAsRevision := ModuleVersionAsRevision; - end - else - inherited AssignTo(Dest); -end; - -end. Modified: branches/jcl-stack-trace/jcl/experts/stackviewer/JclDebugSerialization.pas =================================================================== --- branches/jcl-stack-trace/jcl/experts/stackviewer/JclDebugSerialization.pas 2009-04-15 22:40:28 UTC (rev 2736) +++ branches/jcl-stack-trace/jcl/experts/stackviewer/JclDebugSerialization.pas 2009-04-17 22:25:16 UTC (rev 2737) @@ -1,9 +1,43 @@ +{**************************************************************************************************} +{ } +{ Project JEDI Code Library (JCL) } +{ } +{ The contents of this file are subject to the Mozilla Public License Version 1.1 (the "License"); } +{ you may not use this file except in compliance with the License. You may obtain a copy of the } +{ License at http://www.mozilla.org/MPL/ } +{ } +{ Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF } +{ ANY KIND, either express or implied. See the License for the specific language governing rights } +{ and limitations under the License. } +{ } +{ The Original Code is JclDebugSerialization.pas. } +{ } +{ The Initial Developer of the Original Code is Uwe Schuster. } +{ Portions created by Uwe Schuster are Copyright (C) 2009 Uwe Schuster. All rights reserved. } +{ } +{ Contributor(s): } +{ Uwe Schuster (uschuster) } +{ } +{**************************************************************************************************} +{ } +{ Last modified: $Date:: $ } +{ Revision: $Rev:: $ } +{ Author: $Author:: $ } +{ } +{**************************************************************************************************} + unit JclDebugSerialization; +{$I jcl.inc} + interface uses - SysUtils, Classes, Contnrs, JclDebug; + SysUtils, Classes, Contnrs, + {$IFDEF UNITVERSIONING} + JclUnitVersioning, + {$ENDIF UNITVERSIONING} + JclDebug; type TJclCustomSimpleSerializer = class(TObject) @@ -137,6 +171,16 @@ property Modules: TModuleList read FModules; end; +{$IFDEF UNITVERSIONING} +const + UnitVersioning: TUnitVersionInfo = ( + RCSfile: '$URL: $'; + Revision: '$Revision: $'; + Date: '$Date: $'; + LogPath: '' + ); +{$ENDIF UNITVERSIONING} + implementation //=== { TJclCustomSimpleSerializer } ========================================= @@ -568,4 +612,12 @@ Items[I].Serialize(ASerializer.AddChild(Self, 'Module')); end; +{$IFDEF UNITVERSIONING} +initialization + RegisterUnitVersion(HInstance, UnitVersioning); + +finalization + UnregisterUnitVersion(HInstance); +{$ENDIF UNITVERSIONING} + end. Modified: branches/jcl-stack-trace/jcl/experts/stackviewer/JclDebugXMLDeserializer.pas =================================================================== --- branches/jcl-stack-trace/jcl/experts/stackviewer/JclDebugXMLDeserializer.pas 2009-04-15 22:40:28 UTC (rev 2736) +++ branches/jcl-stack-trace/jcl/experts/stackviewer/JclDebugXMLDeserializer.pas 2009-04-17 22:25:16 UTC (rev 2737) @@ -1,9 +1,43 @@ +{**************************************************************************************************} +{ } +{ Project JEDI Code Library (JCL) } +{ } +{ The contents of this file are subject to the Mozilla Public License Version 1.1 (the "License"); } +{ you may not use this file except in compliance with the License. You may obtain a copy of the } +{ License at http://www.mozilla.org/MPL/ } +{ } +{ Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF } +{ ANY KIND, either express or implied. See the License for the specific language governing rights } +{ and limitations under the License. } +{ } +{ The Original Code is JclDebugXMLDeserializer.pas. } +{ } +{ The Initial Developer of the Original Code is Uwe Schuster. } +{ Portions created by Uwe Schuster are Copyright (C) 2009 Uwe Schuster. All rights reserved. } +{ } +{ Contributor(s): } +{ Uwe Schuster (uschuster) } +{ } +{**************************************************************************************************} +{ } +{ Last modified: $Date:: $ } +{ Revision: $Rev:: $ } +{ Author: $Author:: $ } +{ } +{**************************************************************************************************} + unit JclDebugXMLDeserializer; +{$I jcl.inc} + interface uses - SysUtils, JclDebugSerialization, JclSimpleXml; + SysUtils, + {$IFDEF UNITVERSIONING} + JclUnitVersioning, + {$ENDIF UNITVERSIONING} + JclDebugSerialization, JclSimpleXml; type TJclXMLDeserializer = class(TJclCustomSimpleSerializer) @@ -11,6 +45,16 @@ procedure LoadFromString(const AValue: string); end; +{$IFDEF UNITVERSIONING} +const + UnitVersioning: TUnitVersionInfo = ( + RCSfile: '$URL: $'; + Revision: '$Revision: $'; + Date: '$Date: $'; + LogPath: '' + ); +{$ENDIF UNITVERSIONING} + implementation //=== { TJclXMLDeserializer } ================================================ @@ -40,4 +84,12 @@ end; end; +{$IFDEF UNITVERSIONING} +initialization + RegisterUnitVersion(HInstance, UnitVersioning); + +finalization + UnregisterUnitVersion(HInstance); +{$ENDIF UNITVERSIONING} + end. Modified: branches/jcl-stack-trace/jcl/experts/stackviewer/JclDebugXMLSerializer.pas =================================================================== --- branches/jcl-stack-trace/jcl/experts/stackviewer/JclDebugXMLSerializer.pas 2009-04-15 22:40:28 UTC (rev 2736) +++ branches/jcl-stack-trace/jcl/experts/stackviewer/JclDebugXMLSerializer.pas 2009-04-17 22:25:16 UTC (rev 2737) @@ -1,9 +1,43 @@ +{**************************************************************************************************} +{ } +{ Project JEDI Code Library (JCL) } +{ } +{ The contents of this file are subject to the Mozilla Public License Version 1.1 (the "License"); } +{ you may not use this file except in compliance with the License. You may obtain a copy of the } +{ License at http://www.mozilla.org/MPL/ } +{ } +{ Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF } +{ ANY KIND, either express or implied. See the License for the specific language governing rights } +{ and limitations under the License. } +{ } +{ The Original Code is JclDebugXMLSerializer.pas. } +{ } +{ The Initial Developer of the Original Code is Uwe Schuster. } +{ Portions created by Uwe Schuster are Copyright (C) 2009 Uwe Schuster. All rights reserved. } +{ } +{ Contributor(s): } +{ Uwe Schuster (uschuster) } +{ } +{**************************************************************************************************} +{ } +{ Last modified: $Date:: $ } +{ Revision: $Rev:: $ } +{ Author: $Author:: $ } +{ } +{**************************************************************************************************} + unit JclDebugXMLSerializer; +{$I jcl.inc} + interface uses - SysUtils, Classes, JclDebugSerialization; + SysUtils, Classes, + {$IFDEF UNITVERSIONING} + JclUnitVersioning, + {$ENDIF UNITVERSIONING} + JclDebugSerialization; type TJclXMLSerializer = class(TJclCustomSimpleSerializer) @@ -11,6 +45,16 @@ function SaveToString: string; end; +{$IFDEF UNITVERSIONING} +const + UnitVersioning: TUnitVersionInfo = ( + RCSfile: '$URL: $'; + Revision: '$Revision: $'; + Date: '$Date: $'; + LogPath: '' + ); +{$ENDIF UNITVERSIONING} + implementation //=== { TJclXMLSerializer } ================================================== @@ -64,4 +108,12 @@ end; end; +{$IFDEF UNITVERSIONING} +initialization + RegisterUnitVersion(HInstance, UnitVersioning); + +finalization + UnregisterUnitVersion(HInstance); +{$ENDIF UNITVERSIONING} + end. Modified: branches/jcl-stack-trace/jcl/experts/stackviewer/JclStackTraceViewerAPI.pas =================================================================== --- branches/jcl-stack-trace/jcl/experts/stackviewer/JclStackTraceViewerAPI.pas 2009-04-15 22:40:28 UTC (rev 2736) +++ branches/jcl-stack-trace/jcl/experts/stackviewer/JclStackTraceViewerAPI.pas 2009-04-17 22:25:16 UTC (rev 2737) @@ -1,3 +1,31 @@ +{**************************************************************************************************} +{ } +{ Project JEDI Code Library (JCL) } +{ } +{ The contents of this file are subject to the Mozilla Public License Version 1.1 (the "License"); } +{ you may not use this file except in compliance with the License. You may obtain a copy of the } +{ License at http://www.mozilla.org/MPL/ } +{ } +{ Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF } +{ ANY KIND, either express or implied. See the License for the specific language governing rights } +{ and limitations under the License. } +{ } +{ The Original Code is JclStackTraceViewerAPI.pas. } +{ } +{ The Initial Developer of the Original Code is Uwe Schuster. } +{ Portions created by Uwe Schuster are Copyright (C) 2009 Uwe Schuster. All rights reserved. } +{ } +{ Contributor(s): } +{ Uwe Schuster (uschuster) } +{ } +{**************************************************************************************************} +{ } +{ Last modified: $Date:: $ } +{ Revision: $Rev:: $ } +{ Author: $Author:: $ } +{ } +{**************************************************************************************************} + unit JclStackTraceViewerAPI; interface Copied: branches/jcl-stack-trace/jcl/experts/stackviewer/JclStackTraceViewerConfigFrame.dfm (from rev 2736, branches/jcl-stack-trace/jcl/experts/stackviewer/StackTraceViewerConfigFrame.dfm) =================================================================== --- branches/jcl-stack-trace/jcl/experts/stackviewer/JclStackTraceViewerConfigFrame.dfm (rev 0) +++ branches/jcl-stack-trace/jcl/experts/stackviewer/JclStackTraceViewerConfigFrame.dfm 2009-04-17 22:25:16 UTC (rev 2737) @@ -0,0 +1,25 @@ +object JclStackTraceViewerConfigFrame: TJclStackTraceViewerConfigFrame + Left = 0 + Top = 0 + Width = 369 + Height = 375 + AutoScroll = True + TabOrder = 0 + TabStop = True + object cbExpandTreeView: TCheckBox + Left = 8 + Top = 8 + Width = 113 + Height = 17 + Caption = 'Expand TreeView' + TabOrder = 0 + end + object cbModuleVersionAsRevision: TCheckBox + Left = 8 + Top = 31 + Width = 169 + Height = 17 + Caption = 'Module FileVersion as Revision' + TabOrder = 1 + end +end Copied: branches/jcl-stack-trace/jcl/experts/stackviewer/JclStackTraceViewerConfigFrame.pas (from rev 2736, branches/jcl-stack-trace/jcl/experts/stackviewer/StackTraceViewerConfigFrame.pas) =================================================================== --- branches/jcl-stack-trace/jcl/experts/stackviewer/JclStackTraceViewerConfigFrame.pas (rev 0) +++ branches/jcl-stack-trace/jcl/experts/stackviewer/JclStackTraceViewerConfigFrame.pas 2009-04-17 22:25:16 UTC (rev 2737) @@ -0,0 +1,106 @@ +{**************************************************************************************************} +{ } +{ Project JEDI Code Library (JCL) } +{ } +{ The contents of this file are subject to the Mozilla Public License Version 1.1 (the "License"); } +{ you may not use this file except in compliance with the License. You may obtain a copy of the } +{ License at http://www.mozilla.org/MPL/ } +{ } +{ Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF } +{ ANY KIND, either express or implied. See the License for the specific language governing rights } +{ and limitations under the License. } +{ } +{ The Original Code is JclStackTraceViewerConfigFrame.pas. } +{ } +{ The Initial Developer of the Original Code is Uwe Schuster. } +{ Portions created by Uwe Schuster are Copyright (C) 2009 Uwe Schuster. All rights reserved. } +{ } +{ Contributor(s): } +{ Uwe Schuster (uschuster) } +{ } +{**************************************************************************************************} +{ } +{ Last modified: $Date:: $ } +{ Revision: $Rev:: $ } +{ Author: $Author:: $ } +{ } +{**************************************************************************************************} + +unit JclStackTraceViewerConfigFrame; + +{$I jcl.inc} + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, + {$IFDEF UNITVERSIONING} + JclUnitVersioning, + {$ENDIF UNITVERSIONING} + Dialogs, StdCtrls, ExtCtrls, JclStackTraceViewerOptions; + +type + TJclStackTraceViewerConfigFrame = class(TFrame) + cbExpandTreeView: TCheckBox; + cbModuleVersionAsRevision: TCheckBox; + private + FOptions: TExceptionViewerOption; + function GetOptions: TExceptionViewerOption; + procedure SetOptions(const Value: TExceptionViewerOption); + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + property Options: TExceptionViewerOption read GetOptions write SetOptions; + end; + +{$IFDEF UNITVERSIONING} +const + UnitVersioning: TUnitVersionInfo = ( + RCSfile: '$URL: $'; + Revision: '$Revision: $'; + Date: '$Date: $'; + LogPath: '' + ); +{$ENDIF UNITVERSIONING} + +implementation + +{$R *.dfm} + +//=== { TJclStackTraceViewerConfigFrame } ==================================== + +constructor TJclStackTraceViewerConfigFrame.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + FOptions := TExceptionViewerOption.Create; +end; + +destructor TJclStackTraceViewerConfigFrame.Destroy; +begin + FOptions.Free; + inherited Destroy; +end; + +function TJclStackTraceViewerConfigFrame.GetOptions: TExceptionViewerOption; +begin + Result := FOptions; + FOptions.ExpandTreeView := cbExpandTreeView.Checked; + FOptions.ModuleVersionAsRevision := cbModuleVersionAsRevision.Checked; +end; + +procedure TJclStackTraceViewerConfigFrame.SetOptions(const Value: TExceptionViewerOption); +begin + FOptions.Assign(Value); + cbExpandTreeView.Checked := FOptions.ExpandTreeView; + cbModuleVersionAsRevision.Checked := FOptions.ModuleVersionAsRevision; +end; + +{$IFDEF UNITVERSIONING} +initialization + RegisterUnitVersion(HInstance, UnitVersioning); + +finalization + UnregisterUnitVersion(HInstance); +{$ENDIF UNITVERSIONING} + +end. Copied: branches/jcl-stack-trace/jcl/experts/stackviewer/JclStackTraceViewerExceptInfoFrame.dfm (from rev 2736, branches/jcl-stack-trace/jcl/experts/stackviewer/ExceptInfoFrame.dfm) =================================================================== --- branches/jcl-stack-trace/jcl/experts/stackviewer/JclStackTraceViewerExceptInfoFrame.dfm (rev 0) +++ branches/jcl-stack-trace/jcl/experts/stackviewer/JclStackTraceViewerExceptInfoFrame.dfm 2009-04-17 22:25:16 UTC (rev 2737) @@ -0,0 +1,35 @@ +object frmException: TfrmException + Left = 0 + Top = 0 + Width = 320 + Height = 240 + TabOrder = 0 + object Label1: TLabel + Left = 3 + Top = 3 + Width = 56 + Height = 13 + Caption = 'ClassName:' + end + object Label2: TLabel + Left = 3 + Top = 22 + Width = 46 + Height = 13 + Caption = 'Message:' + end + object lbExceptionClassName: TLabel + Left = 65 + Top = 3 + Width = 9 + Height = 13 + Caption = ' ' + end + object lbExceptionMessage: TLabel + Left = 65 + Top = 22 + Width = 9 + Height = 13 + Caption = ' ' + end +end Copied: branches/jcl-stack-trace/jcl/experts/stackviewer/JclStackTraceViewerExceptInfoFrame.pas (from rev 2736, branches/jcl-stack-trace/jcl/experts/stackviewer/ExceptInfoFrame.pas) =================================================================== --- branches/jcl-stack-trace/jcl/experts/stackviewer/JclStackTraceViewerExceptInfoFrame.pas (rev 0) +++ branches/jcl-stack-trace/jcl/experts/stackviewer/JclStackTraceViewerExceptInfoFrame.pas 2009-04-17 22:25:16 UTC (rev 2737) @@ -0,0 +1,97 @@ +{**************************************************************************************************} +{ } +{ Project JEDI Code Library (JCL) } +{ } +{ The contents of this file are subject to the Mozilla Public License Version 1.1 (the "License"); } +{ you may not use this file except in compliance with the License. You may obtain a copy of the } +{ License at http://www.mozilla.org/MPL/ } +{ } +{ Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF } +{ ANY KIND, either express or implied. See the License for the specific language governing rights } +{ and limitations under the License. } +{ } +{ The Original Code is JclStackTraceViewerExceptInfoFrame.pas. } +{ } +{ The Initial Developer of the Original Code is Uwe Schuster. } +{ Portions created by Uwe Schuster are Copyright (C) 2009 Uwe Schuster. All rights reserved. } +{ } +{ Contributor(s): } +{ Uwe Schuster (uschuster) } +{ } +{**************************************************************************************************} +{ } +{ Last modified: $Date:: $ } +{ Revision: $Rev:: $ } +{ Author: $Author:: $ } +{ } +{**************************************************************************************************} + +unit JclStackTraceViewerExceptInfoFrame; + +{$I jcl.inc} + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + StdCtrls, + {$IFDEF UNITVERSIONING} + JclUnitVersioning, + {$ENDIF UNITVERSIONING} + JclDebugSerialization; + +type + TfrmException = class(TFrame) + Label1: TLabel; + Label2: TLabel; + lbExceptionClassName: TLabel; + lbExceptionMessage: TLabel; + private + FException: TException; + procedure SetException(const Value: TException); + { Private declarations } + public + { Public declarations } + property Exception: TException read FException write SetException; + end; + +{$IFDEF UNITVERSIONING} +const + UnitVersioning: TUnitVersionInfo = ( + RCSfile: '$URL: $'; + Revision: '$Revision: $'; + Date: '$Date: $'; + LogPath: '' + ); +{$ENDIF UNITVERSIONING} + +implementation + +{$R *.dfm} + +{ TfrmException } + +procedure TfrmException.SetException(const Value: TException); +begin + FException := Value; + if Assigned(FException) then + begin + lbExceptionClassName.Caption := FException.ExceptionClassName; + lbExceptionMessage.Caption := FException.ExceptionMessage; + end + else + begin + lbExceptionClassName.Caption := ''; + lbExceptionMessage.Caption := ''; + end; +end; + +{$IFDEF UNITVERSIONING} +initialization + RegisterUnitVersion(HInstance, UnitVersioning); + +finalization + UnregisterUnitVersion(HInstance); +{$ENDIF UNITVERSIONING} + +end. Modified: branches/jcl-stack-trace/jcl/experts/stackviewer/JclStackTraceViewerExpert.dpk =================================================================== --- branches/jcl-stack-trace/jcl/experts/stackviewer/JclStackTraceViewerExpert.dpk 2009-04-15 22:40:28 UTC (rev 2736) +++ branches/jcl-stack-trace/jcl/experts/stackviewer/JclStackTraceViewerExpert.dpk 2009-04-17 22:25:16 UTC (rev 2737) @@ -37,8 +37,8 @@ vclx; contains - StackTraceViewerImpl in 'StackTraceViewerImpl.pas', - StackTraceViewerConfigFrame in 'StackTraceViewerConfigFrame.pas' {JclStackTraceViewerConfigFrame: TFrame}, + JclStackTraceViewerImpl in 'JclStackTraceViewerImpl.pas', + JclStackTraceViewerConfigFrame in 'JclStackTraceViewerConfigFrame.pas' {JclStackTraceViewerConfigFrame: TFrame}, StackViewForm in 'StackViewForm.pas' {frmStackView}; end. Copied: branches/jcl-stack-trace/jcl/experts/stackviewer/JclStackTraceViewerImpl.pas (from rev 2736, branches/jcl-stack-trace/jcl/experts/stackviewer/StackTraceViewerImpl.pas) =================================================================== --- branches/jcl-stack-trace/jcl/experts/stackviewer/JclStackTraceViewerImpl.pas (rev 0) +++ branches/jcl-stack-trace/jcl/experts/stackviewer/JclStackTraceViewerImpl.pas 2009-04-17 22:25:16 UTC (rev 2737) @@ -0,0 +1,310 @@ +{**************************************************************************************************} +{ } +{ Project JEDI Code Library (JCL) } +{ } +{ The contents of this file are subject to the Mozilla Public License Version 1.1 (the "License"); } +{ you may not use this file except in compliance with the License. You may obtain a copy of the } +{ License at http://www.mozilla.org/MPL/ } +{ } +{ Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF } +{ ANY KIND, either express or implied. See the License for the specific language governing rights } +{ and limitations under the License. } +{ } +{ The Original Code is JclStackTraceViewerImpl.pas. } +{ } +{ The Initial Developer of the Original Code is Uwe Schuster. } +{ Portions created by Uwe Schuster are Copyright (C) 2009 Uwe Schuster. All rights reserved. } +{ } +{ Contributor(s): } +{ Uwe Schuster (uschuster) } +{ } +{**************************************************************************************************} +{ } +{ Last modified: $Date:: $ } +{ Revision: $Rev:: $ } +{ Author: $Author:: $ } +{ } +{**************************************************************************************************} + +unit JclStackTraceViewerImpl; + +{$I jcl.inc} + +interface + +uses + Windows, Classes, Menus, ActnList, ToolsAPI, SysUtils, Graphics, Dialogs, Controls, Forms, + DeskUtil, + {$IFDEF UNITVERSIONING} + JclUnitVersioning, + {$ENDIF UNITVERSIONING} + JclOtaUtils, StackViewForm, JclStackTraceViewerConfigFrame, JclStackTraceViewerOptions; + +type + TJclStackTraceViewerExpert = class(TJclOTAExpert) + private + FIcon: TIcon; + FOptions: TExceptionViewerOption; + FOptionsFrame: TJclStackTraceViewerConfigFrame; + FStackTraceViewMenuItem: TMenuItem; + FStackTraceViewAction: TAction; + procedure ActionExecute(Sender: TObject); + procedure LoadExpertValues; + procedure SaveExpertValues; + public + constructor Create; reintroduce; + destructor Destroy; override; + procedure RegisterCommands; override; + procedure UnregisterCommands; override; + procedure AddConfigurationPages(AddPageFunc: TJclOTAAddPageFunc); override; + procedure ConfigurationClosed(AControl: TControl; SaveChanges: Boolean); override; + end; + +// design package entry point +procedure Register; + +// expert DLL entry point +function JCLWizardInit(const BorlandIDEServices: IBorlandIDEServices; + RegisterProc: TWizardRegisterProc; + var TerminateProc: TWizardTerminateProc): Boolean; stdcall; + +{$IFDEF UNITVERSIONING} +const + UnitVersioning: TUnitVersionInfo = ( + RCSfile: '$URL: $'; + Revision: '$Revision: $'; + Date: '$Date: $'; + LogPath: '' + ); +{$ENDIF UNITVERSIONING} + +implementation + +{$R JclStackTraceViewerIcon.res} + +uses + JclDebug, JclFileUtils, JclOtaConsts, + JclOtaResources; + +resourcestring + rsStackTraceViewerCaption = 'Stack Traces';//todo - move to JclOtaResources.pas + +const + JclStackTraceViewerExpertName = 'JclStackTraceViewerExpert';//todo - move to JclOtaConsts.pas + JclStackTraceViewerActionName = 'JCLStackTraceViewerCommand'; + JclStackTraceViewerMenuName = 'JCLStackTraceViewerMenu'; + +procedure Register; +begin + try + if Assigned(RegisterFieldAddress) then + RegisterFieldAddress(IDEDesktopIniSection, @frmStackView); + RegisterDesktopFormClass(TfrmStackView, IDEDesktopIniSection, IDEDesktopIniSection); + RegisterPackageWizard(TJclStackTraceViewerExpert.Create); + except + on ExceptionObj: TObject do + begin + JclExpertShowExceptionDialog(ExceptionObj); + raise; + end; + end; +end; + +var + JCLWizardIndex: Integer; + +procedure JclWizardTerminate; +begin + try + if JCLWizardIndex <> -1 then + TJclOTAExpertBase.GetOTAWizardServices.RemoveWizard(JCLWizardIndex); + except + on ExceptionObj: TObject do + begin + JclExpertShowExceptionDialog(ExceptionObj); + end; + end; +end; + +{ TODO -oUSc : test desktop state stuff (RegisterFieldAddress and RegisterDesktopFormClass) } +function JCLWizardInit(const BorlandIDEServices: IBorlandIDEServices; + RegisterProc: TWizardRegisterProc; + var TerminateProc: TWizardTerminateProc): Boolean stdcall; +begin + try + TerminateProc := JclWizardTerminate; + + if Assigned(RegisterFieldAddress) then + RegisterFieldAddress(IDEDesktopIniSection, @frmStackView); + RegisterDesktopFormClass(TfrmStackView, IDEDesktopIniSection, IDEDesktopIniSection); + JCLWizardIndex := TJclOTAExpertBase.GetOTAWizardServices.AddWizard(TJclStackTraceViewerExpert.Create); + + Result := True; + except + on ExceptionObj: TObject do + begin + JclExpertShowExceptionDialog(ExceptionObj); + Result := False; + end; + end; +end; + +//=== { TJclStackTraceViewerExpert } ========================================= + +constructor TJclStackTraceViewerExpert.Create; +begin + inherited Create(JclStackTraceViewerExpertName); + FOptions := TExceptionViewerOption.Create; +end; + +destructor TJclStackTraceViewerExpert.Destroy; +begin + FOptions.Free; + FreeAndNil(frmStackView); + inherited Destroy; +end; + +procedure TJclStackTraceViewerExpert.ActionExecute(Sender: TObject); +begin + try + if not Assigned(frmStackView) then + begin + frmStackView := TfrmStackView.Create(Application); + frmStackView.Icon := FIcon; + frmStackView.Options := FOptions; + frmStackView.RootDir := RootDir; + frmStackView.Show; + end + else + frmStackView.Show; + except + on ExceptionObj: TObject do + begin + JclExpertShowExceptionDialog(ExceptionObj); + raise; + end; + end; +end; + +procedure TJclStackTraceViewerExpert.AddConfigurationPages(AddPageFunc: TJclOTAAddPageFunc); +begin + inherited AddConfigurationPages(AddPageFunc); + FOptionsFrame := TJclStackTraceViewerConfigFrame.Create(nil); + FOptionsFrame.Options := FOptions; + AddPageFunc(FOptionsFrame, 'Stack Trace Viewer', Self);//todo - resourcestring +end; + +procedure TJclStackTraceViewerExpert.ConfigurationClosed(AControl: TControl; SaveChanges: Boolean); +begin + if (AControl = FOptionsFrame) and Assigned(FOptionsFrame) then + begin + if SaveChanges then + FOptions.Assign(FOptionsFrame.Options); + FreeAndNil(FOptionsFrame); + if SaveChanges and Assigned(frmStackView) then + frmStackView.Options := FOptions; + end + else + inherited ConfigurationClosed(AControl, SaveChanges); +end; + +procedure TJclStackTraceViewerExpert.LoadExpertValues; +begin + FOptions.ExpandTreeView := Settings.LoadBool('ExpandTreeView', FOptions.ExpandTreeView); + FOptions.ModuleVersionAsRevision := Settings.LoadBool('ModuleVersionAsRevision', FOptions.ModuleVersionAsRevision); +end; + +procedure TJclStackTraceViewerExpert.RegisterCommands; +var + I, ViewDebugMenuIdx: Integer; + IDEMenu: TMainMenu; + ViewMenu: TMenuItem; + Category: string; + ImageBmp: TBitmap; + NTAServices: INTAServices; +begin + inherited RegisterCommands; + + NTAServices := GetNTAServices; + + Category := ''; + { TODO : verify if command exists in <= D2007 } + for I := 0 to NTAServices.ActionList.ActionCount - 1 do + if CompareText(NTAServices.ActionList.Actions[I].Name, 'ViewPrjMgrCommand') = 0 then + begin + Category := NTAServices.ActionList.Actions[I].Category; + Break; + end; + + FIcon := TIcon.Create; + FIcon.Handle := LoadIcon(FindResourceHInstance(ModuleHInstance), 'JCLSTACKTRACEVIEWER'); + + // create actions + FStackTraceViewAction := TAction.Create(nil); + FStackTraceViewAction.Caption := rsStackTraceViewerCaption; + FStackTraceViewAction.Visible := True; + FStackTraceViewAction.OnExecute := ActionExecute; + FStackTraceViewAction.Category := Category; + FStackTraceViewAction.Name := JclStackTraceViewerActionName; + FStackTraceViewAction.ActionList := NTAServices.ActionList; + FStackTraceViewAction.ImageIndex := NTAServices.ImageList.AddIcon(FIcon); + + FStackTraceViewMenuItem := TMenuItem.Create(nil); + FStackTraceViewMenuItem.Name := JclStackTraceViewerMenuName; + FStackTraceViewMenuItem.Action := FStackTraceViewAction; + + IDEMenu := NTAServices.MainMenu; + + LoadExpertValues; + + ViewMenu := nil; + for I := 0 to IDEMenu.Items.Count - 1 do + if CompareText(IDEMenu.Items[I].Name, 'ViewsMenu') = 0 then + ViewMenu := IDEMenu.Items[I]; + if not Assigned(ViewMenu) then + raise EJclExpertException.CreateTrace(RsENoViewMenuItem); + + ViewDebugMenuIdx := -1; + for I := 0 to ViewMenu.Count - 1 do + if CompareText(ViewMenu.Items[I].Name, 'ViewDebugItem') = 0 then + begin + ViewDebugMenuIdx := I; + Break; + end; + if ViewDebugMenuIdx = -1 then + raise EJclExpertException.CreateTrace(RsENoDebugWindowsMenuItem); + + ViewMenu.Insert(ViewDebugMenuIdx + 1, FStackTraceViewMenuItem); + + RegisterAction(FStackTraceViewAction); +end; + +procedure TJclStackTraceViewerExpert.SaveExpertValues; +begin + Settings.SaveBool('ExpandTreeView', FOptions.ExpandTreeView); + Settings.SaveBool('ModuleVersionAsRevision', FOptions.ModuleVersionAsRevision); +end; + +procedure TJclStackTraceViewerExpert.UnregisterCommands; +begin + inherited UnregisterCommands; + SaveExpertValues; + UnregisterAction(FStackTraceViewAction); + FreeAndNil(FIcon); + FreeAndNil(FStackTraceViewMenuItem); + FreeAndNil(FStackTraceViewAction); +end; + +initialization + {$IFDEF UNITVERSIONING} + RegisterUnitVersion(HInstance, UnitVersioning); + {$ENDIF UNITVERSIONING} + +finalization + if Assigned(UnRegisterFieldAddress) then + UnRegisterFieldAddress(@frmStackView); + {$IFDEF UNITVERSIONING} + UnregisterUnitVersion(HInstance); + {$ENDIF UNITVERSIONING} + +end. Copied: branches/jcl-stack-trace/jcl/experts/stackviewer/JclStackTraceViewerModuleFrame.dfm (from rev 2736, branches/jcl-stack-trace/jcl/experts/stackviewer/ModuleFrame.dfm) =================================================================== --- branches/jcl-stack-trace/jcl/experts/stackviewer/JclStackTraceViewerModuleFrame.dfm (rev 0) +++ branches/jcl-stack-trace/jcl/experts/stackviewer/JclStackTraceViewerModuleFrame.dfm 2009-04-17 22:25:16 UTC (rev 2737) @@ -0,0 +1,41 @@ +object frmModule: TfrmModule + Left = 0 + Top = 0 + Width = 320 + Height = 240 + TabOrder = 0 + object lv: TListView + Left = 0 + Top = 0 + Width = 320 + Height = 240 + Align = alClient + Columns = < + item + Caption = 'StartAddr' + end + item + Caption = 'EndAddr' + end + item + Caption = 'SystemModule' + end + item + Caption = 'FileName' + end + item + Caption = 'BinFileVersion' + end + item + Caption = 'FileVersion' + end + item + Caption = 'FileDescription' + end> + GridLines = True + ReadOnly = True + RowSelect = True + TabOrder = 0 + ViewStyle = vsReport + end +end Copied: branches/jcl-stack-trace/jcl/experts/stackviewer/JclStackTraceViewerModuleFrame.pas (from rev 2736, branches/jcl-stack-trace/jcl/experts/stackviewer/ModuleFrame.pas) =================================================================== --- branches/jcl-stack-trace/jcl/experts/stackviewer/JclStackTraceViewerModuleFrame.pas (rev 0) +++ branches/jcl-stack-trace/jcl/experts/stackviewer/JclStackTraceViewerModuleFrame.pas 2009-04-17 22:25:16 UTC (rev 2737) @@ -0,0 +1,119 @@ +{**************************************************************************************************} +{ } +{ Project JEDI Code Library (JCL) } +{ } +{ The contents of this file are subject to the Mozilla Public License Version 1.1 (the "License"); } +{ you may not use this file except in compliance with the License. You may obtain a copy of the } +{ License at http://www.mozilla.org/MPL/ } +{ } +{ Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF } +{ ANY KIND, either express or implied. See the License for the specific language governing rights } +{ and limitations under the License. } +{ } +{ The Original Code is JclStackTraceViewerModuleFrame.pas. } +{ } +{ The Initial Developer of the Original Code is Uwe Schuster. } +{ Portions created by Uwe Schuster are Copyright (C) 2009 Uwe Schuster. All rights reserved. } +{ } +{ Contributor(s): } +{ Uwe Schuster (uschuster) } +{ } +{**************************************************************************************************} +{ } +{ Last modified: $Date:: $ } +{ Revision: $Rev:: $ } +{ Author: $Author:: $ } +{ } +{**************************************************************************************************} + +unit JclStackTraceViewerModuleFrame; + +{$I jcl.inc} + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + ComCtrls, IniFiles, + {$IFDEF UNITVERSIONING} + JclUnitVersioning, + {$ENDIF UNITVERSIONING} + JclDebugSerialization; + +type + TfrmModule = class(TFrame) + lv: TListView; + private + FModuleList: TModuleList; + procedure SetModuleList(const Value: TModuleList); + { Private declarations } + public + { Public declarations } + property ModuleList: TModuleList read FModuleList write SetModuleList; + procedure LoadState(AIni: TCustomIniFile; const ASection: string); + procedure SaveState(AIni: TCustomIniFile; const ASection: string); + end; + +{$IFDEF UNITVERSIONING} +const + UnitVersioning: TUnitVersionInfo = ( + RCSfile: '$URL: $'; + Revision: '$Revision: $'; + Date: '$Date: $'; + LogPath: '' + ); +{$ENDIF UNITVERSIONING} + +implementation + +{$R *.dfm} + +{ TfrmModule } + +procedure TfrmModule.LoadState(AIni: TCustomIniFile; const ASection: string); +var + I: Integer; +begin + for I := 0 to lv.Columns.Count - 1 do + lv.Columns.Items[I].Width := AIni.ReadInteger(ASection, + Format('ModuleFrameColumnWidth%d', [I]), lv.Columns.Items[I].Width); +end; + +procedure TfrmModule.SaveState(AIni: TCustomIniFile; const ASection: string); +var + I: Integer; +begin + for I := 0 to lv.Columns.Count - 1 do + AIni.WriteInteger(ASection, Format('ModuleFrameColumnWidth%d', [I]), lv.Columns.Items[I].Width); +end; + +procedure TfrmModule.SetModuleList(const Value: TModuleList); +var + I: Integer; + ListItem: TListItem; +begin + FModuleList := Value; + lv.Items.Clear; + for I := 0 to FModuleList.Count - 1 do + begin + ListItem := lv.Items.Add; + ListItem.Caption := FModuleList[I].StartStr; + ListItem.SubItems.Add(FModuleList[I].EndStr); + ListItem.SubItems.Add(FModuleList[I].SystemModuleStr); + ListItem.SubItems.Add(ExtractFileName(FModuleList[I].ModuleName)); + ListItem.SubItems.Add(FModuleList[I].BinFileVersion); + ListItem.SubItems.Add(FModuleList[I].FileVersion); + ListItem.SubItems.Add(FModuleList[I].FileDescription); + end; +end; + +{$IFDEF UNITVERSIONING} +initialization + RegisterUnitVersion(HInstance, UnitVersioning); + +finalization + UnregisterUnitVersion(HInstance); +{$ENDIF UNITVERSIONING} + +end. + Copied: branches/jcl-stack-trace/jcl/experts/stackviewer/JclStackTraceViewerOptions.pas (from rev 2736, branches/jcl-stack-trace/jcl/experts/stackviewer/ExceptionViewerOptionsUnit.pas) =================================================================== --- branches/jcl-stack-trace/jcl/experts/stackviewer/JclStackTraceViewerOptions.pas (rev 0) +++ branches/jcl-stack-trace/jcl/experts/stackviewer/JclStackTraceViewerOptions.pas 2009-04-17 22:25:16 UTC (rev 2737) @@ -0,0 +1,95 @@ +{**************************************************************************************************} +{ } +{ Project JEDI Code Library (JCL) } +{ } +{ The contents of this file are subject to the Mozilla Public License Version 1.1 (the "License"); } +{ you may not use this file except in compliance with the License. You may obtain a copy of the } +{ License at http://www.mozilla.org/MPL/ } +{ } +{ Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF } +{ ANY KIND, either express or implied. See the License for the specific language governing rights } +{ and limitations under the License. } +{ } +{ The Original Code is JclStackTraceViewerOptions.pas. } +{ } +{ The Initial Developer of the Original Code is Uwe Schuster. } +{ Portions created by Uwe Schuster are Copyright (C) 2009 Uwe Schuster. All rights reserved. } +{ } +{ Contributor(s): } +{ Uwe Schuster (uschuster) } +{ } +{**************************************************************************************************} +{ } +{ Last modified: $Date:: $ } +{ Revision: $Rev:: $ } +{ Author: $Author:: $ } +{ } +{**************************************************************************************************} + +unit JclStackTraceViewerOptions; + +{$I jcl.inc} + +interface + +uses + Classes + {$IFDEF UNITVERSIONING} + , JclUnitVersioning + {$ENDIF UNITVERSIONING} + ; + +type + TExceptionViewerOption = class(TPersistent) + private + FExpandTreeView: Boolean; + FModuleVersionAsRevision: Boolean; + protected + procedure AssignTo(Dest: TPersistent); override; + public + constructor Create; + property ExpandTreeView: Boolean read FExpandTreeView write FExpandTreeView; + property ModuleVersionAsRevision: Boolean read FModuleVersionAsRevision write FModuleVersionAsRevision; + end; + +{$IFDEF UNITVERSIONING} +const + UnitVersioning: TUnitVersionInfo = ( + RCSfile: '$URL: $'; + Revision: '$Revision: $'; + Date: '$Date: $'; + LogPath: '' + ); +{$ENDIF UNITVERSIONING} + +implementation + +{ TExceptionViewerOption } + +constructor TExceptionViewerOption.Create; +begin + inherited Create; + FExpandTreeView := False; + FModuleVersionAsRevision := False; +end; + +procedure TExceptionViewerOption.AssignTo(Dest: TPersistent); +begin + if Dest is TExceptionViewerOption then + begin + TExceptionViewerOption(Dest).FExpandTreeView := ExpandTreeView; + TExceptionViewerOption(Dest).FModuleVersionAsRevision := ModuleVersionAsRevision; + end + else + inherited AssignTo(Dest); +end; + +{$IFDEF UNITVERSIONING} +initialization + RegisterUnitVersion(HInstance, UnitVersioning); + +finalization + UnregisterUnitVersion(HInstance); +{$ENDIF UNITVERSIONING} + +end. Copied: branches/jcl-stack-trace/jcl/experts/stackviewer/JclStackTraceViewerStackFrame.dfm (from rev 2736, branches/jcl-stack-trace/jcl/experts/stackviewer/StackFrame.dfm) =================================================================== --- branches/jcl-stack-trace/jcl/experts/stackviewer/JclStackTraceViewerStackFrame.dfm (rev 0) +++ branches/jcl-stack-trace/jcl/experts/stackviewer/JclStackTraceViewerStackFrame.dfm 2009-04-17 22:25:16 UTC (rev 2737) @@ -0,0 +1,50 @@ +object frmStack: TfrmStack + Left = 0 + Top = 0 + Width = 320 + Height = 240 + TabOrder = 0 + object lv: TListView + Left = 0 + Top = 0 + Width = 320 + Height = 240 + Align = alClient + Columns = < + item + Caption = 'ModuleName' + end + item + Caption = 'SourceUnitName' + end + item + Caption = 'ProcedureName' + end + item + Caption = 'SourceName' + end + item + Caption = 'LineNumber' + end + item + Caption = 'LineNumberOffsetFromProcedureStart' + end + item... [truncated message content] |
From: <usc...@us...> - 2009-04-15 22:40:39
|
Revision: 2736 http://jcl.svn.sourceforge.net/jcl/?rev=2736&view=rev Author: uschuster Date: 2009-04-15 22:40:28 +0000 (Wed, 15 Apr 2009) Log Message: ----------- minor things: - moved GetFileEditorContent from StackViewForm.pas to StackCodeUtils.pas - removed Explicit* properties from form files to make them compatible with older versions - package updates Modified Paths: -------------- branches/jcl-stack-trace/jcl/experts/stackviewer/StackCodeUtils.pas branches/jcl-stack-trace/jcl/experts/stackviewer/StackViewForm.dfm branches/jcl-stack-trace/jcl/experts/stackviewer/StackViewForm.pas branches/jcl-stack-trace/jcl/experts/stackviewer/ThreadFrame.dfm branches/jcl-stack-trace/jcl/packages/d11/JclStackTraceViewerExpert.dpk branches/jcl-stack-trace/jcl/packages/d11/JclStackTraceViewerExpert.dproj branches/jcl-stack-trace/jcl/packages/d11/JclStackTraceViewerExpertDLL.dpr branches/jcl-stack-trace/jcl/packages/d11/JclStackTraceViewerExpertDLL.dproj branches/jcl-stack-trace/jcl/packages/d12/JclStackTraceViewerExpert.dpk branches/jcl-stack-trace/jcl/packages/d12/JclStackTraceViewerExpert.dproj branches/jcl-stack-trace/jcl/packages/d12/JclStackTraceViewerExpertDLL.dpr branches/jcl-stack-trace/jcl/packages/d12/JclStackTraceViewerExpertDLL.dproj branches/jcl-stack-trace/jcl/packages/xml/JclStackTraceViewerExpert-D.xml branches/jcl-stack-trace/jcl/packages/xml/JclStackTraceViewerExpertDLL-L.xml Modified: branches/jcl-stack-trace/jcl/experts/stackviewer/StackCodeUtils.pas =================================================================== --- branches/jcl-stack-trace/jcl/experts/stackviewer/StackCodeUtils.pas 2009-04-13 03:03:17 UTC (rev 2735) +++ branches/jcl-stack-trace/jcl/experts/stackviewer/StackCodeUtils.pas 2009-04-15 22:40:28 UTC (rev 2736) @@ -3,10 +3,11 @@ interface uses - SysUtils, ToolsAPI, StackViewUnit; + SysUtils, ActiveX, ToolsAPI, StackViewUnit; function FindModule(const AFileName: string): string; function FindModuleAndProject(const AFileName: string; var AProjectName: string): string; +function GetFileEditorContent(const AFileName: string): IStream; procedure JumpToCode(AStackViewItem: TStackViewItem); implementation @@ -65,6 +66,25 @@ end; end; +function GetFileEditorContent(const AFileName: string): IStream; +var + I: Integer; + Module: IOTAModule; + EditorContent: IOTAEditorContent; +begin + Result := nil; + Module := (BorlandIDEServices as IOTAModuleServices).FindModule(AFileName); + if Assigned(Module) then + begin + for I := 0 to Module.ModuleFileCount - 1 do + if Supports(Module.ModuleFileEditors[I], IOTAEditorContent, EditorContent) then + begin + Result := EditorContent.Content; + Break; + end; + end; +end; + procedure JumpToCode(AStackViewItem: TStackViewItem); var S, FileName: string; Modified: branches/jcl-stack-trace/jcl/experts/stackviewer/StackViewForm.dfm =================================================================== --- branches/jcl-stack-trace/jcl/experts/stackviewer/StackViewForm.dfm 2009-04-13 03:03:17 UTC (rev 2735) +++ branches/jcl-stack-trace/jcl/experts/stackviewer/StackViewForm.dfm 2009-04-15 22:40:28 UTC (rev 2736) @@ -5,28 +5,21 @@ KeyPreview = True PopupMenu = nil ShowHint = False - ExplicitWidth = 372 - ExplicitHeight = 365 PixelsPerInch = 96 TextHeight = 13 inherited Splitter1: TSplitter Width = 356 Constraints.MinHeight = 3 - ExplicitWidth = 260 end object Splitter2: TSplitter [1] Left = 145 Top = 54 Height = 277 - ExplicitLeft = 232 - ExplicitTop = 112 - ExplicitHeight = 100 end inherited ToolBar1: TToolBar Width = 356 ParentShowHint = False ShowHint = False - ExplicitWidth = 356 object ToolButton1: TToolButton Left = 4 Top = 0 @@ -77,7 +70,6 @@ Top = 33 Width = 356 Height = 21 - Align = alTop Style = csDropDownList ItemHeight = 13 TabOrder = 1 Modified: branches/jcl-stack-trace/jcl/experts/stackviewer/StackViewForm.pas =================================================================== --- branches/jcl-stack-trace/jcl/experts/stackviewer/StackViewForm.pas 2009-04-13 03:03:17 UTC (rev 2735) +++ branches/jcl-stack-trace/jcl/experts/stackviewer/StackViewForm.pas 2009-04-15 22:40:28 UTC (rev 2736) @@ -157,25 +157,6 @@ Result := FItems[AIndex]; end; -function GetFileEditorContent(const AFileName: string): IStream; -var - I: Integer; - Module: IOTAModule; - EditorContent: IOTAEditorContent; -begin - Result := nil; - Module := (BorlandIDEServices as IOTAModuleServices).FindModule(AFileName); - if Assigned(Module) then - begin - for I := 0 to Module.ModuleFileCount - 1 do - if Supports(Module.ModuleFileEditors[I], IOTAEditorContent, EditorContent) then - begin - Result := EditorContent.Content; - Break; - end; - end; -end; - procedure TfrmStackView.PrepareStack(AStack: TJclSerializableLocationInfoList; AStackItemList: TStackViewItemsList); var I, J, K, Idx, NewLineNumber: Integer; Modified: branches/jcl-stack-trace/jcl/experts/stackviewer/ThreadFrame.dfm =================================================================== --- branches/jcl-stack-trace/jcl/experts/stackviewer/ThreadFrame.dfm 2009-04-13 03:03:17 UTC (rev 2735) +++ branches/jcl-stack-trace/jcl/experts/stackviewer/ThreadFrame.dfm 2009-04-15 22:40:28 UTC (rev 2736) @@ -11,8 +11,6 @@ Height = 3 Cursor = crVSplit Align = alBottom - ExplicitTop = 41 - ExplicitWidth = 111 end object pnlExceptInfo: TPanel Left = 0 Modified: branches/jcl-stack-trace/jcl/packages/d11/JclStackTraceViewerExpert.dpk =================================================================== --- branches/jcl-stack-trace/jcl/packages/d11/JclStackTraceViewerExpert.dpk 2009-04-13 03:03:17 UTC (rev 2735) +++ branches/jcl-stack-trace/jcl/packages/d11/JclStackTraceViewerExpert.dpk 2009-04-15 22:40:28 UTC (rev 2736) @@ -4,7 +4,7 @@ DO NOT EDIT THIS FILE, IT IS GENERATED BY THE PACKAGE GENERATOR ALWAYS EDIT THE RELATED XML FILE (JclStackTraceViewerExpert-D.xml) - Last generated: 11-04-2009 11:49:00 UTC + Last generated: 15-04-2009 22:22:31 UTC ----------------------------------------------------------------------------- } @@ -55,13 +55,14 @@ ModuleFrame in '..\..\experts\stackviewer\ModuleFrame.pas' {frmModule: TFrame}, StackViewForm in '..\..\experts\stackviewer\StackViewForm.pas' {frmStackView}, StackTraceViewerConfigFrame in '..\..\experts\stackviewer\StackTraceViewerConfigFrame.pas' {JclStackTraceViewerConfigFrame: TFrame}, - JclDebugStackUtils in '..\..\experts\stackviewer\JclDebugStackUtils.pas' , StackViewUnit in '..\..\experts\stackviewer\StackViewUnit.pas' , StackCodeUtils in '..\..\experts\stackviewer\StackCodeUtils.pas' , ExceptionViewerOptionsUnit in '..\..\experts\stackviewer\ExceptionViewerOptionsUnit.pas' , StackLineNumberTranslator in '..\..\experts\stackviewer\StackLineNumberTranslator.pas' , JclStackTraceViewerAPI in '..\..\experts\stackviewer\JclStackTraceViewerAPI.pas' , - FileSearcherUnit in '..\..\experts\stackviewer\FileSearcherUnit.pas' + FileSearcherUnit in '..\..\experts\stackviewer\FileSearcherUnit.pas' , + JclDebugSerialization in '..\..\experts\stackviewer\JclDebugSerialization.pas' , + JclDebugXMLDeserializer in '..\..\experts\stackviewer\JclDebugXMLDeserializer.pas' ; end. Modified: branches/jcl-stack-trace/jcl/packages/d11/JclStackTraceViewerExpert.dproj =================================================================== --- branches/jcl-stack-trace/jcl/packages/d11/JclStackTraceViewerExpert.dproj 2009-04-13 03:03:17 UTC (rev 2735) +++ branches/jcl-stack-trace/jcl/packages/d11/JclStackTraceViewerExpert.dproj 2009-04-15 22:40:28 UTC (rev 2736) @@ -98,12 +98,13 @@ <DCCReference Include="..\..\experts\stackviewer\ModuleFrame.pas" /> <DCCReference Include="..\..\experts\stackviewer\StackViewForm.pas" /> <DCCReference Include="..\..\experts\stackviewer\StackTraceViewerConfigFrame.pas" /> - <DCCReference Include="..\..\experts\stackviewer\JclDebugStackUtils.pas" /> <DCCReference Include="..\..\experts\stackviewer\StackViewUnit.pas" /> <DCCReference Include="..\..\experts\stackviewer\StackCodeUtils.pas" /> <DCCReference Include="..\..\experts\stackviewer\ExceptionViewerOptionsUnit.pas" /> <DCCReference Include="..\..\experts\stackviewer\StackLineNumberTranslator.pas" /> <DCCReference Include="..\..\experts\stackviewer\JclStackTraceViewerAPI.pas" /> <DCCReference Include="..\..\experts\stackviewer\FileSearcherUnit.pas" /> + <DCCReference Include="..\..\experts\stackviewer\JclDebugSerialization.pas" /> + <DCCReference Include="..\..\experts\stackviewer\JclDebugXMLDeserializer.pas" /> </ItemGroup> </Project> Modified: branches/jcl-stack-trace/jcl/packages/d11/JclStackTraceViewerExpertDLL.dpr =================================================================== --- branches/jcl-stack-trace/jcl/packages/d11/JclStackTraceViewerExpertDLL.dpr 2009-04-13 03:03:17 UTC (rev 2735) +++ branches/jcl-stack-trace/jcl/packages/d11/JclStackTraceViewerExpertDLL.dpr 2009-04-15 22:40:28 UTC (rev 2736) @@ -4,7 +4,7 @@ DO NOT EDIT THIS FILE, IT IS GENERATED BY THE PACKAGE GENERATOR ALWAYS EDIT THE RELATED XML FILE (JclStackTraceViewerExpertDLL-L.xml) - Last generated: 11-04-2009 11:49:00 UTC + Last generated: 15-04-2009 22:22:31 UTC ----------------------------------------------------------------------------- } @@ -47,13 +47,14 @@ ModuleFrame in '..\..\experts\stackviewer\ModuleFrame.pas' {frmModule: TFrame}, StackViewForm in '..\..\experts\stackviewer\StackViewForm.pas' {frmStackView}, StackTraceViewerConfigFrame in '..\..\experts\stackviewer\StackTraceViewerConfigFrame.pas' {JclStackTraceViewerConfigFrame: TFrame}, - JclDebugStackUtils in '..\..\experts\stackviewer\JclDebugStackUtils.pas' , StackViewUnit in '..\..\experts\stackviewer\StackViewUnit.pas' , StackCodeUtils in '..\..\experts\stackviewer\StackCodeUtils.pas' , ExceptionViewerOptionsUnit in '..\..\experts\stackviewer\ExceptionViewerOptionsUnit.pas' , StackLineNumberTranslator in '..\..\experts\stackviewer\StackLineNumberTranslator.pas' , JclStackTraceViewerAPI in '..\..\experts\stackviewer\JclStackTraceViewerAPI.pas' , - FileSearcherUnit in '..\..\experts\stackviewer\FileSearcherUnit.pas' + FileSearcherUnit in '..\..\experts\stackviewer\FileSearcherUnit.pas' , + JclDebugSerialization in '..\..\experts\stackviewer\JclDebugSerialization.pas' , + JclDebugXMLDeserializer in '..\..\experts\stackviewer\JclDebugXMLDeserializer.pas' ; exports Modified: branches/jcl-stack-trace/jcl/packages/d11/JclStackTraceViewerExpertDLL.dproj =================================================================== --- branches/jcl-stack-trace/jcl/packages/d11/JclStackTraceViewerExpertDLL.dproj 2009-04-13 03:03:17 UTC (rev 2735) +++ branches/jcl-stack-trace/jcl/packages/d11/JclStackTraceViewerExpertDLL.dproj 2009-04-15 22:40:28 UTC (rev 2736) @@ -98,12 +98,13 @@ <DCCReference Include="..\..\experts\stackviewer\ModuleFrame.pas" /> <DCCReference Include="..\..\experts\stackviewer\StackViewForm.pas" /> <DCCReference Include="..\..\experts\stackviewer\StackTraceViewerConfigFrame.pas" /> - <DCCReference Include="..\..\experts\stackviewer\JclDebugStackUtils.pas" /> <DCCReference Include="..\..\experts\stackviewer\StackViewUnit.pas" /> <DCCReference Include="..\..\experts\stackviewer\StackCodeUtils.pas" /> <DCCReference Include="..\..\experts\stackviewer\ExceptionViewerOptionsUnit.pas" /> <DCCReference Include="..\..\experts\stackviewer\StackLineNumberTranslator.pas" /> <DCCReference Include="..\..\experts\stackviewer\JclStackTraceViewerAPI.pas" /> <DCCReference Include="..\..\experts\stackviewer\FileSearcherUnit.pas" /> + <DCCReference Include="..\..\experts\stackviewer\JclDebugSerialization.pas" /> + <DCCReference Include="..\..\experts\stackviewer\JclDebugXMLDeserializer.pas" /> </ItemGroup> </Project> Modified: branches/jcl-stack-trace/jcl/packages/d12/JclStackTraceViewerExpert.dpk =================================================================== --- branches/jcl-stack-trace/jcl/packages/d12/JclStackTraceViewerExpert.dpk 2009-04-13 03:03:17 UTC (rev 2735) +++ branches/jcl-stack-trace/jcl/packages/d12/JclStackTraceViewerExpert.dpk 2009-04-15 22:40:28 UTC (rev 2736) @@ -4,7 +4,7 @@ DO NOT EDIT THIS FILE, IT IS GENERATED BY THE PACKAGE GENERATOR ALWAYS EDIT THE RELATED XML FILE (JclStackTraceViewerExpert-D.xml) - Last generated: 11-04-2009 12:04:25 UTC + Last generated: 15-04-2009 22:22:31 UTC ----------------------------------------------------------------------------- } @@ -55,13 +55,14 @@ ModuleFrame in '..\..\experts\stackviewer\ModuleFrame.pas' {frmModule: TFrame}, StackViewForm in '..\..\experts\stackviewer\StackViewForm.pas' {frmStackView}, StackTraceViewerConfigFrame in '..\..\experts\stackviewer\StackTraceViewerConfigFrame.pas' {JclStackTraceViewerConfigFrame: TFrame}, - JclDebugStackUtils in '..\..\experts\stackviewer\JclDebugStackUtils.pas' , StackViewUnit in '..\..\experts\stackviewer\StackViewUnit.pas' , StackCodeUtils in '..\..\experts\stackviewer\StackCodeUtils.pas' , ExceptionViewerOptionsUnit in '..\..\experts\stackviewer\ExceptionViewerOptionsUnit.pas' , StackLineNumberTranslator in '..\..\experts\stackviewer\StackLineNumberTranslator.pas' , JclStackTraceViewerAPI in '..\..\experts\stackviewer\JclStackTraceViewerAPI.pas' , - FileSearcherUnit in '..\..\experts\stackviewer\FileSearcherUnit.pas' + FileSearcherUnit in '..\..\experts\stackviewer\FileSearcherUnit.pas' , + JclDebugSerialization in '..\..\experts\stackviewer\JclDebugSerialization.pas' , + JclDebugXMLDeserializer in '..\..\experts\stackviewer\JclDebugXMLDeserializer.pas' ; end. Modified: branches/jcl-stack-trace/jcl/packages/d12/JclStackTraceViewerExpert.dproj =================================================================== --- branches/jcl-stack-trace/jcl/packages/d12/JclStackTraceViewerExpert.dproj 2009-04-13 03:03:17 UTC (rev 2735) +++ branches/jcl-stack-trace/jcl/packages/d12/JclStackTraceViewerExpert.dproj 2009-04-15 22:40:28 UTC (rev 2736) @@ -74,13 +74,14 @@ <DCCReference Include="..\..\experts\stackviewer\ModuleFrame.pas" /> <DCCReference Include="..\..\experts\stackviewer\StackViewForm.pas" /> <DCCReference Include="..\..\experts\stackviewer\StackTraceViewerConfigFrame.pas" /> - <DCCReference Include="..\..\experts\stackviewer\JclDebugStackUtils.pas" /> <DCCReference Include="..\..\experts\stackviewer\StackViewUnit.pas" /> <DCCReference Include="..\..\experts\stackviewer\StackCodeUtils.pas" /> <DCCReference Include="..\..\experts\stackviewer\ExceptionViewerOptionsUnit.pas" /> <DCCReference Include="..\..\experts\stackviewer\StackLineNumberTranslator.pas" /> <DCCReference Include="..\..\experts\stackviewer\JclStackTraceViewerAPI.pas" /> <DCCReference Include="..\..\experts\stackviewer\FileSearcherUnit.pas" /> + <DCCReference Include="..\..\experts\stackviewer\JclDebugSerialization.pas" /> + <DCCReference Include="..\..\experts\stackviewer\JclDebugXMLDeserializer.pas" /> <BuildConfiguration Include="Base"> <Key>Base</Key> </BuildConfiguration> Modified: branches/jcl-stack-trace/jcl/packages/d12/JclStackTraceViewerExpertDLL.dpr =================================================================== --- branches/jcl-stack-trace/jcl/packages/d12/JclStackTraceViewerExpertDLL.dpr 2009-04-13 03:03:17 UTC (rev 2735) +++ branches/jcl-stack-trace/jcl/packages/d12/JclStackTraceViewerExpertDLL.dpr 2009-04-15 22:40:28 UTC (rev 2736) @@ -4,7 +4,7 @@ DO NOT EDIT THIS FILE, IT IS GENERATED BY THE PACKAGE GENERATOR ALWAYS EDIT THE RELATED XML FILE (JclStackTraceViewerExpertDLL-L.xml) - Last generated: 11-04-2009 12:04:25 UTC + Last generated: 15-04-2009 22:22:31 UTC ----------------------------------------------------------------------------- } @@ -47,13 +47,14 @@ ModuleFrame in '..\..\experts\stackviewer\ModuleFrame.pas' {frmModule: TFrame}, StackViewForm in '..\..\experts\stackviewer\StackViewForm.pas' {frmStackView}, StackTraceViewerConfigFrame in '..\..\experts\stackviewer\StackTraceViewerConfigFrame.pas' {JclStackTraceViewerConfigFrame: TFrame}, - JclDebugStackUtils in '..\..\experts\stackviewer\JclDebugStackUtils.pas' , StackViewUnit in '..\..\experts\stackviewer\StackViewUnit.pas' , StackCodeUtils in '..\..\experts\stackviewer\StackCodeUtils.pas' , ExceptionViewerOptionsUnit in '..\..\experts\stackviewer\ExceptionViewerOptionsUnit.pas' , StackLineNumberTranslator in '..\..\experts\stackviewer\StackLineNumberTranslator.pas' , JclStackTraceViewerAPI in '..\..\experts\stackviewer\JclStackTraceViewerAPI.pas' , - FileSearcherUnit in '..\..\experts\stackviewer\FileSearcherUnit.pas' + FileSearcherUnit in '..\..\experts\stackviewer\FileSearcherUnit.pas' , + JclDebugSerialization in '..\..\experts\stackviewer\JclDebugSerialization.pas' , + JclDebugXMLDeserializer in '..\..\experts\stackviewer\JclDebugXMLDeserializer.pas' ; exports Modified: branches/jcl-stack-trace/jcl/packages/d12/JclStackTraceViewerExpertDLL.dproj =================================================================== --- branches/jcl-stack-trace/jcl/packages/d12/JclStackTraceViewerExpertDLL.dproj 2009-04-13 03:03:17 UTC (rev 2735) +++ branches/jcl-stack-trace/jcl/packages/d12/JclStackTraceViewerExpertDLL.dproj 2009-04-15 22:40:28 UTC (rev 2736) @@ -74,13 +74,14 @@ <DCCReference Include="..\..\experts\stackviewer\ModuleFrame.pas" /> <DCCReference Include="..\..\experts\stackviewer\StackViewForm.pas" /> <DCCReference Include="..\..\experts\stackviewer\StackTraceViewerConfigFrame.pas" /> - <DCCReference Include="..\..\experts\stackviewer\JclDebugStackUtils.pas" /> <DCCReference Include="..\..\experts\stackviewer\StackViewUnit.pas" /> <DCCReference Include="..\..\experts\stackviewer\StackCodeUtils.pas" /> <DCCReference Include="..\..\experts\stackviewer\ExceptionViewerOptionsUnit.pas" /> <DCCReference Include="..\..\experts\stackviewer\StackLineNumberTranslator.pas" /> <DCCReference Include="..\..\experts\stackviewer\JclStackTraceViewerAPI.pas" /> <DCCReference Include="..\..\experts\stackviewer\FileSearcherUnit.pas" /> + <DCCReference Include="..\..\experts\stackviewer\JclDebugSerialization.pas" /> + <DCCReference Include="..\..\experts\stackviewer\JclDebugXMLDeserializer.pas" /> <BuildConfiguration Include="Base"> <Key>Base</Key> </BuildConfiguration> Modified: branches/jcl-stack-trace/jcl/packages/xml/JclStackTraceViewerExpert-D.xml =================================================================== --- branches/jcl-stack-trace/jcl/packages/xml/JclStackTraceViewerExpert-D.xml 2009-04-13 03:03:17 UTC (rev 2735) +++ branches/jcl-stack-trace/jcl/packages/xml/JclStackTraceViewerExpert-D.xml 2009-04-15 22:40:28 UTC (rev 2736) @@ -26,12 +26,13 @@ <File Name="..\..\experts\stackviewer\ModuleFrame.pas" Targets="Windows" Formname="frmModule: TFrame" Condition=""/> <File Name="..\..\experts\stackviewer\StackViewForm.pas" Targets="Windows" Formname="frmStackView" Condition=""/> <File Name="..\..\experts\stackviewer\StackTraceViewerConfigFrame.pas" Targets="Windows" Formname="JclStackTraceViewerConfigFrame: TFrame" Condition=""/> - <File Name="..\..\experts\stackviewer\JclDebugStackUtils.pas" Targets="Windows" Formname="" Condition=""/> <File Name="..\..\experts\stackviewer\StackViewUnit.pas" Targets="Windows" Formname="" Condition=""/> <File Name="..\..\experts\stackviewer\StackCodeUtils.pas" Targets="Windows" Formname="" Condition=""/> <File Name="..\..\experts\stackviewer\ExceptionViewerOptionsUnit.pas" Targets="Windows" Formname="" Condition=""/> <File Name="..\..\experts\stackviewer\StackLineNumberTranslator.pas" Targets="Windows" Formname="" Condition=""/> <File Name="..\..\experts\stackviewer\JclStackTraceViewerAPI.pas" Targets="Windows" Formname="" Condition=""/> <File Name="..\..\experts\stackviewer\FileSearcherUnit.pas" Targets="Windows" Formname="" Condition=""/> + <File Name="..\..\experts\stackviewer\JclDebugSerialization.pas" Targets="Windows" Formname="" Condition=""/> + <File Name="..\..\experts\stackviewer\JclDebugXMLDeserializer.pas" Targets="Windows" Formname="" Condition=""/> </Contains> </Package> Modified: branches/jcl-stack-trace/jcl/packages/xml/JclStackTraceViewerExpertDLL-L.xml =================================================================== --- branches/jcl-stack-trace/jcl/packages/xml/JclStackTraceViewerExpertDLL-L.xml 2009-04-13 03:03:17 UTC (rev 2735) +++ branches/jcl-stack-trace/jcl/packages/xml/JclStackTraceViewerExpertDLL-L.xml 2009-04-15 22:40:28 UTC (rev 2736) @@ -26,12 +26,13 @@ <File Name="..\..\experts\stackviewer\ModuleFrame.pas" Targets="Windows" Formname="frmModule: TFrame" Condition=""/> <File Name="..\..\experts\stackviewer\StackViewForm.pas" Targets="Windows" Formname="frmStackView" Condition=""/> <File Name="..\..\experts\stackviewer\StackTraceViewerConfigFrame.pas" Targets="Windows" Formname="JclStackTraceViewerConfigFrame: TFrame" Condition=""/> - <File Name="..\..\experts\stackviewer\JclDebugStackUtils.pas" Targets="Windows" Formname="" Condition=""/> <File Name="..\..\experts\stackviewer\StackViewUnit.pas" Targets="Windows" Formname="" Condition=""/> <File Name="..\..\experts\stackviewer\StackCodeUtils.pas" Targets="Windows" Formname="" Condition=""/> <File Name="..\..\experts\stackviewer\ExceptionViewerOptionsUnit.pas" Targets="Windows" Formname="" Condition=""/> <File Name="..\..\experts\stackviewer\StackLineNumberTranslator.pas" Targets="Windows" Formname="" Condition=""/> <File Name="..\..\experts\stackviewer\JclStackTraceViewerAPI.pas" Targets="Windows" Formname="" Condition=""/> <File Name="..\..\experts\stackviewer\FileSearcherUnit.pas" Targets="Windows" Formname="" Condition=""/> + <File Name="..\..\experts\stackviewer\JclDebugSerialization.pas" Targets="Windows" Formname="" Condition=""/> + <File Name="..\..\experts\stackviewer\JclDebugXMLDeserializer.pas" Targets="Windows" Formname="" Condition=""/> </Contains> </Package> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jg...@us...> - 2009-04-13 03:03:26
|
Revision: 2735 http://jcl.svn.sourceforge.net/jcl/?rev=2735&view=rev Author: jgsoft Date: 2009-04-13 03:03:17 +0000 (Mon, 13 Apr 2009) Log Message: ----------- Added TJclCompressionItem.Encrypted property to check whether the file is encrypted in the archive. Trying to extract an encrypted file without the proper password raises a non-descriptive "data error" exception. Commented out calls to ReleaseVolumes because those cause subsequent operations on the archive to fail with an "unsupported method" exception. Modified Paths: -------------- trunk/jcl/source/common/JclCompression.pas Modified: trunk/jcl/source/common/JclCompression.pas =================================================================== --- trunk/jcl/source/common/JclCompression.pas 2009-04-12 21:54:27 UTC (rev 2734) +++ trunk/jcl/source/common/JclCompression.pas 2009-04-13 03:03:17 UTC (rev 2735) @@ -546,7 +546,7 @@ TJclCompressionItemProperty = (ipPackedName, ipPackedSize, ipPackedExtension, ipFileSize, ipFileName, ipAttributes, ipCreationTime, ipLastAccessTime, ipLastWriteTime, ipComment, ipHostOS, ipHostFS, ipUser, ipGroup, ipCRC, - ipStream, ipMethod); + ipStream, ipMethod, ipEncrypted); TJclCompressionItemProperties = set of TJclCompressionItemProperty; TJclCompressionItemKind = (ikFile, ikDirectory); @@ -588,6 +588,7 @@ FGroup: WideString; FCRC: Cardinal; FMethod: WideString; + FEncrypted: Boolean; protected // property checkers procedure CheckGetProperty(AProperty: TJclCompressionItemProperty); virtual; abstract; @@ -600,6 +601,7 @@ function GetComment: WideString; function GetCRC: Cardinal; function GetCreationTime: TFileTime; + function GetEncrypted: Boolean; function GetFileName: TFileName; function GetFileSize: Int64; function GetGroup: WideString; @@ -619,6 +621,7 @@ procedure SetComment(const Value: WideString); procedure SetCRC(Value: Cardinal); procedure SetCreationTime(const Value: TFileTime); + procedure SetEncrypted(const Value: Boolean); procedure SetFileName(const Value: TFileName); procedure SetFileSize(const Value: Int64); procedure SetGroup(const Value: WideString); @@ -642,6 +645,7 @@ property Comment: WideString read GetComment write SetComment; property CRC: Cardinal read GetCRC write SetCRC; property CreationTime: TFileTime read GetCreationTime write SetCreationTime; + property Encrypted: Boolean read GetEncrypted write SetEncrypted; property FileSize: Int64 read GetFileSize write SetFileSize; property Group: WideString read GetGroup write SetGroup; property HostOS: WideString read GetHostOS write SetHostOS; @@ -3365,6 +3369,12 @@ Result := FCreationTime; end; +function TJclCompressionItem.GetEncrypted: Boolean; +begin + CheckGetProperty(ipEncrypted); + Result := FEncrypted; +end; + function TJclCompressionItem.GetFileName: TFileName; begin CheckGetProperty(ipFileName); @@ -3514,6 +3524,14 @@ Include(FValidProperties, ipCreationTime); end; +procedure TJclCompressionItem.SetEncrypted(const Value: Boolean); +begin + CheckSetProperty(ipEncrypted); + FEncrypted := Value; + Include(FModifiedProperties, ipEncrypted); + Include(FValidProperties, ipEncrypted); +end; + procedure TJclCompressionItem.SetFileName(const Value: TFileName); var AFindData: TWin32FindData; @@ -4441,7 +4459,8 @@ procedure TJclCompressArchive.Compress; begin - ReleaseVolumes; +// Calling ReleaseVolumes here causes subsequent operations on the archive to fail with an "unsupported method" exception +// ReleaseVolumes; end; procedure TJclCompressArchive.InternalAddDirectory(const Directory: string); @@ -4516,13 +4535,15 @@ procedure TJclDecompressArchive.ExtractAll(const ADestinationDir: string; AAutoCreateSubDir: Boolean); begin - ReleaseVolumes; +// Calling ReleaseVolumes here causes subsequent operations on the archive to fail with an "unsupported method" exception +// ReleaseVolumes; end; procedure TJclDecompressArchive.ExtractSelected(const ADestinationDir: string; AAutoCreateSubDir: Boolean); begin - ReleaseVolumes; +// Calling ReleaseVolumes here causes subsequent operations on the archive to fail with an "unsupported method" exception +// ReleaseVolumes; end; class function TJclDecompressArchive.ItemAccess: TJclStreamAccess; @@ -4619,13 +4640,15 @@ procedure TJclUpdateArchive.ExtractAll(const ADestinationDir: string; AAutoCreateSubDir: Boolean); begin - ReleaseVolumes; +// Calling ReleaseVolumes here causes subsequent operations on the archive to fail with an "unsupported method" exception +// ReleaseVolumes; end; procedure TJclUpdateArchive.ExtractSelected(const ADestinationDir: string; AAutoCreateSubDir: Boolean); begin - ReleaseVolumes; +// Calling ReleaseVolumes here causes subsequent operations on the archive to fail with an "unsupported method" exception +// ReleaseVolumes; end; class function TJclUpdateArchive.ItemAccess: TJclStreamAccess; @@ -5087,6 +5110,7 @@ TCardinalSetter = procedure (Value: Cardinal) of object; TInt64Setter = procedure (const Value: Int64) of object; TFileTimeSetter = procedure (const Value: TFileTime) of object; + TBoolSetter = procedure (const Value: Boolean) of object; function Get7zWideStringProp(const AArchive: IInArchive; ItemIndex: Integer; PropID: Cardinal; const Setter: TWideStringSetter): Boolean; @@ -5255,6 +5279,26 @@ end; end; +function Get7zBoolProp(const AArchive: IInArchive; ItemIndex: Integer; + PropID: Cardinal; const Setter: TBoolSetter): Boolean; +var + Value: TPropVariant; +begin + ZeroMemory(@Value, SizeOf(Value)); + SevenzipCheck(AArchive.GetProperty(ItemIndex, PropID, Value)); + case Value.vt of + VT_EMPTY, VT_NULL: + Result := False; + VT_BOOL: + begin + Result := True; + Setter(Value.bool); + end; + else + raise EJclCompressionError.CreateResFmt(@RsCompression7zUnknownValueType, [Value.vt, PropID]); + end; +end; + // TODO: Are changes for UTF-8 filenames (>= 4.58 beta) necessary? procedure Load7zFileAttribute(AInArchive: IInArchive; ItemIndex: Integer; AItem: TJclCompressionItem); @@ -5281,6 +5325,7 @@ Get7zWideStringProp(AInArchive, ItemIndex, kpidGroup, AItem.SetGroup); Get7zCardinalProp(AInArchive, ItemIndex, kpidCRC, AItem.SetCRC); Get7zWideStringProp(AInArchive, ItemIndex, kpidMethod, AItem.SetMethod); + Get7zBoolProp(AInArchive, ItemIndex, kpidEncrypted, AItem.SetEncrypted); // reset modified flags AItem.ModifiedProperties := []; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <usc...@us...> - 2009-04-12 21:54:34
|
Revision: 2734 http://jcl.svn.sourceforge.net/jcl/?rev=2734&view=rev Author: uschuster Date: 2009-04-12 21:54:27 +0000 (Sun, 12 Apr 2009) Log Message: ----------- * new serialization - JclDebugSerialization is based on JclDebugStackUtils - JclDebug: reworked location info and thread info classes to allow descendant classes with additional properties * JclDebug: added unit versioning stuff to TJclLocationInfoEx as single properties and they are now always available, but only filled if UNITVERSIONING is defined * fixed loading of the Revision Modified Paths: -------------- branches/jcl-stack-trace/jcl/TODO.txt branches/jcl-stack-trace/jcl/examples/windows/debug/mttest/JclDebugMTTestMain.pas branches/jcl-stack-trace/jcl/experts/stackviewer/ExceptInfoFrame.pas branches/jcl-stack-trace/jcl/experts/stackviewer/ModuleFrame.pas branches/jcl-stack-trace/jcl/experts/stackviewer/StackViewForm.pas branches/jcl-stack-trace/jcl/experts/stackviewer/ThreadFrame.pas branches/jcl-stack-trace/jcl/source/windows/JclDebug.pas Added Paths: ----------- branches/jcl-stack-trace/jcl/experts/stackviewer/JclDebugSerialization.pas branches/jcl-stack-trace/jcl/experts/stackviewer/JclDebugXMLDeserializer.pas branches/jcl-stack-trace/jcl/experts/stackviewer/JclDebugXMLSerializer.pas Removed Paths: ------------- branches/jcl-stack-trace/jcl/experts/stackviewer/JclDebugStackUtils.pas Modified: branches/jcl-stack-trace/jcl/TODO.txt =================================================================== --- branches/jcl-stack-trace/jcl/TODO.txt 2009-04-11 12:45:00 UTC (rev 2733) +++ branches/jcl-stack-trace/jcl/TODO.txt 2009-04-12 21:54:27 UTC (rev 2734) @@ -11,19 +11,18 @@ * ? merge TJclDebugThreadInfo/TJclDebugThreadList and TJclThreadInfo/TJclThreadInfoList - investigate if the stack can stay a TJclStackInfoList and if the location information can be retrieved later correctly +* remove AsCSV + Expert ------ * serialization - - saving/loading + - (Done?) saving/loading - which classes for the viewer? (for exam. JclDebug.TJclModuleInfoList vs. JclDebugStackUtils.TModuleList; TJclModuleInfoList doesn't store the module name, because this can be get from the handle which doesn't work in the viewer) -* Revision property - - load revision info provide in stack trace - * progress for TfrmStackView.PrepareStack (getting revisions from a real SCM system can take some time) Modified: branches/jcl-stack-trace/jcl/examples/windows/debug/mttest/JclDebugMTTestMain.pas =================================================================== --- branches/jcl-stack-trace/jcl/examples/windows/debug/mttest/JclDebugMTTestMain.pas 2009-04-11 12:45:00 UTC (rev 2733) +++ branches/jcl-stack-trace/jcl/examples/windows/debug/mttest/JclDebugMTTestMain.pas 2009-04-12 21:54:27 UTC (rev 2734) @@ -6,7 +6,7 @@ uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - StdCtrls, PSAPI, JclDebug, JclFileUtils; + StdCtrls, PSAPI, JclDebug, JclFileUtils, JclDebugSerialization, JclDebugXMLSerializer; type TMTTestForm = class(TForm) @@ -76,9 +76,60 @@ end; end; +procedure LoadedModulesNew(ModuleList: TModuleList); +var + I: Integer; + ProcessHandle: THandle; + FileName: array [0..Max_Path] of Char; + S, BinFileVersion, FileVersion, FileDescription: string; + FileVersionInfo: TJclFileVersionInfo; + ModuleInfoList: TJclModuleInfoList; + ModuleBase: Cardinal; + Module: TModule; +begin + ProcessHandle := GetCurrentProcess; + ModuleInfoList := TJclModuleInfoList.Create(False, False); + try + for I := 0 to ModuleInfoList.Count - 1 do + begin + ModuleBase := Cardinal(ModuleInfoList.Items[I].StartAddr); + GetModuleFileNameEx(ProcessHandle, ModuleBase, FileName, SizeOf(FileName)); + FileVersion := ''; + if (FileName <> '') and VersionResourceAvailable(FileName) then + begin + FileVersionInfo := TJclFileVersionInfo.Create(FileName); + try + BinFileVersion := FileVersionInfo.BinFileVersion; + FileVersion := FileVersionInfo.FileVersion; + FileDescription := FileVersionInfo.FileDescription; + finally + FileVersionInfo.Free; + end; + end; + if ModuleInfoList.Items[I].SystemModule then + S := '1' + else + S := '0'; + Module := ModuleList.Add; + Module.StartStr := Format('0x%.8x', [ModuleBase]); + Module.EndStr := Format('0x%.8x', [Cardinal(ModuleInfoList.Items[I].EndAddr)]); + Module.SystemModuleStr := S; + Module.ModuleName := FileName; + Module.BinFileVersion := BinFileVersion; + Module.FileVersion := FileVersion; + Module.FileDescription := FileDescription; + end; + finally + ModuleInfoList.Free; + end; +end; + procedure SaveExceptInfo(AExceptObj: TObject; AThreadInfoList: TJclThreadInfoList); var StackInfo, DetailSL: TStringList; + ExceptionInfo: TExceptionInfo; + XMLSerializer: TJclXMLSerializer; + I: Integer; begin StackInfo := TStringList.Create; try @@ -106,6 +157,30 @@ finally StackInfo.Free; end; + + ExceptionInfo := TExceptionInfo.Create; + try + ExceptionInfo.Exception.ExceptionClassName := Exception(AExceptObj).ClassName; + ExceptionInfo.Exception.ExceptionMessage := Exception(AExceptObj).Message; + LoadedModulesNew(ExceptionInfo.Modules); + for I := 0 to AThreadInfoList.Count - 1 do + ExceptionInfo.ThreadInfoList.Add.Assign(AThreadInfoList[I]);//todo - implement Assign + XMLSerializer := TJclXMLSerializer.Create('ExceptInfo'); + try + ExceptionInfo.Serialize(XMLSerializer); + StackInfo := TStringList.Create; + try + StackInfo.Text := XMLSerializer.SaveToString; + StackInfo.SaveToFile('ExceptInfo.xml'); + finally + StackInfo.Free; + end; + finally + XMLSerializer.Free; + end; + finally + ExceptionInfo.Free; + end; end; type Modified: branches/jcl-stack-trace/jcl/experts/stackviewer/ExceptInfoFrame.pas =================================================================== --- branches/jcl-stack-trace/jcl/experts/stackviewer/ExceptInfoFrame.pas 2009-04-11 12:45:00 UTC (rev 2733) +++ branches/jcl-stack-trace/jcl/experts/stackviewer/ExceptInfoFrame.pas 2009-04-12 21:54:27 UTC (rev 2734) @@ -3,8 +3,8 @@ interface uses - Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, - Dialogs, StdCtrls, JclDebugStackUtils; + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + StdCtrls, JclDebugSerialization; type TfrmException = class(TFrame) Added: branches/jcl-stack-trace/jcl/experts/stackviewer/JclDebugSerialization.pas =================================================================== --- branches/jcl-stack-trace/jcl/experts/stackviewer/JclDebugSerialization.pas (rev 0) +++ branches/jcl-stack-trace/jcl/experts/stackviewer/JclDebugSerialization.pas 2009-04-12 21:54:27 UTC (rev 2734) @@ -0,0 +1,571 @@ +unit JclDebugSerialization; + +interface + +uses + SysUtils, Classes, Contnrs, JclDebug; + +type + TJclCustomSimpleSerializer = class(TObject) + protected + FItems: TObjectList; + FName: string; + FValues: TStringList; + function GetCount: Integer; + function GetItems(AIndex: Integer): TJclCustomSimpleSerializer; + public + constructor Create(const AName: string); + destructor Destroy; override; + function AddChild(ASender: TObject; const AName: string): TJclCustomSimpleSerializer; + procedure Clear; + function ReadString(ASender: TObject; const AName: string): string; + procedure WriteString(ASender: TObject; const AName: string; const AValue: string); + property Count: Integer read GetCount; + property Items[AIndex: Integer]: TJclCustomSimpleSerializer read GetItems; default; + property Name: string read FName; + property Values: TStringList read FValues; + end; + + TJclSerializableLocationInfo = class(TJclLocationInfoEx) + public + procedure Deserialize(ASerializer: TJclCustomSimpleSerializer); + procedure Serialize(ASerializer: TJclCustomSimpleSerializer); + end; + + TJclSerializableLocationInfoList = class(TJclCustomLocationInfoList) + private + function GetItems(AIndex: Integer): TJclSerializableLocationInfo; + public + constructor Create; override; + function Add(Addr: Pointer): TJclSerializableLocationInfo; + procedure Deserialize(ASerializer: TJclCustomSimpleSerializer); + procedure Serialize(ASerializer: TJclCustomSimpleSerializer); + property Items[AIndex: Integer]: TJclSerializableLocationInfo read GetItems; default; + end; + + TJclSerializableThreadInfo = class(TJclCustomThreadInfo) + private + function GetStack(const AIndex: Integer): TJclSerializableLocationInfoList; + protected + function GetStackClass: TJclCustomLocationInfoListClass; override; + public + constructor Create; + destructor Destroy; override; + procedure Deserialize(ASerializer: TJclCustomSimpleSerializer); + procedure Serialize(ASerializer: TJclCustomSimpleSerializer); + property CreationStack: TJclSerializableLocationInfoList index 1 read GetStack; + property Stack: TJclSerializableLocationInfoList index 2 read GetStack; + end; + + TJclSerializableThreadInfoList = class(TObject) + private + FItems: TObjectList; + function GetItems(AIndex: Integer): TJclSerializableThreadInfo; + function GetCount: Integer; + public + constructor Create; + destructor Destroy; override; + function Add: TJclSerializableThreadInfo; + procedure Clear; + procedure Deserialize(ASerializer: TJclCustomSimpleSerializer); + procedure Serialize(ASerializer: TJclCustomSimpleSerializer); + property Count: Integer read GetCount; + property Items[AIndex: Integer]: TJclSerializableThreadInfo read GetItems; default; + end; + + TException = class(TObject) + private + FExceptionClassName: string; + FExceptionMessage: string; + public + procedure Clear; + procedure Deserialize(ASerializer: TJclCustomSimpleSerializer); + procedure Serialize(ASerializer: TJclCustomSimpleSerializer); + property ExceptionClassName: string read FExceptionClassName write FExceptionClassName; + property ExceptionMessage: string read FExceptionMessage write FExceptionMessage; + end; + + TModule = class(TObject) + private + FStartStr: string; + FEndStr: string; + FSystemModuleStr: string; + FModuleName: string; + FBinFileVersion: string; + FFileVersion: string; + FFileDescription: string; + public + procedure Deserialize(ASerializer: TJclCustomSimpleSerializer); + procedure Serialize(ASerializer: TJclCustomSimpleSerializer); + property StartStr: string read FStartStr write FStartStr; + property EndStr: string read FEndStr write FEndStr; + property SystemModuleStr: string read FSystemModuleStr write FSystemModuleStr; + property ModuleName: string read FModuleName write FModuleName; + property BinFileVersion: string read FBinFileVersion write FBinFileVersion; + property FileVersion: string read FFileVersion write FFileVersion; + property FileDescription: string read FFileDescription write FFileDescription; + end; + + TModuleList = class(TObject) + private + FItems: TObjectList; + function GetCount: Integer; + function GetItems(AIndex: Integer): TModule; + public + constructor Create; + destructor Destroy; override; + function Add: TModule; + procedure Clear; + procedure Deserialize(ASerializer: TJclCustomSimpleSerializer); + procedure Serialize(ASerializer: TJclCustomSimpleSerializer); + property Count: Integer read GetCount; + property Items[AIndex: Integer]: TModule read GetItems; default; + end; + + TExceptionInfo = class(TObject) + private + FException: TException; + FThreadInfoList: TJclSerializableThreadInfoList; + FModules: TModuleList; + public + constructor Create; + destructor Destroy; override; + procedure Deserialize(ASerializer: TJclCustomSimpleSerializer); + procedure Serialize(ASerializer: TJclCustomSimpleSerializer); + property ThreadInfoList: TJclSerializableThreadInfoList read FThreadInfoList; + property Exception: TException read FException; + property Modules: TModuleList read FModules; + end; + +implementation + +//=== { TJclCustomSimpleSerializer } ========================================= + +constructor TJclCustomSimpleSerializer.Create(const AName: string); +begin + inherited Create; + FItems := TObjectList.Create; + FName := AName; + FValues := TStringList.Create; +end; + +destructor TJclCustomSimpleSerializer.Destroy; +begin + FValues.Free; + FItems.Free; + inherited Destroy; +end; + +function TJclCustomSimpleSerializer.AddChild(ASender: TObject; const AName: string): TJclCustomSimpleSerializer; +begin + FItems.Add(TJclCustomSimpleSerializer.Create(AName)); + Result := TJclCustomSimpleSerializer(FItems.Last); +end; + +procedure TJclCustomSimpleSerializer.Clear; +begin + FItems.Clear; + FValues.Clear; + FName := ''; +end; + +function TJclCustomSimpleSerializer.GetCount: Integer; +begin + Result := FItems.Count; +end; + +function TJclCustomSimpleSerializer.GetItems(AIndex: Integer): TJclCustomSimpleSerializer; +begin + Result := TJclCustomSimpleSerializer(FItems[AIndex]); +end; + +function TJclCustomSimpleSerializer.ReadString(ASender: TObject; const AName: string): string; +begin + Result := FValues.Values[AName]; +end; + +procedure TJclCustomSimpleSerializer.WriteString(ASender: TObject; const AName: string; const AValue: string); +begin + FValues.Add(Format('%s=%s', [AName, AValue])); +end; + +//=== { TJclSerializableThreadInfoList } ===================================== + +constructor TJclSerializableThreadInfoList.Create; +begin + inherited Create; + FItems := TObjectList.Create; +end; + +destructor TJclSerializableThreadInfoList.Destroy; +begin + FItems.Free; + inherited Destroy; +end; + +function TJclSerializableThreadInfoList.Add: TJclSerializableThreadInfo; +begin + FItems.Add(TJclSerializableThreadInfo.Create); + Result := TJclSerializableThreadInfo(FItems.Last); +end; + +procedure TJclSerializableThreadInfoList.Clear; +begin + FItems.Clear; +end; + +function TJclSerializableThreadInfoList.GetCount: Integer; +begin + Result := FItems.Count; +end; + +function TJclSerializableThreadInfoList.GetItems(AIndex: Integer): TJclSerializableThreadInfo; +begin + Result := TJclSerializableThreadInfo(FItems[AIndex]); +end; + +procedure TJclSerializableThreadInfoList.Deserialize(ASerializer: TJclCustomSimpleSerializer); +var + I: Integer; +begin + Clear; + for I := 0 to ASerializer.Count - 1 do + if ASerializer[I].Name = 'ThreadInfo' then + Add.Deserialize(ASerializer[I]); +end; + +procedure TJclSerializableThreadInfoList.Serialize(ASerializer: TJclCustomSimpleSerializer); +var + I: Integer; +begin + for I := 0 to Count - 1 do + Items[I].Serialize(ASerializer.AddChild(Self, 'ThreadInfo')); +end; + +//=== { TJclSerializableLocationInfo } ======================================= + +procedure TJclSerializableLocationInfo.Deserialize(ASerializer: TJclCustomSimpleSerializer); +var + S, SOffsetFromProcName, SLineNumberOffsetFromProcedureStart: string; +begin + Values := []; + SOffsetFromProcName := ASerializer.ReadString(Self, 'OffsetFromProcName'); + if SOffsetFromProcName <> '' then + Values := Values + [lievLocationInfo]; + SLineNumberOffsetFromProcedureStart := ASerializer.ReadString(Self, 'LineNumberOffsetFromProcedureStart'); + if SLineNumberOffsetFromProcedureStart <> '' then + Values := Values + [lievProcedureStartLocationInfo]; + S := ASerializer.ReadString(Self, 'VAddress'); + VAddress := Pointer(StrToIntDef('$' + S, 0)); + ModuleName := ASerializer.ReadString(Self, 'ModuleName'); + S := ASerializer.ReadString(Self, 'Address'); + Address := Pointer(StrToIntDef('$' + S, 0)); + OffsetFromProcName := StrToIntDef('$' + SOffsetFromProcName, 0); + SourceUnitName := ASerializer.ReadString(Self, 'UnitName'); + ProcedureName := ASerializer.ReadString(Self, 'ProcedureName'); + SourceName := ASerializer.ReadString(Self, 'SourceName'); + S := ASerializer.ReadString(Self, 'LineNumber'); + LineNumber := StrToIntDef(S, -1); + S := ASerializer.ReadString(Self, 'OffsetFromLineNumber'); + OffsetFromLineNumber := StrToIntDef(S, -1); + LineNumberOffsetFromProcedureStart := StrToIntDef(SLineNumberOffsetFromProcedureStart, -1); + UnitVersionRevision := ASerializer.ReadString(Self, 'Revision'); + //todo more unitversion fields +end; + +procedure TJclSerializableLocationInfo.Serialize(ASerializer: TJclCustomSimpleSerializer); +var + S: string; +begin + ASerializer.WriteString(Self, 'VAddress', Format('%p', [VAddress])); + ASerializer.WriteString(Self, 'ModuleName', ModuleName); + ASerializer.WriteString(Self, 'Address', Format('%p', [Address])); + if lievLocationInfo in Values then + begin + ASerializer.WriteString(Self, 'OffsetFromProcName', Format('+ $%x', [OffsetFromProcName])); + ASerializer.WriteString(Self, 'UnitName', SourceUnitName); + ASerializer.WriteString(Self, 'ProcedureName', ProcedureName); + ASerializer.WriteString(Self, 'SourceName', SourceName); + if LineNumber > 0 then + begin + ASerializer.WriteString(Self, 'LineNumber', IntToStr(LineNumber)); + if OffsetFromLineNumber >= 0 then + S := S + Format('+ $%x', [OffsetFromLineNumber]) + else + S := S + Format('- $%x', [-OffsetFromLineNumber]); + ASerializer.WriteString(Self, 'OffsetFromProcName', S); + end; + if lievProcedureStartLocationInfo in Values then + ASerializer.WriteString(Self, 'LineNumberOffsetFromProcedureStart', IntToStr(LineNumberOffsetFromProcedureStart)); + end; + if lievUnitVersionInfo in Values then + ASerializer.WriteString(Self, 'Revision', UnitVersionRevision); + //todo more unitversion fields +end; + +//=== { TJclSerializableLocationInfoList } =================================== + +function TJclSerializableLocationInfoList.Add(Addr: Pointer): TJclSerializableLocationInfo; +begin + Result := TJclSerializableLocationInfo(InternalAdd(Addr)); +end; + +constructor TJclSerializableLocationInfoList.Create; +begin + inherited Create; + FItemClass := TJclSerializableLocationInfo; + FOptions := []; +end; + +function TJclSerializableLocationInfoList.GetItems(AIndex: Integer): TJclSerializableLocationInfo; +begin + Result := TJclSerializableLocationInfo(FItems[AIndex]); +end; + +procedure TJclSerializableLocationInfoList.Deserialize(ASerializer: TJclCustomSimpleSerializer); +var + I: Integer; +begin + Clear; + for I := 0 to ASerializer.Count - 1 do + if ASerializer[I].Name = 'LocationInfo' then + Add(nil).Deserialize(ASerializer[I]); +end; + +procedure TJclSerializableLocationInfoList.Serialize(ASerializer: TJclCustomSimpleSerializer); +var + I: Integer; +begin + for I := 0 to Count - 1 do + Items[I].Serialize(ASerializer.AddChild(Self, 'LocationInfo')); +end; + +//=== { TJclSerializableThreadInfo } ========================================= + +constructor TJclSerializableThreadInfo.Create; +begin + inherited Create; +end; + +destructor TJclSerializableThreadInfo.Destroy; +begin + inherited Destroy; +end; + +function TJclSerializableThreadInfo.GetStack(const AIndex: Integer): TJclSerializableLocationInfoList; +begin + case AIndex of + 1: Result := TJclSerializableLocationInfoList(FCreationStack); + 2: Result := TJclSerializableLocationInfoList(FStack); + else + Result := nil; + end; +end; + +function TJclSerializableThreadInfo.GetStackClass: TJclCustomLocationInfoListClass; +begin + Result := TJclSerializableLocationInfoList; +end; + +procedure TJclSerializableThreadInfo.Deserialize(ASerializer: TJclCustomSimpleSerializer); +var + S: string; + I: Integer; +begin + Values := []; + S := ASerializer.ReadString(Self, 'ThreadID'); + ThreadID := StrToIntDef(S, 0); + if ASerializer.ReadString(Self, 'MainThread') = '1' then + Values := Values + [tioIsMainThread]; + S := ASerializer.ReadString(Self, 'Name'); + if S <> '' then + begin + Name := S; + Values := Values + [tioName]; + end; + S := ASerializer.ReadString(Self, 'CreationTime'); + if S <> '' then + begin + CreationTime := StrToDateTime(S);{ TODO -oUSc : ISO format } + Values := Values + [tioCreationTime]; + end; + S := ASerializer.ReadString(Self, 'ParentThreadID'); + if S <> '' then + begin + ParentThreadID := StrToIntDef(S, 0); + if ParentThreadID <> 0 then + Values := Values + [tioParentThreadID]; + end; + for I := 0 to ASerializer.Count - 1 do + if ASerializer[I].Name = 'Stack' then + begin + Stack.Deserialize(ASerializer[I]); + Values := Values + [tioStack]; + end + else + if ASerializer[I].Name = 'CreationStack' then + begin + CreationStack.Deserialize(ASerializer[I]); + Values := Values + [tioCreationStack]; + end; +end; + +procedure TJclSerializableThreadInfo.Serialize(ASerializer: TJclCustomSimpleSerializer); +begin + ASerializer.WriteString(Self, 'ThreadID', IntToStr(ThreadID)); + if tioIsMainThread in Values then + ASerializer.WriteString(Self, 'MainThread', '1'); + if tioName in Values then + ASerializer.WriteString(Self, 'Name', Name); + if tioCreationTime in Values then + ASerializer.WriteString(Self, 'CreationTime', DateTimeToStr(CreationTime)); { TODO -oUSc : ISO format } + if tioParentThreadID in Values then + ASerializer.WriteString(Self, 'ParentThreadID', IntToStr(ParentThreadID)); + if tioStack in Values then + Stack.Serialize(ASerializer.AddChild(Self, 'Stack')); + if tioCreationStack in Values then + CreationStack.Serialize(ASerializer.AddChild(Self, 'CreationStack')); +end; + +//=== { TExceptionInfo } ===================================================== + +constructor TExceptionInfo.Create; +begin + inherited Create; + FException := TException.Create; + FThreadInfoList := TJclSerializableThreadInfoList.Create; + FModules := TModuleList.Create; +end; + +destructor TExceptionInfo.Destroy; +begin + FModules.Free; + FException.Free; + FThreadInfoList.Free; + inherited Destroy; +end; + +procedure TExceptionInfo.Deserialize(ASerializer: TJclCustomSimpleSerializer); +var + I: Integer; +begin + FThreadInfoList.Clear; + FException.Clear; + FModules.Clear; + for I := 0 to ASerializer.Count - 1 do + if ASerializer[I].Name = 'ThreadInfo' then + FThreadInfoList.Deserialize(ASerializer[I]) + else + if ASerializer[I].Name = 'Exception' then + FException.Deserialize(ASerializer[I]) + else + if ASerializer[I].Name = 'Modules' then + FModules.Deserialize(ASerializer[I]); +end; + +procedure TExceptionInfo.Serialize(ASerializer: TJclCustomSimpleSerializer); +begin + FThreadInfoList.Serialize(ASerializer.AddChild(Self, 'ThreadInfo')); + FException.Serialize(ASerializer.AddChild(Self, 'Exception')); + FModules.Serialize(ASerializer.AddChild(Self, 'Modules')); +end; + +//=== { TException } ========================================================= + +procedure TException.Clear; +begin + FExceptionClassName := ''; + FExceptionMessage := ''; +end; + +procedure TException.Deserialize(ASerializer: TJclCustomSimpleSerializer); +begin + Clear; + FExceptionClassName := ASerializer.ReadString(Self, 'ClassName'); + FExceptionMessage := ASerializer.ReadString(Self, 'Message'); +end; + +procedure TException.Serialize(ASerializer: TJclCustomSimpleSerializer); +begin + ASerializer.WriteString(Self, 'ClassName', FExceptionClassName); + ASerializer.WriteString(Self, 'Message', FExceptionMessage); +end; + +//=== { TModule } ============================================================ + +procedure TModule.Deserialize(ASerializer: TJclCustomSimpleSerializer); +begin + FStartStr := ASerializer.ReadString(Self, 'StartAddr'); + FEndStr := ASerializer.ReadString(Self, 'EndAddr'); + FSystemModuleStr := ASerializer.ReadString(Self, 'SystemModule'); + FModuleName := ASerializer.ReadString(Self, 'FileName'); + FBinFileVersion := ASerializer.ReadString(Self, 'BinFileVersion'); + FFileVersion := ASerializer.ReadString(Self, 'FileVersion'); + FFileDescription := ASerializer.ReadString(Self, 'FileDescription'); +end; + +procedure TModule.Serialize(ASerializer: TJclCustomSimpleSerializer); +begin + ASerializer.WriteString(Self, 'StartAddr', FStartStr); + ASerializer.WriteString(Self, 'EndAddr', FEndStr); + ASerializer.WriteString(Self, 'SystemModule', FSystemModuleStr); + ASerializer.WriteString(Self, 'FileName', FModuleName); + ASerializer.WriteString(Self, 'BinFileVersion', FBinFileVersion); + ASerializer.WriteString(Self, 'FileVersion', FFileVersion); + ASerializer.WriteString(Self, 'FileDescription', FFileDescription); +end; + +//=== { TModuleList } ======================================================== + +constructor TModuleList.Create; +begin + inherited Create; + FItems := TObjectList.Create; +end; + +destructor TModuleList.Destroy; +begin + FItems.Free; + inherited Destroy; +end; + +function TModuleList.Add: TModule; +begin + FItems.Add(TModule.Create); + Result := TModule(FItems.Last); +end; + +procedure TModuleList.Clear; +begin + FItems.Clear; +end; + +function TModuleList.GetCount: Integer; +begin + Result := FItems.Count; +end; + +function TModuleList.GetItems(AIndex: Integer): TModule; +begin + Result := TModule(FItems[AIndex]); +end; + +procedure TModuleList.Deserialize(ASerializer: TJclCustomSimpleSerializer); +var + I: Integer; +begin + Clear; + for I := 0 to ASerializer.Count - 1 do + if ASerializer[I].Name = 'Module' then + Add.Deserialize(ASerializer[I]); +end; + +procedure TModuleList.Serialize(ASerializer: TJclCustomSimpleSerializer); +var + I: Integer; +begin + for I := 0 to Count - 1 do + Items[I].Serialize(ASerializer.AddChild(Self, 'Module')); +end; + +end. Deleted: branches/jcl-stack-trace/jcl/experts/stackviewer/JclDebugStackUtils.pas =================================================================== --- branches/jcl-stack-trace/jcl/experts/stackviewer/JclDebugStackUtils.pas 2009-04-11 12:45:00 UTC (rev 2733) +++ branches/jcl-stack-trace/jcl/experts/stackviewer/JclDebugStackUtils.pas 2009-04-12 21:54:27 UTC (rev 2734) @@ -1,671 +0,0 @@ -unit JclDebugStackUtils; - -interface - -uses - Windows, SysUtils, Classes, Contnrs, JclDebug; - -type - TStackItem = class(TPersistent) - private - FSourceUnitName: string; - FSourceName: string; - FLineNumber: Integer; - FProcedureName: string; - FModuleName: string; - protected - procedure AssignTo(Dest: TPersistent); override; - public - property ModuleName: string read FModuleName write FModuleName; - property ProcedureName: string read FProcedureName write FProcedureName; - property SourceUnitName: string read FSourceUnitName write FSourceUnitName; - property SourceName: string read FSourceName write FSourceName; - property LineNumber: Integer read FLineNumber write FLineNumber; - end; - - TThreadInfoStack = class(TObject) - private - FItems: TObjectList; - function GetCount: Integer; - function GetItems(AIndex: Integer): TStackItem; - public - constructor Create; - destructor Destroy; override; - procedure LoadFromString(AInString: string); - property Count: Integer read GetCount; - property Items[AIndex: Integer]: TStackItem read GetItems; default; - end; - - TThreadInfo = class(TObject) - private - FThreadID: DWORD; - FStack: TThreadInfoStack; - public - constructor Create; - destructor Destroy; override; - property ThreadID: DWORD read FThreadID write FThreadID; - property Stack: TThreadInfoStack read FStack; - end; - - { - TThreadInfoList = class(TObject) - private - FItems: TObjectList; - FCount: Integer; - function GetItems(AIndex: Integer): TThreadInfo; - function GetCount: Integer; - public - constructor Create; - destructor Destroy; override; - procedure LoadFromString(AInString: string); - property Count: Integer read GetCount; - property Items[AIndex: Integer]: TThreadInfo read GetItems; default; - end; - } - - TThreadInfoList = class(TJclThreadInfoList) - private - procedure LoadStackFromString(AStack: TJclLocationInfoList; AInString: string); - public - procedure LoadFromString(AInString: string); - end; - - TException = class(TObject) - private - FExceptionClassName: string; - FExceptionMessage: string; - public - procedure Clear; - procedure LoadFromString(AInString: string); - property ExceptionClassName: string read FExceptionClassName write FExceptionClassName; - property ExceptionMessage: string read FExceptionMessage write FExceptionMessage; - end; - - TModule = class(TObject) - private - FStartStr: string; - FEndStr: string; - FSystemModuleStr: string; - FModuleName: string; - FBinFileVersion: string; - FFileVersion: string; - FFileDescription: string; - public - property StartStr: string read FStartStr write FStartStr; - property EndStr: string read FEndStr write FEndStr; - property SystemModuleStr: string read FSystemModuleStr write FSystemModuleStr; - property ModuleName: string read FModuleName write FModuleName; - property BinFileVersion: string read FBinFileVersion write FBinFileVersion; - property FileVersion: string read FFileVersion write FFileVersion; - property FileDescription: string read FFileDescription write FFileDescription; - end; - - TModuleList = class(TObject) - private - FItems: TObjectList; - function GetCount: Integer; - function GetItems(AIndex: Integer): TModule; - public - constructor Create; - destructor Destroy; override; - procedure Clear; - procedure LoadFromString(AInString: string); - property Count: Integer read GetCount; - property Items[AIndex: Integer]: TModule read GetItems; default; - end; - - TExceptionInfo = class(TObject) - private - FException: TException; - FThreadInfoList: TThreadInfoList; - FModules: TModuleList; - public - constructor Create; - destructor Destroy; override; - procedure LoadFromString(AInString: string); - property ThreadInfoList: TThreadInfoList read FThreadInfoList; - property Exception: TException read FException; - property Modules: TModuleList read FModules; - end; - -implementation - -type - TCSVValue = class(TObject) - Value: string; - end; - - TCSVRecord = class(TObject) - private - FItems: TObjectList; - function GetCount: Integer; - function GetItems(AIndex: Integer): TCSVValue; - public - constructor Create; - destructor Destroy; override; - function Add: TCSVValue; - procedure Clear; - property Count: Integer read GetCount; - property Items[AIndex: Integer]: TCSVValue read GetItems; default; - end; - - TCSVFile = class(TObject) - private - FItems: TObjectList; - function GetCount: Integer; - function GetItems(AIndex: Integer): TCSVRecord; - public - constructor Create; - destructor Destroy; override; - function Add: TCSVRecord; - procedure LoadFromString(AInString: string); - property Count: Integer read GetCount; - property Items[AIndex: Integer]: TCSVRecord read GetItems; default; - end; - -{ TCSVRecord } - -function TCSVRecord.Add: TCSVValue; -begin - FItems.Add(TCSVValue.Create); - Result := TCSVValue(FItems.Last); -end; - -procedure TCSVRecord.Clear; -begin - FItems.Clear; -end; - -constructor TCSVRecord.Create; -begin - inherited Create; - FItems := TObjectList.Create; -end; - -destructor TCSVRecord.Destroy; -begin - FItems.Free; - inherited Destroy; -end; - -function TCSVRecord.GetCount: Integer; -begin - Result := FItems.Count; -end; - -function TCSVRecord.GetItems(AIndex: Integer): TCSVValue; -begin - Result := TCSVValue(FItems[AIndex]); -end; - -{ TCSVFile } - -constructor TCSVFile.Create; -begin - inherited Create; - FItems := TObjectList.Create; -end; - -destructor TCSVFile.Destroy; -begin - FItems.Free; - inherited Destroy; -end; - -function TCSVFile.Add: TCSVRecord; -begin - FItems.Add(TCSVRecord.Create); - Result := TCSVRecord(FItems.Last); -end; - -function TCSVFile.GetCount: Integer; -begin - Result := FItems.Count; -end; - -function TCSVFile.GetItems(AIndex: Integer): TCSVRecord; -begin - Result := TCSVRecord(FItems[AIndex]); -end; - -function JvAnsiStrSplitStrings2(var InString: AnsiString; const SplitChar, QuoteChar: AnsiChar; CSVItems: TCSVRecord): Integer; -var - I, Len, SplitCounter: Integer; - Ch: AnsiChar; - InQuotes: Boolean; - OutString: AnsiString; -begin - InQuotes := False; - Len := Length(InString); - CSVItems.Clear; - SplitCounter := 0; // ALWAYS ASSUME THAT ZERO IS VALID IN THE OUTGOING ARRAY. - - for I := 1 to Len do - begin - Ch := InString[I]; - if (Ch in [#10]) and not InQuotes then - begin - Delete(InString, 1, I); - Break; - end - else - if (Ch = SplitChar) and not InQuotes then - begin - CSVItems.Add.Value := AnsiDequotedStr(string(OutString), Char(QuoteChar)); - OutString := ''; - Inc(SplitCounter); - end - else - begin - OutString := OutString + Ch; - if Ch = QuoteChar then - InQuotes := not InQuotes; - end; - if I = Len then - InString := ''; - end; - I := Length(OutString); - if (I > 0) and (OutString[I] = #13) then - Delete(OutString, I, 1); - CSVItems.Add.Value := AnsiDequotedStr(string(OutString), Char(QuoteChar)); - Inc(SplitCounter); - Result := SplitCounter; -end; - -procedure TCSVFile.LoadFromString(AInString: string); -var - S: AnsiString; - P: Integer; -begin - FItems.Clear; - S := AInString; - P := Pos(#10, S); - if P > 0 then - Delete(S, 1, P); - while S <> '' do - JvAnsiStrSplitStrings2(S, ';', '"', Add); -end; - - -{ TStackInfo } -{ - -constructor TThreadInfoList.Create; -begin - inherited Create; - FItems := TObjectList.Create; -end; - -destructor TThreadInfoList.Destroy; -begin - FItems.Free; - inherited Destroy; -end; - -function TThreadInfoList.GetCount: Integer; -begin - Result := FItems.Count; -end; - -function TThreadInfoList.GetItems(AIndex: Integer): TThreadInfo; -begin - Result := TThreadInfo(FItems[AIndex]); -end; - -procedure TThreadInfoList.LoadFromString(AInString: string); -var - CSVFile: TCSVFile; - I: Integer; - ThreadInfo: TThreadInfo; -begin - FItems.Clear; - CSVFile := TCSVFile.Create; - try - CSVFile.LoadFromString(AInString); - for I := 0 to CSVFile.Count - 1 do - begin - FItems.Add(TThreadInfo.Create); - ThreadInfo := TThreadInfo(FItems.Last); - if CSVFile[I].Count > 0 then - ThreadInfo.ThreadID := StrToIntDef(CSVFile[I][0].Value, 0); - if CSVFile[I].Count > 6 then - ThreadInfo.Stack.LoadFromString(CSVFile[I][6].Value); - end; - finally - CSVFile.Free; - end; -end; -} -procedure TThreadInfoList.LoadFromString(AInString: string); -var - CSVFile: TCSVFile; - CSVRecord: TCSVRecord; - I: Integer; - ThreadInfo: TJclThreadInfo; -begin - Clear; - CSVFile := TCSVFile.Create; - try - CSVFile.LoadFromString(AInString); - for I := 0 to CSVFile.Count - 1 do - begin - CSVRecord := CSVFile[I]; - ThreadInfo := Add; - ThreadInfo.Values := []; - if CSVRecord.Count > 0 then - ThreadInfo.ThreadID := StrToIntDef(CSVRecord[0].Value, 0); - if (CSVRecord.Count > 1) and (CSVRecord[1].Value = '1') then - ThreadInfo.Values := ThreadInfo.Values + [tioIsMainThread]; - if (CSVRecord.Count > 2) and (CSVRecord[2].Value <> '') then - begin - ThreadInfo.Name := CSVRecord[2].Value; - ThreadInfo.Values := ThreadInfo.Values + [tioName]; - end; - if (CSVRecord.Count > 3) and (CSVRecord[3].Value <> '') then - begin - ThreadInfo.CreationTime := StrToDateTime(CSVRecord[3].Value); - ThreadInfo.Values := ThreadInfo.Values + [tioCreationTime]; - end; - if (CSVRecord.Count > 4) and (CSVRecord[4].Value <> '') then - begin - ThreadInfo.ParentThreadID := StrToIntDef(CSVRecord[4].Value, 0); - if ThreadInfo.ParentThreadID <> 0 then - ThreadInfo.Values := ThreadInfo.Values + [tioParentThreadID]; - end; - if (CSVRecord.Count > 5) and (CSVRecord[5].Value <> '') then - begin - LoadStackFromString(ThreadInfo.Stack, CSVRecord[5].Value); - ThreadInfo.Values := ThreadInfo.Values + [tioStack]; - end; - if (CSVRecord.Count > 6) and (CSVRecord[6].Value <> '') then - begin - LoadStackFromString(ThreadInfo.CreationStack, CSVRecord[6].Value); - ThreadInfo.Values := ThreadInfo.Values + [tioCreationStack]; - end; - end; - finally - CSVFile.Free; - end; -end; - -procedure TThreadInfoList.LoadStackFromString(AStack: TJclLocationInfoList; AInString: string); -var - CSVFile: TCSVFile; - CSVRecord: TCSVRecord; - I: Integer; - LocationInfoEx: TJclLocationInfoEx; -begin - AStack.Clear; - CSVFile := TCSVFile.Create; - try - CSVFile.LoadFromString(AInString); - for I := 0 to CSVFile.Count - 1 do - begin - CSVRecord := CSVFile[I]; - LocationInfoEx := AStack.Add(nil); - LocationInfoEx.Values := []; - if (CSVRecord.Count > 3) and (CSVRecord[3].Value <> '') then - LocationInfoEx.Values := LocationInfoEx.Values + [lievLocationInfo]; - if (CSVRecord.Count > 9) and (CSVRecord[9].Value <> '') then - LocationInfoEx.Values := LocationInfoEx.Values + [lievProcedureStartLocationInfo]; - if CSVRecord.Count > 0 then - LocationInfoEx.VAddress := Pointer(StrToIntDef('$' + CSVRecord[0].Value, 0)); - if CSVRecord.Count > 1 then - LocationInfoEx.ModuleName := CSVRecord[1].Value; - if CSVRecord.Count > 2 then - LocationInfoEx.Address := Pointer(StrToIntDef('$' + CSVRecord[2].Value, 0)); - if CSVRecord.Count > 3 then - LocationInfoEx.OffsetFromProcName := StrToIntDef('$' + CSVRecord[3].Value, 0); - if CSVRecord.Count > 4 then - LocationInfoEx.SourceUnitName := CSVRecord[4].Value; - if CSVRecord.Count > 5 then - LocationInfoEx.ProcedureName := CSVRecord[5].Value; - if CSVRecord.Count > 6 then - LocationInfoEx.SourceName := CSVRecord[6].Value; - if CSVRecord.Count > 7 then - LocationInfoEx.LineNumber := StrToIntDef(CSVRecord[7].Value, -1); - if CSVRecord.Count > 8 then - LocationInfoEx.OffsetFromLineNumber := StrToIntDef(CSVRecord[8].Value, -1); - if CSVRecord.Count > 9 then - LocationInfoEx.LineNumberOffsetFromProcedureStart := StrToIntDef(CSVRecord[9].Value, -1); - end; - finally - CSVFile.Free; - end; -end; - - -{ TStack } - -constructor TThreadInfoStack.Create; -begin - inherited Create; - FItems := TObjectList.Create; -end; - -destructor TThreadInfoStack.Destroy; -begin - FItems.Free; - inherited Destroy; -end; - -function TThreadInfoStack.GetCount: Integer; -begin - Result := FItems.Count; -end; - -function TThreadInfoStack.GetItems(AIndex: Integer): TStackItem; -begin - Result := TStackItem(FItems[AIndex]); -end; - -procedure TThreadInfoStack.LoadFromString(AInString: string); -var - CSVFile: TCSVFile; - I: Integer; - Stack: TStackItem; -begin - FItems.Clear; - CSVFile := TCSVFile.Create; - try - CSVFile.LoadFromString(AInString); - for I := 0 to CSVFile.Count - 1 do - begin - FItems.Add(TStackItem.Create); - Stack := TStackItem(FItems.Last); - if CSVFile[I].Count > 1 then - Stack.ModuleName := CSVFile[I][1].Value; - if CSVFile[I].Count > 4 then - Stack.SourceUnitName := CSVFile[I][4].Value; - if CSVFile[I].Count > 5 then - Stack.ProcedureName := CSVFile[I][5].Value; - if CSVFile[I].Count > 6 then - Stack.SourceName := CSVFile[I][6].Value; - if CSVFile[I].Count > 7 then - Stack.LineNumber := StrToIntDef(CSVFile[I][7].Value, -1); - end; - finally - CSVFile.Free; - end; -end; - -{ TStackItem } - -procedure TStackItem.AssignTo(Dest: TPersistent); -begin - if Dest is TStackItem then - begin - TStackItem(Dest).ModuleName := ModuleName; - TStackItem(Dest).ProcedureName := ProcedureName; - TStackItem(Dest).SourceUnitName := SourceUnitName; - TStackItem(Dest).SourceName := SourceName; - TStackItem(Dest).LineNumber := LineNumber; - end - else - inherited AssignTo(Dest); -end; - -{ TThreadInfo } - -constructor TThreadInfo.Create; -begin - inherited Create; - FStack := TThreadInfoStack.Create; -end; - -destructor TThreadInfo.Destroy; -begin - FStack.Free; - inherited Destroy; -end; - -{ TExceptionInfo } - -constructor TExceptionInfo.Create; -begin - inherited Create; - FException := TException.Create; - FThreadInfoList := TThreadInfoList.Create; - FModules := TModuleList.Create; -end; - -destructor TExceptionInfo.Destroy; -begin - FModules.Free; - FException.Free; - FThreadInfoList.Free; - inherited Destroy; -end; - -procedure TExceptionInfo.LoadFromString(AInString: string); -var - CSVFile: TCSVFile; - CSVRecord: TCSVRecord; - I: Integer; - S: string; -begin - FThreadInfoList.Clear; - FException.Clear; - FModules.Clear; - CSVFile := TCSVFile.Create; - try - CSVFile.LoadFromString(AInString); - for I := 0 to CSVFile.Count - 1 do - begin - CSVRecord := CSVFile[I]; - if CSVRecord.Count > 1 then - begin - S := CSVRecord[0].Value; - if S = 'ThreadInfo' then - FThreadInfoList.LoadFromString(CSVRecord[1].Value) - else - if S = 'Exception' then - FException.LoadFromString(CSVRecord[1].Value) - else - if S = 'Modules' then - FModules.LoadFromString(CSVRecord[1].Value); - end; - end; - finally - CSVFile.Free; - end; -end; - -{ TException } - -procedure TException.Clear; -begin - FExceptionClassName := ''; - FExceptionMessage := ''; -end; - -procedure TException.LoadFromString(AInString: string); -var - CSVFile: TCSVFile; - CSVRecord: TCSVRecord; -begin - Clear; - CSVFile := TCSVFile.Create; - try - CSVFile.LoadFromString(AInString); - if CSVFile.Count > 0 then - begin - CSVRecord := CSVFile[0]; - if CSVRecord.Count > 0 then - FExceptionClassName := CSVRecord[0].Value; - if CSVRecord.Count > 1 then - FExceptionMessage := CSVRecord[1].Value; - end; - finally - CSVFile.Free; - end; -end; - -{ TModuleList } - -constructor TModuleList.Create; -begin - inherited Create; - FItems := TObjectList.Create; -end; - -destructor TModuleList.Destroy; -begin - FItems.Free; - inherited Destroy; -end; - -procedure TModuleList.Clear; -begin - FItems.Clear; -end; - -function TModuleList.GetCount: Integer; -begin - Result := FItems.Count; -end; - -function TModuleList.GetItems(AIndex: Integer): TModule; -begin - Result := TModule(FItems[AIndex]); -end; - -procedure TModuleList.LoadFromString(AInString: string); -var - CSVFile: TCSVFile; - CSVRecord: TCSVRecord; - I: Integer; - Module: TModule; -begin - Clear; - CSVFile := TCSVFile.Create; - try - CSVFile.LoadFromString(AInString); - for I := 0 to CSVFile.Count - 1 do - begin - CSVRecord := CSVFile[I]; - if CSVRecord.Count > 0 then - begin - FItems.Add(TModule.Create); - Module := TModule(FItems.Last); - Module.StartStr := CSVRecord[0].Value; - if CSVRecord.Count > 1 then - Module.EndStr := CSVRecord[1].Value; - if CSVRecord.Count > 2 then - Module.SystemModuleStr := CSVRecord[2].Value; - if CSVRecord.Count > 3 then - Module.ModuleName := CSVRecord[3].Value; - if CSVRecord.Count > 4 then - Module.BinFileVersion := CSVRecord[4].Value; - if CSVRecord.Count > 5 then - Module.FileVersion := CSVRecord[5].Value; - if CSVRecord.Count > 6 then - Module.FileDescription := CSVRecord[6].Value; - end; - end; - finally - CSVFile.Free; - end; -end; - -end. Added: branches/jcl-stack-trace/jcl/experts/stackviewer/JclDebugXMLDeserializer.pas =================================================================== --- branches/jcl-stack-trace/jcl/experts/stackviewer/JclDebugXMLDeserializer.pas (rev 0) +++ branches/jcl-stack-trace/jcl/experts/stackviewer/JclDebugXMLDeserializer.pas 2009-04-12 21:54:27 UTC (rev 2734) @@ -0,0 +1,43 @@ +unit JclDebugXMLDeserializer; + +interface + +uses + SysUtils, JclDebugSerialization, JclSimpleXml; + +type + TJclXMLDeserializer = class(TJclCustomSimpleSerializer) + public + procedure LoadFromString(const AValue: string); + end; + +implementation + +//=== { TJclXMLDeserializer } ================================================ + +procedure TJclXMLDeserializer.LoadFromString(const AValue: string); + + procedure AddItems(ASerializer: TJclCustomSimpleSerializer; AElem: TJclSimpleXMLElem); + var + I: Integer; + begin + for I := 0 to AElem.Properties.Count - 1 do + ASerializer.Values.Add(Format('%s=%s', [AElem.Properties[I].Name, AElem.Properties[I].Value])); + for I := 0 to AElem.Items.Count - 1 do + AddItems(ASerializer.AddChild(nil, AElem.Items[I].Name), AElem.Items[I]) + end; + +var + XML: TJclSimpleXML; +begin + XML := TJclSimpleXML.Create; + try + XML.LoadFromString(AValue); + Clear; + AddItems(Self, XML.Root); + finally + XML.Free; + end; +end; + +end. Added: branches/jcl-stack-trace/jcl/experts/stackviewer/JclDebugXMLSerializer.pas =================================================================== --- branches/jcl-stack-trace/jcl/experts/stackviewer/JclDebugXMLSerializer.pas (rev 0) +++ branches/jcl-stack-trace/jcl/experts/stackviewer/JclDebugXMLSerializer.pas 2009-04-12 21:54:27 UTC (rev 2734) @@ -0,0 +1,67 @@ +unit JclDebugXMLSerializer; + +interface + +uses + SysUtils, Classes, JclDebugSerialization; + +type + TJclXMLSerializer = class(TJclCustomSimpleSerializer) + public + function SaveToString: string; + end; + +implementation + +//=== { TJclXMLSerializer } ================================================== + +function TJclXMLSerializer.SaveToString: string; + + procedure AddToStrings(ASerializer: TJclCustomSimpleSerializer; AXMLStrings: TStringList; AIdent: Integer); + var + I, P: Integer; + S, S1, S2, V: string; + begin + if AIdent = 0 then + S := '' + else + S := StringOfChar(' ', AIdent); + V := ''; + for I := 0 to ASerializer.Values.Count - 1 do + begin + S1 := ASerializer.Values[I]; + P := Pos('=', S1); + if P > 0 then + begin + S2 := S1; + Delete(S1, P, Length(S1)); + Delete(S2, 1, P); + V := V + ' '; + V := V + Format('%s="%s"', [S1, S2]); + end; + end; + if ASerializer.Count > 0 then + begin + AXMLStrings.Add(S + '<' + ASerializer.Name + V + '>'); + for I := 0 to ASerializer.Count - 1 do + AddToStrings(ASerializer[I], AXMLStrings, AIdent + 2); + AXMLStrings.Add(S + '</' + ASerializer.Name + '>'); + end + else + AXMLStrings.Add(S + '<' + ASerializer.Name + V + '/>'); + end; + + +var + XMLStrings: TStringList; +begin + XMLStrings := TStringList.Create; + try + AddToStrings(Self, XMLStrings, 0); + Result := XMLStrings.Text; + finally + XMLStrings.Free; + end; +end; + +end. Modified: branches/jcl-stack-trace/jcl/experts/stackviewer/ModuleFrame.pas =================================================================== --- branches/jcl-stack-trace/jcl/experts/stackviewer/ModuleFrame.pas 2009-04-11 12:45:00 UTC (rev 2733) +++ branches/jcl-stack-trace/jcl/experts/stackviewer/ModuleFrame.pas 2009-04-12 21:54:27 UTC (rev 2734) @@ -4,7 +4,7 @@ uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - ComCtrls, IniFiles, JclDebugStackUtils; + ComCtrls, IniFiles, JclDebugSerialization; type TfrmModule = class(TFrame) Modified: branches/jcl-stack-trace/jcl/experts/stackviewer/StackViewForm.pas =================================================================== --- branches/jcl-stack-trace/jcl/experts/stackviewer/StackViewForm.pas 2009-04-11 12:45:00 UTC (rev 2733) +++ branches/jcl-stack-trace/jcl/experts/stackviewer/StackViewForm.pas 2009-04-12 21:54:27 UTC (rev 2734) @@ -5,14 +5,14 @@ interface uses - Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, - Dialogs, Docktoolform, StdCtrls, ComCtrls, Menus, + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + Docktoolform, StdCtrls, ComCtrls, Menus, {PlatformDefaultStyleActnCtrls,} ActnPopup, ActnList, ToolWin, ExtCtrls, IniFiles, ToolsAPI, - JclDebug, JclDebugStackUtils, Contnrs, StackFrame, ModuleFrame, + JclDebug, JclDebugSerialization, Contnrs, StackFrame, ModuleFrame, StackViewUnit, StackFrame2, StackCodeUtils, ExceptInfoFrame, ThreadFrame, ExceptionViewerOptionsUnit, StackLineNumberTranslator, JclOtaUtils , ActiveX - , FileSearcherUnit, JclStrings + , FileSearcherUnit, JclStrings, JclDebugXMLDeserializer ; type @@ -50,7 +50,7 @@ FStackItemList: TStackViewItemsList; FCreationStackItemList: TStackViewItemsList; FTreeViewLinkList: TObjectList; - FThreadInfoList: TThreadInfoList; + FThreadInfoList: TJclSerializableThreadInfoList; FExceptionInfo: TExceptionInfo; FStackFrame: TfrmStack; FModuleFrame: TfrmModule; @@ -59,7 +59,7 @@ FLastControl: TControl; FOptions: TExceptionViewerOption; FRootDir: string; - procedure PrepareStack(AStack: TJclLocationInfoList; AStackItemList: TStackViewItemsList); + procedure PrepareStack(AStack: TJclSerializableLocationInfoList; AStackItemList: TStackViewItemsList); procedure SetOptions(const Value: TExceptionViewerOption); public { Public declarations } @@ -176,7 +176,7 @@ end; end; -procedure TfrmStackView.PrepareStack(AStack: TJclLocationInfoList; AStackItemList: TStackViewItemsList); +procedure TfrmStackView.PrepareStack(AStack: TJclSerializableLocationInfoList; AStackItemList: TStackViewItemsList); var I, J, K, Idx, NewLineNumber: Integer; StackViewItem: TStackViewItem; @@ -206,6 +206,7 @@ begin StackViewItem := AStackItemList.Add; StackViewItem.Assign(AStack[I]); + StackViewItem.Revision := AStack[I].UnitVersionRevision; Idx := FindFileList.IndexOf(AStack[I].SourceName); if Idx <> -1 then begin @@ -462,7 +463,7 @@ var TreeViewLink: TTreeViewLink; NewControl: TControl; - ThreadInfo: TJclThreadInfo; + ThreadInfo: TJclSerializableThreadInfo; begin inherited; NewControl := nil; @@ -476,9 +477,9 @@ FModuleFrame.ModuleList := TModuleList(TreeViewLink.Data); end else - if (TreeViewLink.Kind = tvlkThread) and (TreeViewLink.Data is TJclThreadInfo) then + if (TreeViewLink.Kind = tvlkThread) and (TreeViewLink.Data is TJclSerializableThreadInfo) then begin - ThreadInfo := TJclThreadInfo(TreeViewLink.Data); + ThreadInfo := TJclSerializableThreadInfo(TreeViewLink.Data); NewControl := FThreadFrame; PrepareStack(ThreadInfo.CreationStack, FCreationStackItemList); if tioCreationStack in ThreadInfo.Values then @@ -502,9 +503,9 @@ FExceptionFrame.Exception := TException(TreeViewLink.Data); end else - if (TreeViewLink.Kind in [tvlkThreadStack, tvlkThreadCreationStack]) and (TreeViewLink.Data is TJclLocationInfoList) then + if (TreeViewLink.Kind in [tvlkThreadStack, tvlkThreadCreationStack]) and (TreeViewLink.Data is TJclSerializableLocationInfoList) then begin - PrepareStack(TJclLocationInfoList(TreeViewLink.Data), FStackItemList); + PrepareStack(TJclSerializableLocationInfoList(TreeViewLink.Data), FStackItemList); FStackFrame.StackList := FStackItemList; NewControl := FStackFrame; end; @@ -583,6 +584,7 @@ S: string; tn, tns: TTreeNode; TreeViewLink: TTreeViewLink; + XMLDeserializer: TJclXMLDeserializer; begin inherited; if OpenDialog1.Execute then @@ -605,7 +607,14 @@ FS.Free; end; {$ENDIF ~COMPILER12_UP} - FExceptionInfo.LoadFromString(SS.DataString); + //FExceptionInfo.LoadFromString(SS.DataString); + XMLDeserializer := TJclXMLDeserializer.Create('ExceptInfo'); + try + XMLDeserializer.LoadFromString(SS.DataString); + FExceptionInfo.Deserialize(XMLDeserializer); + finally + XMLDeserializer.Free; + end; FTreeViewLinkList.Add(TTreeViewLink.Create); TreeViewLink := TTreeViewLink(FTreeViewLinkList.Last); @@ -623,7 +632,7 @@ } for I := 0 to FThreadInfoList.Count - 1 do begin - cboxThread.Items.AddObject(Format('[%d/%d] %s', [I + 1, FThreadInfoList.Count, FThreadInfoList[I].AsString]), FThreadInfoList[I]); + cboxThread.Items.AddObject(Format('[%d/%d] %s', [I + 1, FThreadInfoList.Count, ''{FThreadInfoList[I].AsString}]), FThreadInfoList[I]); if tioIsMainThread in FThreadInfoList[I].Values then S := '[MainThread]' else Modified: branches/jcl-stack-trace/jcl/experts/stackviewer/ThreadFrame.pas =================================================================== --- branches/jcl-stack-trace/jcl/experts/stackviewer/ThreadFrame.pas 2009-04-11 12:45:00 UTC (rev 2733) +++ branches/jcl-stack-trace/jcl/experts/stackviewer/ThreadFrame.pas 2009-04-12 21:54:27 UTC (rev 2734) @@ -4,7 +4,7 @@ uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - ExtCtrls, IniFiles, JclDebugStackUtils, StackViewUnit, StackFrame, ExceptInfoFrame; + ExtCtrls, IniFiles, JclDebugSerialization, StackViewUnit, StackFrame, ExceptInfoFrame; type TfrmThread = class(TFrame) Modified: branches/jcl-stack-trace/jcl/source/windows/JclDebug.pas =================================================================== --- branches/jcl-stack-trace/jcl/source/windows/JclDebug.pas 2009-04-11 12:45:00 UTC (rev 2733) +++ branches/jcl-stack-trace/jcl/source/windows/JclDebug.pas 2009-04-12 21:54:27 UTC (rev 2734) @@ -353,9 +353,8 @@ TJclLocationInfoExValues = set of (lievLocationInfo, lievProcedureStartLocationInfo, lievUnitVersionInfo); - TJclLocationInfoList = class; + TJclCustomLocationInfoList = class; - { TODO -oUSc : TUnitVersionInfo or TUnitVersion? } TJclLocationInfoEx = class(TPersistent) private FAddress: Pointer; @@ -366,13 +365,15 @@ FModuleName: string; FOffsetFromLineNumber: Integer; FOffsetFromProcName: Integer; - FParent: TJclLocationInfoList; + FParent: TJclCustomLocationInfoList; FProcedureName: string; FSourceName: string; FSourceUnitName: string; - {$IFDEF UNITVERSIONING} - FUnitVersion: TUnitVersion; - {$ENDIF UNITVERSIONING} + FUnitVersionDateTime: TDateTime; + FUnitVersionExtra: string; + FUnitVersionLogPath: string; + FUnitVersionRCSfile: string; + FUnitVersionRevision: string; FVAddress: Pointer; FValues: TJclLocationInfoExValues; procedure Fill; @@ -381,7 +382,7 @@ protected procedure AssignTo(Dest: TPersistent); override; public - constructor Create(AParent: TJclLocationInfoList; Address: Pointer); + constructor Create(AParent: TJclCustomLocationInfoList; Address: Pointer); class function CSVHeader: string; property Address: Pointer read FAddress write FAddress; property AsCSVString: string read GetAsCSVString; @@ -398,36 +399,52 @@ { this is equal to TJclLocationInfo.UnitName, but has been renamed because UnitName is a class function in TObject since Delphi 2009 } property SourceUnitName: string read FSourceUnitName write FSourceUnitName; - {$IFDEF UNITVERSIONING} - property UnitVersion: TUnitVersion read FUnitVersion write FUnitVersion; - {$ENDIF UNITVERSIONING} + property UnitVersionDateTime: TDateTime read FUnitVersionDateTime write FUnitVersionDateTime; + property UnitVersionExtra: string read FUnitVersionExtra write FUnitVersionExtra; + property UnitVersionLogPath: string read FUnitVersionLogPath write FUnitVersionLogPath; + property UnitVersionRCSfile: string read FUnitVersionRCSfile write FUnitVersionRCSfile; + property UnitVersionRevision: string read FUnitVersionRevision write FUnitVersionRevision; property VAddress: Pointer read FVAddress write FVAddress; property Values: TJclLocationInfoExValues read FValues write FValues; end; TJclLocationInfoListOptions = set of (liloAutoGetAddressInfo, liloAutoGetLocationInfo, liloAutoGetUnitVersionInfo); - TJclLocationInfoList = class(TObject) - private + TJclLocationInfoClass = class of TJclLocationInfoEx; + + TJclCustomLocationInfoListClass = class of TJclCustomLocationInfoList; + + TJclCustomLocationInfoList = class(TPersistent) + protected + FItemClass: TJclLocationInfoClass; FItems: TObjectList; FOptions: TJclLocationInfoListOptions; function GetAsCSVString: string; function GetAsString: string; function GetCount: Integer; - function GetItems(AIndex: Integer): TJclLocationInfoEx; + function InternalAdd(Addr: Pointer): TJclLocationInfoEx; + protected + procedure AssignTo(Dest: TPersistent); override; public - constructor Create; + constructor Create; virtual; destructor Destroy; override; - function Add(Addr: Pointer): TJclLocationInfoEx; overload; - procedure Add(AStackInfoList: TObject); overload; + procedure AddStackInfoList(AStackInfoList: TObject); procedure Clear; property AsCSVString: string read GetAsCSVString; property AsString: string read GetAsString; property Count: Integer read GetCount; - property Items[AIndex: Integer]: TJclLocationInfoEx read GetItems; default; property Options: TJclLocationInfoListOptions read FOptions write FOptions; end; + TJclLocationInfoList = class(TJclCustomLocationInfoList) + private + function GetItems(AIndex: Integer): TJclLocationInfoEx; + public + constructor Create; override; + function Add(Addr: Pointer): TJclLocationInfoEx; + property Items[AIndex: Integer]: TJclLocationInfoEx read GetItems; default; + end; + TJclDebugInfoSource = class(TObject) private FModule: HMODULE; @@ -857,33 +874,43 @@ TJclThreadInfoOptions = set of (tioIsMainThread, tioName, tioCreationTime, tioParentThreadID, tioStack, tioCreationStack); - TJclThreadInfo = class(TObject) - private + TJclCustomThreadInfo = class(TPersistent) + protected FCreationTime: TDateTime; - FCreationStack: TJclLocationInfoList; + FCreationStack: TJclCustomLocationInfoList; FName: string; FParentThreadID: DWORD; - FStack: TJclLocationInfoList; + FStack: TJclCustomLocationInfoList; FThreadID: DWORD; FValues: TJclThreadInfoOptions; + procedure AssignTo(Dest: TPersistent); override; + function GetStackClass: TJclCustomLocationInfoListClass; virtual; + public + constructor Create; + destructor Destroy; override; + property CreationTime: TDateTime read FCreationTime write FCreationTime; + property Name: string read FName write FName; + property ParentThreadID: DWORD read FParentThreadID write FParentThreadID; + property ThreadID: DWORD read FThreadID write FThreadID; + property Values: TJclThreadInfoOptions read FValues write FValues; + end; + + TJclThreadInfo = class(TJclCustomThreadInfo) + private function GetAsCSVString: string; function GetAsString: string; procedure InternalFill(AThreadHandle: THandle; AThreadID: DWORD; AGatherOptions: TJclThreadInfoOptions; AExceptThread: Boolean); + function GetStack(const AIndex: Integer): TJclLocationInfoList; + protected + function GetStackClass: TJclCustomLocationInfoListClass; override; public - constructor Create; - destructor Destroy; override; class function CSVHeader: string; procedure Fill(AThreadHandle: THandle; AThreadID: DWORD; AGatherOptions: TJclThreadInfoOptions); procedure FillFromExceptThread(AGatherOptions: TJclThreadInfoOptions); property AsCSVString: string read GetAsCSVString; property AsString: string read GetAsString; - property CreationTime: TDateTime read FCreationTime write FCreationTime; - property CreationStack: TJclLocationInfoList read FCreationStack; - property Name: string read FName write FName; - property ParentThreadID: DWORD read FPare... [truncated message content] |
From: <usc...@us...> - 2009-04-11 12:45:10
|
Revision: 2733 http://jcl.svn.sourceforge.net/jcl/?rev=2733&view=rev Author: uschuster Date: 2009-04-11 12:45:00 +0000 (Sat, 11 Apr 2009) Log Message: ----------- package updates and D11 compatibility Modified Paths: -------------- branches/jcl-stack-trace/jcl/TODO.txt branches/jcl-stack-trace/jcl/experts/stackviewer/StackViewForm.pas branches/jcl-stack-trace/jcl/packages/JclPackagesD110.groupproj branches/jcl-stack-trace/jcl/packages/JclPackagesD120.groupproj branches/jcl-stack-trace/jcl/packages/d12/JclStackTraceViewerExpert.dpk branches/jcl-stack-trace/jcl/packages/d12/JclStackTraceViewerExpert.dproj branches/jcl-stack-trace/jcl/packages/d12/JclStackTraceViewerExpertDLL.dpr branches/jcl-stack-trace/jcl/packages/d12/JclStackTraceViewerExpertDLL.dproj branches/jcl-stack-trace/jcl/packages/resources.mak branches/jcl-stack-trace/jcl/packages/xml/JclStackTraceViewerExpert-D.xml branches/jcl-stack-trace/jcl/packages/xml/JclStackTraceViewerExpertDLL-L.xml Added Paths: ----------- branches/jcl-stack-trace/jcl/packages/d11/JclStackTraceViewerExpert.dpk branches/jcl-stack-trace/jcl/packages/d11/JclStackTraceViewerExpert.dproj branches/jcl-stack-trace/jcl/packages/d11/JclStackTraceViewerExpert.rc branches/jcl-stack-trace/jcl/packages/d11/JclStackTraceViewerExpertDLL.dpr branches/jcl-stack-trace/jcl/packages/d11/JclStackTraceViewerExpertDLL.dproj branches/jcl-stack-trace/jcl/packages/d11/JclStackTraceViewerExpertDLL.rc Modified: branches/jcl-stack-trace/jcl/TODO.txt =================================================================== --- branches/jcl-stack-trace/jcl/TODO.txt 2009-04-11 10:59:39 UTC (rev 2732) +++ branches/jcl-stack-trace/jcl/TODO.txt 2009-04-11 12:45:00 UTC (rev 2733) @@ -37,6 +37,4 @@ - add UNITVERSIONING * integrate it into the installation - - update jcl\packages\JclPackages*.* - - add all files to jcl\packages\xml\JclStackTraceViewerExpert*.xml - - generate packages for 5 - 11 \ No newline at end of file + - generate packages, JclPackages*.* and resources.mak for 5 - 10 \ No newline at end of file Modified: branches/jcl-stack-trace/jcl/experts/stackviewer/StackViewForm.pas =================================================================== --- branches/jcl-stack-trace/jcl/experts/stackviewer/StackViewForm.pas 2009-04-11 10:59:39 UTC (rev 2732) +++ branches/jcl-stack-trace/jcl/experts/stackviewer/StackViewForm.pas 2009-04-11 12:45:00 UTC (rev 2733) @@ -1,11 +1,13 @@ unit StackViewForm; +{$I jcl.inc} + interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Docktoolform, StdCtrls, ComCtrls, Menus, - PlatformDefaultStyleActnCtrls, ActnPopup, ActnList, ToolWin, ExtCtrls, IniFiles, ToolsAPI, + {PlatformDefaultStyleActnCtrls,} ActnPopup, ActnList, ToolWin, ExtCtrls, IniFiles, ToolsAPI, JclDebug, JclDebugStackUtils, Contnrs, StackFrame, ModuleFrame, StackViewUnit, StackFrame2, StackCodeUtils, ExceptInfoFrame, ThreadFrame, ExceptionViewerOptionsUnit, StackLineNumberTranslator, JclOtaUtils @@ -574,6 +576,9 @@ procedure TfrmStackView.acLoadStackExecute(Sender: TObject); var SS: TStringStream; + {$IFNDEF COMPILER12_UP} + FS: TFileStream; + {$ENDIF ~COMPILER12_UP} I: Integer; S: string; tn, tns: TTreeNode; @@ -588,9 +593,18 @@ cboxThread.Items.Clear; tv.Items.Clear; FTreeViewLinkList.Clear; - SS := TStringStream.Create; + SS := TStringStream.Create(''); try + {$IFDEF COMPILER12_UP} SS.LoadFromFile(OpenDialog1.FileName); + {$ELSE ~COMPILER12_UP} + FS := TFileStream.Create(OpenDialog1.FileName, fmOpenRead); + try + SS.CopyFrom(FS, 0); + finally + FS.Free; + end; + {$ENDIF ~COMPILER12_UP} FExceptionInfo.LoadFromString(SS.DataString); FTreeViewLinkList.Add(TTreeViewLink.Create); Modified: branches/jcl-stack-trace/jcl/packages/JclPackagesD110.groupproj =================================================================== --- branches/jcl-stack-trace/jcl/packages/JclPackagesD110.groupproj 2009-04-11 10:59:39 UTC (rev 2732) +++ branches/jcl-stack-trace/jcl/packages/JclPackagesD110.groupproj 2009-04-11 12:45:00 UTC (rev 2733) @@ -100,13 +100,22 @@ <Target Name="JclVersionControlExpert:Make"> <MSBuild Projects="d11\JclVersionControlExpert.dproj" Targets="Make" /> </Target> + <Target Name="JclStackTraceViewerExpert"> + <MSBuild Projects="d11\JclStackTraceViewerExpert.dproj" Targets="" /> + </Target> + <Target Name="JclStackTraceViewerExpert:Clean"> + <MSBuild Projects="d11\JclStackTraceViewerExpert.dproj" Targets="Clean" /> + </Target> + <Target Name="JclStackTraceViewerExpert:Make"> + <MSBuild Projects="d11\JclStackTraceViewerExpert.dproj" Targets="Make" /> + </Target> <Target Name="Build"> - <CallTarget Targets="Jcl;JclVcl;JclContainers;JclBaseExpert;JclDebugExpert;JclFavoriteFoldersExpert;JclProjectAnalysisExpert;JclRepositoryExpert;JclSIMDViewExpert;JclVersionControlExpert" /> + <CallTarget Targets="Jcl;JclVcl;JclContainers;JclBaseExpert;JclDebugExpert;JclFavoriteFoldersExpert;JclProjectAnalysisExpert;JclRepositoryExpert;JclSIMDViewExpert;JclVersionControlExpert;JclStackTraceViewerExpert" /> </Target> <Target Name="Clean"> - <CallTarget Targets="Jcl:Clean;JclVcl:Clean;JclContainers:Clean;JclBaseExpert:Clean;JclDebugExpert:Clean;JclFavoriteFoldersExpert:Clean;JclProjectAnalysisExpert:Clean;JclRepositoryExpert:Clean;JclSIMDViewExpert:Clean;JclVersionControlExpert:Clean" /> + <CallTarget Targets="Jcl:Clean;JclVcl:Clean;JclContainers:Clean;JclBaseExpert:Clean;JclDebugExpert:Clean;JclFavoriteFoldersExpert:Clean;JclProjectAnalysisExpert:Clean;JclRepositoryExpert:Clean;JclSIMDViewExpert:Clean;JclVersionControlExpert:Clean;JclStackTraceViewerExpert:Clean" /> </Target> <Target Name="Make"> - <CallTarget Targets="Jcl:Make;JclVcl:Make;JclContainers:Make;JclBaseExpert:Make;JclDebugExpert:Make;JclFavoriteFoldersExpert:Make;JclProjectAnalysisExpert:Make;JclRepositoryExpert:Make;JclSIMDViewExpert:Make;JclVersionControlExpert:Make" /> + <CallTarget Targets="Jcl:Make;JclVcl:Make;JclContainers:Make;JclBaseExpert:Make;JclDebugExpert:Make;JclFavoriteFoldersExpert:Make;JclProjectAnalysisExpert:Make;JclRepositoryExpert:Make;JclSIMDViewExpert:Make;JclVersionControlExpert:Make;JclStackTraceViewerExpert:Make" /> </Target> </Project> \ No newline at end of file Modified: branches/jcl-stack-trace/jcl/packages/JclPackagesD120.groupproj =================================================================== --- branches/jcl-stack-trace/jcl/packages/JclPackagesD120.groupproj 2009-04-11 10:59:39 UTC (rev 2732) +++ branches/jcl-stack-trace/jcl/packages/JclPackagesD120.groupproj 2009-04-11 12:45:00 UTC (rev 2733) @@ -33,6 +33,9 @@ <Projects Include="d12\JclVersionControlExpert.dproj"> <Dependencies/> </Projects> + <Projects Include="d12\JclStackTraceViewerExpert.dproj"> + <Dependencies/> + </Projects> </ItemGroup> <ProjectExtensions> <Borland.Personality>Default.Personality</Borland.Personality> @@ -130,14 +133,23 @@ <Target Name="JclVersionControlExpert:Make"> <MSBuild Targets="Make" Projects="d12\JclVersionControlExpert.dproj"/> </Target> + <Target Name="JclStackTraceViewerExpert"> + <MSBuild Projects="d12\JclStackTraceViewerExpert.dproj"/> + </Target> + <Target Name="JclStackTraceViewerExpert:Clean"> + <MSBuild Targets="Clean" Projects="d12\JclStackTraceViewerExpert.dproj"/> + </Target> + <Target Name="JclStackTraceViewerExpert:Make"> + <MSBuild Targets="Make" Projects="d12\JclStackTraceViewerExpert.dproj"/> + </Target> <Target Name="Build"> - <CallTarget Targets="Jcl;JclVcl;JclContainers;JclBaseExpert;JclDebugExpert;JclFavoriteFoldersExpert;JclProjectAnalysisExpert;JclRepositoryExpert;JclSIMDViewExpert;JclVersionControlExpert"/> + <CallTarget Targets="Jcl;JclVcl;JclContainers;JclBaseExpert;JclDebugExpert;JclFavoriteFoldersExpert;JclProjectAnalysisExpert;JclRepositoryExpert;JclSIMDViewExpert;JclVersionControlExpert;JclStackTraceViewerExpert"/> </Target> <Target Name="Clean"> - <CallTarget Targets="Jcl:Clean;JclVcl:Clean;JclContainers:Clean;JclBaseExpert:Clean;JclDebugExpert:Clean;JclFavoriteFoldersExpert:Clean;JclProjectAnalysisExpert:Clean;JclRepositoryExpert:Clean;JclSIMDViewExpert:Clean;JclVersionControlExpert:Clean"/> + <CallTarget Targets="Jcl:Clean;JclVcl:Clean;JclContainers:Clean;JclBaseExpert:Clean;JclDebugExpert:Clean;JclFavoriteFoldersExpert:Clean;JclProjectAnalysisExpert:Clean;JclRepositoryExpert:Clean;JclSIMDViewExpert:Clean;JclVersionControlExpert:Clean;JclStackTraceViewerExpert:Clean"/> </Target> <Target Name="Make"> - <CallTarget Targets="Jcl:Make;JclVcl:Make;JclContainers:Make;JclBaseExpert:Make;JclDebugExpert:Make;JclFavoriteFoldersExpert:Make;JclProjectAnalysisExpert:Make;JclRepositoryExpert:Make;JclSIMDViewExpert:Make;JclVersionControlExpert:Make"/> + <CallTarget Targets="Jcl:Make;JclVcl:Make;JclContainers:Make;JclBaseExpert:Make;JclDebugExpert:Make;JclFavoriteFoldersExpert:Make;JclProjectAnalysisExpert:Make;JclRepositoryExpert:Make;JclSIMDViewExpert:Make;JclVersionControlExpert:Make;JclStackTraceViewerExpert:Make"/> </Target> <Import Project="$(BDS)\Bin\CodeGear.Group.Targets" Condition="Exists('$(BDS)\Bin\CodeGear.Group.Targets')"/> </Project> Added: branches/jcl-stack-trace/jcl/packages/d11/JclStackTraceViewerExpert.dpk =================================================================== --- branches/jcl-stack-trace/jcl/packages/d11/JclStackTraceViewerExpert.dpk (rev 0) +++ branches/jcl-stack-trace/jcl/packages/d11/JclStackTraceViewerExpert.dpk 2009-04-11 12:45:00 UTC (rev 2733) @@ -0,0 +1,67 @@ +package JclStackTraceViewerExpert; +{ +----------------------------------------------------------------------------- + DO NOT EDIT THIS FILE, IT IS GENERATED BY THE PACKAGE GENERATOR + ALWAYS EDIT THE RELATED XML FILE (JclStackTraceViewerExpert-D.xml) + + Last generated: 11-04-2009 11:49:00 UTC +----------------------------------------------------------------------------- +} + +{$R *.res} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO OFF} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS OFF} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO OFF} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $58120000} +{$DESCRIPTION 'JCL Stack Trace Viewer'} +{$LIBSUFFIX '110'} +{$DESIGNONLY} +{$IMPLICITBUILD OFF} + +{$DEFINE BCB} +{$DEFINE RELEASE} + +requires + rtl, + vcl, + designide, + Jcl, + JclBaseExpert + ; + +contains + StackTraceViewerImpl in '..\..\experts\stackviewer\StackTraceViewerImpl.pas' , + ExceptInfoFrame in '..\..\experts\stackviewer\ExceptInfoFrame.pas' {frmException: TFrame}, + StackFrame in '..\..\experts\stackviewer\StackFrame.pas' {frmStack: TFrame}, + ThreadFrame in '..\..\experts\stackviewer\ThreadFrame.pas' {frmThread: TFrame}, + StackFrame2 in '..\..\experts\stackviewer\StackFrame2.pas' {frmStack2: TFrame}, + ModuleFrame in '..\..\experts\stackviewer\ModuleFrame.pas' {frmModule: TFrame}, + StackViewForm in '..\..\experts\stackviewer\StackViewForm.pas' {frmStackView}, + StackTraceViewerConfigFrame in '..\..\experts\stackviewer\StackTraceViewerConfigFrame.pas' {JclStackTraceViewerConfigFrame: TFrame}, + JclDebugStackUtils in '..\..\experts\stackviewer\JclDebugStackUtils.pas' , + StackViewUnit in '..\..\experts\stackviewer\StackViewUnit.pas' , + StackCodeUtils in '..\..\experts\stackviewer\StackCodeUtils.pas' , + ExceptionViewerOptionsUnit in '..\..\experts\stackviewer\ExceptionViewerOptionsUnit.pas' , + StackLineNumberTranslator in '..\..\experts\stackviewer\StackLineNumberTranslator.pas' , + JclStackTraceViewerAPI in '..\..\experts\stackviewer\JclStackTraceViewerAPI.pas' , + FileSearcherUnit in '..\..\experts\stackviewer\FileSearcherUnit.pas' + ; + +end. Added: branches/jcl-stack-trace/jcl/packages/d11/JclStackTraceViewerExpert.dproj =================================================================== --- branches/jcl-stack-trace/jcl/packages/d11/JclStackTraceViewerExpert.dproj (rev 0) +++ branches/jcl-stack-trace/jcl/packages/d11/JclStackTraceViewerExpert.dproj 2009-04-11 12:45:00 UTC (rev 2733) @@ -0,0 +1,109 @@ +<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <PropertyGroup> + <ProjectGuid>{85153A85-6CA4-4CD5-92E6-C39A5C5161E2}</ProjectGuid> + <MainSource>JclStackTraceViewerExpert.dpk</MainSource> + <Configuration Condition=" '$(Configuration)' == '' ">Release</Configuration> + <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> + <DCC_DCCCompiler>DCC32</DCC_DCCCompiler> + <DCC_UsePackage>rtl;vcl;designide;Jcl;JclBaseExpert</DCC_UsePackage> + <DCC_Define>BCB;RELEASE</DCC_Define> + </PropertyGroup> + <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> + <Version>7.0</Version> + <DCC_DebugInformation>False</DCC_DebugInformation> + <DCC_LocalDebugSymbols>False</DCC_LocalDebugSymbols> + <DCC_SymbolReferenceInfo>0</DCC_SymbolReferenceInfo> + <DCC_DcuOutput>..\..\lib\d11</DCC_DcuOutput> + <DCC_ObjOutput>..\..\lib\d11</DCC_ObjOutput> + <DCC_HppOutput>..\..\lib\d11</DCC_HppOutput> + <DCC_DcpOutput>..\..\lib\d11</DCC_DcpOutput> + <DCC_UnitSearchPath>..\..\lib\d11;..\..\source\include</DCC_UnitSearchPath> + <DCC_ResourcePath>..\..\lib\d11;..\..\source\include</DCC_ResourcePath> + <DCC_ObjPath>..\..\lib\d11;..\..\source\include</DCC_ObjPath> + <DCC_IncludePath>..\..\lib\d11;..\..\source\include</DCC_IncludePath> + </PropertyGroup> + <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> + <Version>7.0</Version> + <DCC_DcuOutput>..\..\lib\d11\debug</DCC_DcuOutput> + <DCC_ObjOutput>..\..\lib\d11\debug</DCC_ObjOutput> + <DCC_HppOutput>..\..\lib\d11\debug</DCC_HppOutput> + <DCC_DcpOutput>..\..\lib\d11\debug</DCC_DcpOutput> + <DCC_UnitSearchPath>..\..\lib\d11\debug;..\..\source\include</DCC_UnitSearchPath> + <DCC_ResourcePath>..\..\lib\d11\debug;..\..\source\include</DCC_ResourcePath> + <DCC_ObjPath>..\..\lib\d11\debug;..\..\source\include</DCC_ObjPath> + <DCC_IncludePath>..\..\lib\d11\debug;..\..\source\include</DCC_IncludePath> + </PropertyGroup> + <ProjectExtensions> + <Borland.Personality>Delphi.Personality</Borland.Personality> + <Borland.ProjectType>Package</Borland.ProjectType> + <BorlandProject> + <BorlandProject xmlns=""> + <Delphi.Personality> + <Parameters> + <Parameters Name="UseLauncher">False</Parameters> + <Parameters Name="LoadAllSymbols">True</Parameters> + <Parameters Name="LoadUnspecifiedSymbols">False</Parameters> + </Parameters> + <VersionInfo> + <VersionInfo Name="IncludeVerInfo">True</VersionInfo> + <VersionInfo Name="AutoIncBuild">False</VersionInfo> + <VersionInfo Name="MajorVer">1</VersionInfo> + <VersionInfo Name="MinorVer">105</VersionInfo> + <VersionInfo Name="Release">0</VersionInfo> + <VersionInfo Name="Build">3249</VersionInfo> + <VersionInfo Name="Debug">False</VersionInfo> + <VersionInfo Name="PreRelease">False</VersionInfo> + <VersionInfo Name="Special">False</VersionInfo> + <VersionInfo Name="Private">False</VersionInfo> + <VersionInfo Name="DLL">False</VersionInfo> + <VersionInfo Name="Locale">1031</VersionInfo> + <VersionInfo Name="CodePage">1252</VersionInfo> + </VersionInfo> + <VersionInfoKeys> + <VersionInfoKeys Name="CompanyName">Project JEDI</VersionInfoKeys> + <VersionInfoKeys Name="FileDescription">JCL Stack Trace Viewer</VersionInfoKeys> + <VersionInfoKeys Name="FileVersion">1.105.0.3249</VersionInfoKeys> + <VersionInfoKeys Name="InternalName">JclStackTraceViewerExpert</VersionInfoKeys> + <VersionInfoKeys Name="LegalCopyright">Copyright (C) 1999, 2008 Project JEDI</VersionInfoKeys> + <VersionInfoKeys Name="LegalTrademarks"></VersionInfoKeys> + <VersionInfoKeys Name="OriginalFilename">JclStackTraceViewerExpert110.bpl</VersionInfoKeys> + <VersionInfoKeys Name="ProductName">JEDI Code Library</VersionInfoKeys> + <VersionInfoKeys Name="ProductVersion">1.105 Build 3249</VersionInfoKeys> + </VersionInfoKeys> + <Source> + <Source Name="MainSource">JclStackTraceViewerExpert.dpk</Source> + </Source> + <Package_Options> + <Package_Options Name="LibSuffix">110</Package_Options> + </Package_Options> + </Delphi.Personality> + </BorlandProject> + </BorlandProject> + </ProjectExtensions> + <Import Project="$(MSBuildBinPath)\Borland.Delphi.Targets" /> + <ItemGroup> + <DelphiCompile Include="JclStackTraceViewerExpert.dpk"> + <MainSource>MainSource</MainSource> + </DelphiCompile> + <DCCReference Include="rtl.dcp" /> + <DCCReference Include="vcl.dcp" /> + <DCCReference Include="designide.dcp" /> + <DCCReference Include="Jcl.dcp" /> + <DCCReference Include="JclBaseExpert.dcp" /> + <DCCReference Include="..\..\experts\stackviewer\StackTraceViewerImpl.pas" /> + <DCCReference Include="..\..\experts\stackviewer\ExceptInfoFrame.pas" /> + <DCCReference Include="..\..\experts\stackviewer\StackFrame.pas" /> + <DCCReference Include="..\..\experts\stackviewer\ThreadFrame.pas" /> + <DCCReference Include="..\..\experts\stackviewer\StackFrame2.pas" /> + <DCCReference Include="..\..\experts\stackviewer\ModuleFrame.pas" /> + <DCCReference Include="..\..\experts\stackviewer\StackViewForm.pas" /> + <DCCReference Include="..\..\experts\stackviewer\StackTraceViewerConfigFrame.pas" /> + <DCCReference Include="..\..\experts\stackviewer\JclDebugStackUtils.pas" /> + <DCCReference Include="..\..\experts\stackviewer\StackViewUnit.pas" /> + <DCCReference Include="..\..\experts\stackviewer\StackCodeUtils.pas" /> + <DCCReference Include="..\..\experts\stackviewer\ExceptionViewerOptionsUnit.pas" /> + <DCCReference Include="..\..\experts\stackviewer\StackLineNumberTranslator.pas" /> + <DCCReference Include="..\..\experts\stackviewer\JclStackTraceViewerAPI.pas" /> + <DCCReference Include="..\..\experts\stackviewer\FileSearcherUnit.pas" /> + </ItemGroup> +</Project> Added: branches/jcl-stack-trace/jcl/packages/d11/JclStackTraceViewerExpert.rc =================================================================== --- branches/jcl-stack-trace/jcl/packages/d11/JclStackTraceViewerExpert.rc (rev 0) +++ branches/jcl-stack-trace/jcl/packages/d11/JclStackTraceViewerExpert.rc 2009-04-11 12:45:00 UTC (rev 2733) @@ -0,0 +1,32 @@ +VS_VERSION_INFO VERSIONINFO +FILEVERSION 1,105,0,3249 +PRODUCTVERSION 1,105,0,3249 + FILEFLAGSMASK VS_FFI_FILEFLAGSMASK +#ifdef _DEBUG + FILEFLAGS VS_FF_DEBUG +#else + FILEFLAGS 0x0L +#endif + FILEOS VOS__WINDOWS32 + FILETYPE VFT_DLL + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904E4" + BEGIN + VALUE "CompanyName", "Project JEDI\0" + VALUE "FileDescription", "JCL Stack Trace Viewer\0" + VALUE "FileVersion", "1.105.0.3249\0" + VALUE "InternalName", "JclStackTraceViewerExpert\0" + VALUE "LegalCopyright", "Copyright (C) 1999, 2008 Project JEDI\0" + VALUE "OriginalFilename", "JclStackTraceViewerExpert110.bpl\0" + VALUE "ProductName", "JEDI Code Library\0" + VALUE "ProductVersion", "1.105 Build 3249\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0409, 1252 + END +END Added: branches/jcl-stack-trace/jcl/packages/d11/JclStackTraceViewerExpertDLL.dpr =================================================================== --- branches/jcl-stack-trace/jcl/packages/d11/JclStackTraceViewerExpertDLL.dpr (rev 0) +++ branches/jcl-stack-trace/jcl/packages/d11/JclStackTraceViewerExpertDLL.dpr 2009-04-11 12:45:00 UTC (rev 2733) @@ -0,0 +1,62 @@ +Library JclStackTraceViewerExpertDLL; +{ +----------------------------------------------------------------------------- + DO NOT EDIT THIS FILE, IT IS GENERATED BY THE PACKAGE GENERATOR + ALWAYS EDIT THE RELATED XML FILE (JclStackTraceViewerExpertDLL-L.xml) + + Last generated: 11-04-2009 11:49:00 UTC +----------------------------------------------------------------------------- +} + +{$R *.res} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO OFF} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS OFF} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO OFF} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $58120000} +{$DESCRIPTION 'JCL Stack Trace Viewer'} +{$LIBSUFFIX '110'} +{$IMPLICITBUILD OFF} + +{$DEFINE BCB} +{$DEFINE RELEASE} + +uses + ToolsAPI, + StackTraceViewerImpl in '..\..\experts\stackviewer\StackTraceViewerImpl.pas' , + ExceptInfoFrame in '..\..\experts\stackviewer\ExceptInfoFrame.pas' {frmException: TFrame}, + StackFrame in '..\..\experts\stackviewer\StackFrame.pas' {frmStack: TFrame}, + ThreadFrame in '..\..\experts\stackviewer\ThreadFrame.pas' {frmThread: TFrame}, + StackFrame2 in '..\..\experts\stackviewer\StackFrame2.pas' {frmStack2: TFrame}, + ModuleFrame in '..\..\experts\stackviewer\ModuleFrame.pas' {frmModule: TFrame}, + StackViewForm in '..\..\experts\stackviewer\StackViewForm.pas' {frmStackView}, + StackTraceViewerConfigFrame in '..\..\experts\stackviewer\StackTraceViewerConfigFrame.pas' {JclStackTraceViewerConfigFrame: TFrame}, + JclDebugStackUtils in '..\..\experts\stackviewer\JclDebugStackUtils.pas' , + StackViewUnit in '..\..\experts\stackviewer\StackViewUnit.pas' , + StackCodeUtils in '..\..\experts\stackviewer\StackCodeUtils.pas' , + ExceptionViewerOptionsUnit in '..\..\experts\stackviewer\ExceptionViewerOptionsUnit.pas' , + StackLineNumberTranslator in '..\..\experts\stackviewer\StackLineNumberTranslator.pas' , + JclStackTraceViewerAPI in '..\..\experts\stackviewer\JclStackTraceViewerAPI.pas' , + FileSearcherUnit in '..\..\experts\stackviewer\FileSearcherUnit.pas' + ; + +exports + JCLWizardInit name WizardEntryPoint; + +end. Added: branches/jcl-stack-trace/jcl/packages/d11/JclStackTraceViewerExpertDLL.dproj =================================================================== --- branches/jcl-stack-trace/jcl/packages/d11/JclStackTraceViewerExpertDLL.dproj (rev 0) +++ branches/jcl-stack-trace/jcl/packages/d11/JclStackTraceViewerExpertDLL.dproj 2009-04-11 12:45:00 UTC (rev 2733) @@ -0,0 +1,109 @@ +<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <PropertyGroup> + <ProjectGuid>{851E8773-ADE0-479D-94F9-FE3AAB64A847}</ProjectGuid> + <MainSource>JclStackTraceViewerExpertDLL.dpr</MainSource> + <Configuration Condition=" '$(Configuration)' == '' ">Release</Configuration> + <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> + <DCC_DCCCompiler>DCC32</DCC_DCCCompiler> + <DCC_UsePackage>rtl;vcl;designide;Jcl;JclBaseExpert</DCC_UsePackage> + <DCC_Define>BCB;RELEASE</DCC_Define> + </PropertyGroup> + <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> + <Version>7.0</Version> + <DCC_DebugInformation>False</DCC_DebugInformation> + <DCC_LocalDebugSymbols>False</DCC_LocalDebugSymbols> + <DCC_SymbolReferenceInfo>0</DCC_SymbolReferenceInfo> + <DCC_DcuOutput>..\..\lib\d11</DCC_DcuOutput> + <DCC_ObjOutput>..\..\lib\d11</DCC_ObjOutput> + <DCC_HppOutput>..\..\lib\d11</DCC_HppOutput> + <DCC_DcpOutput>..\..\lib\d11</DCC_DcpOutput> + <DCC_UnitSearchPath>..\..\lib\d11;..\..\source\include</DCC_UnitSearchPath> + <DCC_ResourcePath>..\..\lib\d11;..\..\source\include</DCC_ResourcePath> + <DCC_ObjPath>..\..\lib\d11;..\..\source\include</DCC_ObjPath> + <DCC_IncludePath>..\..\lib\d11;..\..\source\include</DCC_IncludePath> + </PropertyGroup> + <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> + <Version>7.0</Version> + <DCC_DcuOutput>..\..\lib\d11\debug</DCC_DcuOutput> + <DCC_ObjOutput>..\..\lib\d11\debug</DCC_ObjOutput> + <DCC_HppOutput>..\..\lib\d11\debug</DCC_HppOutput> + <DCC_DcpOutput>..\..\lib\d11\debug</DCC_DcpOutput> + <DCC_UnitSearchPath>..\..\lib\d11\debug;..\..\source\include</DCC_UnitSearchPath> + <DCC_ResourcePath>..\..\lib\d11\debug;..\..\source\include</DCC_ResourcePath> + <DCC_ObjPath>..\..\lib\d11\debug;..\..\source\include</DCC_ObjPath> + <DCC_IncludePath>..\..\lib\d11\debug;..\..\source\include</DCC_IncludePath> + </PropertyGroup> + <ProjectExtensions> + <Borland.Personality>Delphi.Personality</Borland.Personality> + <Borland.ProjectType>Package</Borland.ProjectType> + <BorlandProject> + <BorlandProject xmlns=""> + <Delphi.Personality> + <Parameters> + <Parameters Name="UseLauncher">False</Parameters> + <Parameters Name="LoadAllSymbols">True</Parameters> + <Parameters Name="LoadUnspecifiedSymbols">False</Parameters> + </Parameters> + <VersionInfo> + <VersionInfo Name="IncludeVerInfo">True</VersionInfo> + <VersionInfo Name="AutoIncBuild">False</VersionInfo> + <VersionInfo Name="MajorVer">1</VersionInfo> + <VersionInfo Name="MinorVer">105</VersionInfo> + <VersionInfo Name="Release">0</VersionInfo> + <VersionInfo Name="Build">3249</VersionInfo> + <VersionInfo Name="Debug">False</VersionInfo> + <VersionInfo Name="PreRelease">False</VersionInfo> + <VersionInfo Name="Special">False</VersionInfo> + <VersionInfo Name="Private">False</VersionInfo> + <VersionInfo Name="DLL">False</VersionInfo> + <VersionInfo Name="Locale">1031</VersionInfo> + <VersionInfo Name="CodePage">1252</VersionInfo> + </VersionInfo> + <VersionInfoKeys> + <VersionInfoKeys Name="CompanyName">Project JEDI</VersionInfoKeys> + <VersionInfoKeys Name="FileDescription">JCL Stack Trace Viewer</VersionInfoKeys> + <VersionInfoKeys Name="FileVersion">1.105.0.3249</VersionInfoKeys> + <VersionInfoKeys Name="InternalName">JclStackTraceViewerExpertDLL</VersionInfoKeys> + <VersionInfoKeys Name="LegalCopyright">Copyright (C) 1999, 2008 Project JEDI</VersionInfoKeys> + <VersionInfoKeys Name="LegalTrademarks"></VersionInfoKeys> + <VersionInfoKeys Name="OriginalFilename">JclStackTraceViewerExpertDLL110.dll</VersionInfoKeys> + <VersionInfoKeys Name="ProductName">JEDI Code Library</VersionInfoKeys> + <VersionInfoKeys Name="ProductVersion">1.105 Build 3249</VersionInfoKeys> + </VersionInfoKeys> + <Source> + <Source Name="MainSource">JclStackTraceViewerExpertDLL.dpr</Source> + </Source> + <Package_Options> + <Package_Options Name="LibSuffix">110</Package_Options> + </Package_Options> + </Delphi.Personality> + </BorlandProject> + </BorlandProject> + </ProjectExtensions> + <Import Project="$(MSBuildBinPath)\Borland.Delphi.Targets" /> + <ItemGroup> + <DelphiCompile Include="JclStackTraceViewerExpertDLL.dpr"> + <MainSource>MainSource</MainSource> + </DelphiCompile> + <DCCReference Include="rtl.dcp" /> + <DCCReference Include="vcl.dcp" /> + <DCCReference Include="designide.dcp" /> + <DCCReference Include="Jcl.dcp" /> + <DCCReference Include="JclBaseExpert.dcp" /> + <DCCReference Include="..\..\experts\stackviewer\StackTraceViewerImpl.pas" /> + <DCCReference Include="..\..\experts\stackviewer\ExceptInfoFrame.pas" /> + <DCCReference Include="..\..\experts\stackviewer\StackFrame.pas" /> + <DCCReference Include="..\..\experts\stackviewer\ThreadFrame.pas" /> + <DCCReference Include="..\..\experts\stackviewer\StackFrame2.pas" /> + <DCCReference Include="..\..\experts\stackviewer\ModuleFrame.pas" /> + <DCCReference Include="..\..\experts\stackviewer\StackViewForm.pas" /> + <DCCReference Include="..\..\experts\stackviewer\StackTraceViewerConfigFrame.pas" /> + <DCCReference Include="..\..\experts\stackviewer\JclDebugStackUtils.pas" /> + <DCCReference Include="..\..\experts\stackviewer\StackViewUnit.pas" /> + <DCCReference Include="..\..\experts\stackviewer\StackCodeUtils.pas" /> + <DCCReference Include="..\..\experts\stackviewer\ExceptionViewerOptionsUnit.pas" /> + <DCCReference Include="..\..\experts\stackviewer\StackLineNumberTranslator.pas" /> + <DCCReference Include="..\..\experts\stackviewer\JclStackTraceViewerAPI.pas" /> + <DCCReference Include="..\..\experts\stackviewer\FileSearcherUnit.pas" /> + </ItemGroup> +</Project> Added: branches/jcl-stack-trace/jcl/packages/d11/JclStackTraceViewerExpertDLL.rc =================================================================== --- branches/jcl-stack-trace/jcl/packages/d11/JclStackTraceViewerExpertDLL.rc (rev 0) +++ branches/jcl-stack-trace/jcl/packages/d11/JclStackTraceViewerExpertDLL.rc 2009-04-11 12:45:00 UTC (rev 2733) @@ -0,0 +1,32 @@ +VS_VERSION_INFO VERSIONINFO +FILEVERSION 1,105,0,3249 +PRODUCTVERSION 1,105,0,3249 + FILEFLAGSMASK VS_FFI_FILEFLAGSMASK +#ifdef _DEBUG + FILEFLAGS VS_FF_DEBUG +#else + FILEFLAGS 0x0L +#endif + FILEOS VOS__WINDOWS32 + FILETYPE VFT_DLL + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904E4" + BEGIN + VALUE "CompanyName", "Project JEDI\0" + VALUE "FileDescription", "JCL Stack Trace Viewer\0" + VALUE "FileVersion", "1.105.0.3249\0" + VALUE "InternalName", "JclStackTraceViewerExpertDLL\0" + VALUE "LegalCopyright", "Copyright (C) 1999, 2008 Project JEDI\0" + VALUE "OriginalFilename", "JclStackTraceViewerExpertDLL110.dll\0" + VALUE "ProductName", "JEDI Code Library\0" + VALUE "ProductVersion", "1.105 Build 3249\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0409, 1252 + END +END Modified: branches/jcl-stack-trace/jcl/packages/d12/JclStackTraceViewerExpert.dpk =================================================================== --- branches/jcl-stack-trace/jcl/packages/d12/JclStackTraceViewerExpert.dpk 2009-04-11 10:59:39 UTC (rev 2732) +++ branches/jcl-stack-trace/jcl/packages/d12/JclStackTraceViewerExpert.dpk 2009-04-11 12:45:00 UTC (rev 2733) @@ -4,7 +4,7 @@ DO NOT EDIT THIS FILE, IT IS GENERATED BY THE PACKAGE GENERATOR ALWAYS EDIT THE RELATED XML FILE (JclStackTraceViewerExpert-D.xml) - Last generated: 08-04-2009 19:06:47 UTC + Last generated: 11-04-2009 12:04:25 UTC ----------------------------------------------------------------------------- } @@ -47,7 +47,21 @@ ; contains - StackTraceViewerImpl in '..\..\experts\stackviewer\StackTraceViewerImpl.pas' + StackTraceViewerImpl in '..\..\experts\stackviewer\StackTraceViewerImpl.pas' , + ExceptInfoFrame in '..\..\experts\stackviewer\ExceptInfoFrame.pas' {frmException: TFrame}, + StackFrame in '..\..\experts\stackviewer\StackFrame.pas' {frmStack: TFrame}, + ThreadFrame in '..\..\experts\stackviewer\ThreadFrame.pas' {frmThread: TFrame}, + StackFrame2 in '..\..\experts\stackviewer\StackFrame2.pas' {frmStack2: TFrame}, + ModuleFrame in '..\..\experts\stackviewer\ModuleFrame.pas' {frmModule: TFrame}, + StackViewForm in '..\..\experts\stackviewer\StackViewForm.pas' {frmStackView}, + StackTraceViewerConfigFrame in '..\..\experts\stackviewer\StackTraceViewerConfigFrame.pas' {JclStackTraceViewerConfigFrame: TFrame}, + JclDebugStackUtils in '..\..\experts\stackviewer\JclDebugStackUtils.pas' , + StackViewUnit in '..\..\experts\stackviewer\StackViewUnit.pas' , + StackCodeUtils in '..\..\experts\stackviewer\StackCodeUtils.pas' , + ExceptionViewerOptionsUnit in '..\..\experts\stackviewer\ExceptionViewerOptionsUnit.pas' , + StackLineNumberTranslator in '..\..\experts\stackviewer\StackLineNumberTranslator.pas' , + JclStackTraceViewerAPI in '..\..\experts\stackviewer\JclStackTraceViewerAPI.pas' , + FileSearcherUnit in '..\..\experts\stackviewer\FileSearcherUnit.pas' ; end. Modified: branches/jcl-stack-trace/jcl/packages/d12/JclStackTraceViewerExpert.dproj =================================================================== --- branches/jcl-stack-trace/jcl/packages/d12/JclStackTraceViewerExpert.dproj 2009-04-11 10:59:39 UTC (rev 2732) +++ branches/jcl-stack-trace/jcl/packages/d12/JclStackTraceViewerExpert.dproj 2009-04-11 12:45:00 UTC (rev 2733) @@ -67,6 +67,20 @@ <DCCReference Include="Jcl.dcp" /> <DCCReference Include="JclBaseExpert.dcp" /> <DCCReference Include="..\..\experts\stackviewer\StackTraceViewerImpl.pas" /> + <DCCReference Include="..\..\experts\stackviewer\ExceptInfoFrame.pas" /> + <DCCReference Include="..\..\experts\stackviewer\StackFrame.pas" /> + <DCCReference Include="..\..\experts\stackviewer\ThreadFrame.pas" /> + <DCCReference Include="..\..\experts\stackviewer\StackFrame2.pas" /> + <DCCReference Include="..\..\experts\stackviewer\ModuleFrame.pas" /> + <DCCReference Include="..\..\experts\stackviewer\StackViewForm.pas" /> + <DCCReference Include="..\..\experts\stackviewer\StackTraceViewerConfigFrame.pas" /> + <DCCReference Include="..\..\experts\stackviewer\JclDebugStackUtils.pas" /> + <DCCReference Include="..\..\experts\stackviewer\StackViewUnit.pas" /> + <DCCReference Include="..\..\experts\stackviewer\StackCodeUtils.pas" /> + <DCCReference Include="..\..\experts\stackviewer\ExceptionViewerOptionsUnit.pas" /> + <DCCReference Include="..\..\experts\stackviewer\StackLineNumberTranslator.pas" /> + <DCCReference Include="..\..\experts\stackviewer\JclStackTraceViewerAPI.pas" /> + <DCCReference Include="..\..\experts\stackviewer\FileSearcherUnit.pas" /> <BuildConfiguration Include="Base"> <Key>Base</Key> </BuildConfiguration> Modified: branches/jcl-stack-trace/jcl/packages/d12/JclStackTraceViewerExpertDLL.dpr =================================================================== --- branches/jcl-stack-trace/jcl/packages/d12/JclStackTraceViewerExpertDLL.dpr 2009-04-11 10:59:39 UTC (rev 2732) +++ branches/jcl-stack-trace/jcl/packages/d12/JclStackTraceViewerExpertDLL.dpr 2009-04-11 12:45:00 UTC (rev 2733) @@ -4,7 +4,7 @@ DO NOT EDIT THIS FILE, IT IS GENERATED BY THE PACKAGE GENERATOR ALWAYS EDIT THE RELATED XML FILE (JclStackTraceViewerExpertDLL-L.xml) - Last generated: 08-04-2009 19:06:47 UTC + Last generated: 11-04-2009 12:04:25 UTC ----------------------------------------------------------------------------- } @@ -39,7 +39,21 @@ uses ToolsAPI, - StackTraceViewerImpl in '..\..\experts\stackviewer\StackTraceViewerImpl.pas' + StackTraceViewerImpl in '..\..\experts\stackviewer\StackTraceViewerImpl.pas' , + ExceptInfoFrame in '..\..\experts\stackviewer\ExceptInfoFrame.pas' {frmException: TFrame}, + StackFrame in '..\..\experts\stackviewer\StackFrame.pas' {frmStack: TFrame}, + ThreadFrame in '..\..\experts\stackviewer\ThreadFrame.pas' {frmThread: TFrame}, + StackFrame2 in '..\..\experts\stackviewer\StackFrame2.pas' {frmStack2: TFrame}, + ModuleFrame in '..\..\experts\stackviewer\ModuleFrame.pas' {frmModule: TFrame}, + StackViewForm in '..\..\experts\stackviewer\StackViewForm.pas' {frmStackView}, + StackTraceViewerConfigFrame in '..\..\experts\stackviewer\StackTraceViewerConfigFrame.pas' {JclStackTraceViewerConfigFrame: TFrame}, + JclDebugStackUtils in '..\..\experts\stackviewer\JclDebugStackUtils.pas' , + StackViewUnit in '..\..\experts\stackviewer\StackViewUnit.pas' , + StackCodeUtils in '..\..\experts\stackviewer\StackCodeUtils.pas' , + ExceptionViewerOptionsUnit in '..\..\experts\stackviewer\ExceptionViewerOptionsUnit.pas' , + StackLineNumberTranslator in '..\..\experts\stackviewer\StackLineNumberTranslator.pas' , + JclStackTraceViewerAPI in '..\..\experts\stackviewer\JclStackTraceViewerAPI.pas' , + FileSearcherUnit in '..\..\experts\stackviewer\FileSearcherUnit.pas' ; exports Modified: branches/jcl-stack-trace/jcl/packages/d12/JclStackTraceViewerExpertDLL.dproj =================================================================== --- branches/jcl-stack-trace/jcl/packages/d12/JclStackTraceViewerExpertDLL.dproj 2009-04-11 10:59:39 UTC (rev 2732) +++ branches/jcl-stack-trace/jcl/packages/d12/JclStackTraceViewerExpertDLL.dproj 2009-04-11 12:45:00 UTC (rev 2733) @@ -67,6 +67,20 @@ <DCCReference Include="Jcl.dcp" /> <DCCReference Include="JclBaseExpert.dcp" /> <DCCReference Include="..\..\experts\stackviewer\StackTraceViewerImpl.pas" /> + <DCCReference Include="..\..\experts\stackviewer\ExceptInfoFrame.pas" /> + <DCCReference Include="..\..\experts\stackviewer\StackFrame.pas" /> + <DCCReference Include="..\..\experts\stackviewer\ThreadFrame.pas" /> + <DCCReference Include="..\..\experts\stackviewer\StackFrame2.pas" /> + <DCCReference Include="..\..\experts\stackviewer\ModuleFrame.pas" /> + <DCCReference Include="..\..\experts\stackviewer\StackViewForm.pas" /> + <DCCReference Include="..\..\experts\stackviewer\StackTraceViewerConfigFrame.pas" /> + <DCCReference Include="..\..\experts\stackviewer\JclDebugStackUtils.pas" /> + <DCCReference Include="..\..\experts\stackviewer\StackViewUnit.pas" /> + <DCCReference Include="..\..\experts\stackviewer\StackCodeUtils.pas" /> + <DCCReference Include="..\..\experts\stackviewer\ExceptionViewerOptionsUnit.pas" /> + <DCCReference Include="..\..\experts\stackviewer\StackLineNumberTranslator.pas" /> + <DCCReference Include="..\..\experts\stackviewer\JclStackTraceViewerAPI.pas" /> + <DCCReference Include="..\..\experts\stackviewer\FileSearcherUnit.pas" /> <BuildConfiguration Include="Base"> <Key>Base</Key> </BuildConfiguration> Modified: branches/jcl-stack-trace/jcl/packages/resources.mak =================================================================== --- branches/jcl-stack-trace/jcl/packages/resources.mak 2009-04-11 10:59:39 UTC (rev 2732) +++ branches/jcl-stack-trace/jcl/packages/resources.mak 2009-04-11 12:45:00 UTC (rev 2733) @@ -76,6 +76,8 @@ d11\JclRepositoryExpertDLL.res \ d11\JclSIMDViewExpert.res \ d11\JclSIMDViewExpertDLL.res \ + d11\JclStackTraceViewerExpert.res \ + d11\JclStackTraceViewerExpertDLL.res \ d11\JclVcl.res \ d11\JclVersionControlExpert.res \ d11\JclVersionControlExpertDLL.res \ @@ -92,6 +94,8 @@ d12\JclRepositoryExpertDLL.res \ d12\JclSIMDViewExpert.res \ d12\JclSIMDViewExpertDLL.res \ + d12\JclStackTraceViewerExpert.res \ + d12\JclStackTraceViewerExpertDLL.res \ d12\JclVcl.res \ d12\JclVersionControlExpert.res \ d12\JclVersionControlExpertDLL.res \ Modified: branches/jcl-stack-trace/jcl/packages/xml/JclStackTraceViewerExpert-D.xml =================================================================== --- branches/jcl-stack-trace/jcl/packages/xml/JclStackTraceViewerExpert-D.xml 2009-04-11 10:59:39 UTC (rev 2732) +++ branches/jcl-stack-trace/jcl/packages/xml/JclStackTraceViewerExpert-D.xml 2009-04-11 12:45:00 UTC (rev 2733) @@ -19,5 +19,19 @@ </Requires> <Contains> <File Name="..\..\experts\stackviewer\StackTraceViewerImpl.pas" Targets="Windows" Formname="" Condition=""/> + <File Name="..\..\experts\stackviewer\ExceptInfoFrame.pas" Targets="Windows" Formname="frmException: TFrame" Condition=""/> + <File Name="..\..\experts\stackviewer\StackFrame.pas" Targets="Windows" Formname="frmStack: TFrame" Condition=""/> + <File Name="..\..\experts\stackviewer\ThreadFrame.pas" Targets="Windows" Formname="frmThread: TFrame" Condition=""/> + <File Name="..\..\experts\stackviewer\StackFrame2.pas" Targets="Windows" Formname="frmStack2: TFrame" Condition=""/> + <File Name="..\..\experts\stackviewer\ModuleFrame.pas" Targets="Windows" Formname="frmModule: TFrame" Condition=""/> + <File Name="..\..\experts\stackviewer\StackViewForm.pas" Targets="Windows" Formname="frmStackView" Condition=""/> + <File Name="..\..\experts\stackviewer\StackTraceViewerConfigFrame.pas" Targets="Windows" Formname="JclStackTraceViewerConfigFrame: TFrame" Condition=""/> + <File Name="..\..\experts\stackviewer\JclDebugStackUtils.pas" Targets="Windows" Formname="" Condition=""/> + <File Name="..\..\experts\stackviewer\StackViewUnit.pas" Targets="Windows" Formname="" Condition=""/> + <File Name="..\..\experts\stackviewer\StackCodeUtils.pas" Targets="Windows" Formname="" Condition=""/> + <File Name="..\..\experts\stackviewer\ExceptionViewerOptionsUnit.pas" Targets="Windows" Formname="" Condition=""/> + <File Name="..\..\experts\stackviewer\StackLineNumberTranslator.pas" Targets="Windows" Formname="" Condition=""/> + <File Name="..\..\experts\stackviewer\JclStackTraceViewerAPI.pas" Targets="Windows" Formname="" Condition=""/> + <File Name="..\..\experts\stackviewer\FileSearcherUnit.pas" Targets="Windows" Formname="" Condition=""/> </Contains> </Package> Modified: branches/jcl-stack-trace/jcl/packages/xml/JclStackTraceViewerExpertDLL-L.xml =================================================================== --- branches/jcl-stack-trace/jcl/packages/xml/JclStackTraceViewerExpertDLL-L.xml 2009-04-11 10:59:39 UTC (rev 2732) +++ branches/jcl-stack-trace/jcl/packages/xml/JclStackTraceViewerExpertDLL-L.xml 2009-04-11 12:45:00 UTC (rev 2733) @@ -19,5 +19,19 @@ </Requires> <Contains> <File Name="..\..\experts\stackviewer\StackTraceViewerImpl.pas" Targets="Windows" Formname="" Condition=""/> + <File Name="..\..\experts\stackviewer\ExceptInfoFrame.pas" Targets="Windows" Formname="frmException: TFrame" Condition=""/> + <File Name="..\..\experts\stackviewer\StackFrame.pas" Targets="Windows" Formname="frmStack: TFrame" Condition=""/> + <File Name="..\..\experts\stackviewer\ThreadFrame.pas" Targets="Windows" Formname="frmThread: TFrame" Condition=""/> + <File Name="..\..\experts\stackviewer\StackFrame2.pas" Targets="Windows" Formname="frmStack2: TFrame" Condition=""/> + <File Name="..\..\experts\stackviewer\ModuleFrame.pas" Targets="Windows" Formname="frmModule: TFrame" Condition=""/> + <File Name="..\..\experts\stackviewer\StackViewForm.pas" Targets="Windows" Formname="frmStackView" Condition=""/> + <File Name="..\..\experts\stackviewer\StackTraceViewerConfigFrame.pas" Targets="Windows" Formname="JclStackTraceViewerConfigFrame: TFrame" Condition=""/> + <File Name="..\..\experts\stackviewer\JclDebugStackUtils.pas" Targets="Windows" Formname="" Condition=""/> + <File Name="..\..\experts\stackviewer\StackViewUnit.pas" Targets="Windows" Formname="" Condition=""/> + <File Name="..\..\experts\stackviewer\StackCodeUtils.pas" Targets="Windows" Formname="" Condition=""/> + <File Name="..\..\experts\stackviewer\ExceptionViewerOptionsUnit.pas" Targets="Windows" Formname="" Condition=""/> + <File Name="..\..\experts\stackviewer\StackLineNumberTranslator.pas" Targets="Windows" Formname="" Condition=""/> + <File Name="..\..\experts\stackviewer\JclStackTraceViewerAPI.pas" Targets="Windows" Formname="" Condition=""/> + <File Name="..\..\experts\stackviewer\FileSearcherUnit.pas" Targets="Windows" Formname="" Condition=""/> </Contains> </Package> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <usc...@us...> - 2009-04-11 10:59:43
|
Revision: 2732 http://jcl.svn.sourceforge.net/jcl/?rev=2732&view=rev Author: uschuster Date: 2009-04-11 10:59:39 +0000 (Sat, 11 Apr 2009) Log Message: ----------- - created "own" icon for the expert (mixed several JCL Debug icons) - added desktop state stuff to JCLWizardInit (still needs testing) Modified Paths: -------------- branches/jcl-stack-trace/jcl/experts/stackviewer/StackTraceViewerImpl.pas Added Paths: ----------- branches/jcl-stack-trace/jcl/experts/stackviewer/JclStackTraceViewerIcon.res Removed Paths: ------------- branches/jcl-stack-trace/jcl/experts/stackviewer/JclDebugIdeIcon.res branches/jcl-stack-trace/jcl/experts/stackviewer/JclSIMDIcon.dcr Deleted: branches/jcl-stack-trace/jcl/experts/stackviewer/JclDebugIdeIcon.res =================================================================== (Binary files differ) Deleted: branches/jcl-stack-trace/jcl/experts/stackviewer/JclSIMDIcon.dcr =================================================================== (Binary files differ) Added: branches/jcl-stack-trace/jcl/experts/stackviewer/JclStackTraceViewerIcon.res =================================================================== (Binary files differ) Property changes on: branches/jcl-stack-trace/jcl/experts/stackviewer/JclStackTraceViewerIcon.res ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Modified: branches/jcl-stack-trace/jcl/experts/stackviewer/StackTraceViewerImpl.pas =================================================================== --- branches/jcl-stack-trace/jcl/experts/stackviewer/StackTraceViewerImpl.pas 2009-04-08 22:27:00 UTC (rev 2731) +++ branches/jcl-stack-trace/jcl/experts/stackviewer/StackTraceViewerImpl.pas 2009-04-11 10:59:39 UTC (rev 2732) @@ -12,8 +12,6 @@ JclOtaUtils, StackViewForm, StackTraceViewerConfigFrame, ExceptionViewerOptionsUnit, DeskUtil; -{$R 'JclSIMDIcon.dcr'} //todo - own icon - type TJclStackTraceViewerExpert = class(TJclOTAExpert) private @@ -54,7 +52,7 @@ implementation -{$R JclDebugIdeIcon.res}//todo - own icon +{$R JclStackTraceViewerIcon.res} uses JclDebug, JclFileUtils, JclOtaConsts, @@ -100,7 +98,7 @@ end; end; -{ TODO -oUSc : Add and test desktop state stuff (RegisterFieldAddress and RegisterDesktopFormClass) } +{ TODO -oUSc : test desktop state stuff (RegisterFieldAddress and RegisterDesktopFormClass) } function JCLWizardInit(const BorlandIDEServices: IBorlandIDEServices; RegisterProc: TWizardRegisterProc; var TerminateProc: TWizardTerminateProc): Boolean stdcall; @@ -108,6 +106,9 @@ try TerminateProc := JclWizardTerminate; + if Assigned(RegisterFieldAddress) then + RegisterFieldAddress(IDEDesktopIniSection, @frmStackView); + RegisterDesktopFormClass(TfrmStackView, IDEDesktopIniSection, IDEDesktopIniSection); JCLWizardIndex := TJclOTAExpertBase.GetOTAWizardServices.AddWizard(TJclStackTraceViewerExpert.Create); Result := True; @@ -208,7 +209,7 @@ end; FIcon := TIcon.Create; - FIcon.Handle := LoadIcon(FindResourceHInstance(ModuleHInstance), 'SIMDICON');//todo - resource name + FIcon.Handle := LoadIcon(FindResourceHInstance(ModuleHInstance), 'JCLSTACKTRACEVIEWER'); // create actions FStackTraceViewAction := TAction.Create(nil); @@ -218,13 +219,7 @@ FStackTraceViewAction.Category := Category; FStackTraceViewAction.Name := JclStackTraceViewerActionName; FStackTraceViewAction.ActionList := NTAServices.ActionList; - ImageBmp := TBitmap.Create; - try - ImageBmp.LoadFromResourceName(FindResourceHInstance(ModuleHInstance), 'JCLDEBUG');//todo - resource name - FStackTraceViewAction.ImageIndex := NTAServices.AddMasked(ImageBmp, clPurple); - finally - ImageBmp.Free; - end; + FStackTraceViewAction.ImageIndex := NTAServices.ImageList.AddIcon(FIcon); FStackTraceViewMenuItem := TMenuItem.Create(nil); FStackTraceViewMenuItem.Name := JclStackTraceViewerMenuName; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <usc...@us...> - 2009-04-08 22:27:02
|
Revision: 2731 http://jcl.svn.sourceforge.net/jcl/?rev=2731&view=rev Author: uschuster Date: 2009-04-08 22:27:00 +0000 (Wed, 08 Apr 2009) Log Message: ----------- added example line number translator package Modified Paths: -------------- branches/jcl-stack-trace/jcl/TODO.txt Added Paths: ----------- branches/jcl-stack-trace/jcl/experts/stackviewer/APIExamples/ branches/jcl-stack-trace/jcl/experts/stackviewer/APIExamples/Dummy/ branches/jcl-stack-trace/jcl/experts/stackviewer/APIExamples/Dummy/DummyLineNumberTranslator.pas branches/jcl-stack-trace/jcl/experts/stackviewer/APIExamples/Dummy/DummyRevisionProvider.pas branches/jcl-stack-trace/jcl/experts/stackviewer/APIExamples/Dummy/StackTraceViewerDummyExample.dpk branches/jcl-stack-trace/jcl/experts/stackviewer/APIExamples/Dummy/StackTraceViewerDummyExampleReg.pas Modified: branches/jcl-stack-trace/jcl/TODO.txt =================================================================== --- branches/jcl-stack-trace/jcl/TODO.txt 2009-04-08 19:27:17 UTC (rev 2730) +++ branches/jcl-stack-trace/jcl/TODO.txt 2009-04-08 22:27:00 UTC (rev 2731) @@ -39,6 +39,4 @@ * integrate it into the installation - update jcl\packages\JclPackages*.* - add all files to jcl\packages\xml\JclStackTraceViewerExpert*.xml - - generate packages for 5 - 11 - -* example Line number translator package \ No newline at end of file + - generate packages for 5 - 11 \ No newline at end of file Property changes on: branches/jcl-stack-trace/jcl/experts/stackviewer/APIExamples ___________________________________________________________________ Added: tsvn:projectlanguage + 1033 Added: bugtraq:url + http://homepages.codegear.com/jedi/issuetracker/view.php?id=%BUGID% Added: bugtraq:message + (Mantis #%BUGID%) Added: bugtraq:logregex + [Mm]antis #?(\d+)(,? ?#?(\d+))+ (\d+) Property changes on: branches/jcl-stack-trace/jcl/experts/stackviewer/APIExamples/Dummy ___________________________________________________________________ Added: tsvn:projectlanguage + 1033 Added: bugtraq:url + http://homepages.codegear.com/jedi/issuetracker/view.php?id=%BUGID% Added: bugtraq:message + (Mantis #%BUGID%) Added: bugtraq:logregex + [Mm]antis #?(\d+)(,? ?#?(\d+))+ (\d+) Added: branches/jcl-stack-trace/jcl/experts/stackviewer/APIExamples/Dummy/DummyLineNumberTranslator.pas =================================================================== --- branches/jcl-stack-trace/jcl/experts/stackviewer/APIExamples/Dummy/DummyLineNumberTranslator.pas (rev 0) +++ branches/jcl-stack-trace/jcl/experts/stackviewer/APIExamples/Dummy/DummyLineNumberTranslator.pas 2009-04-08 22:27:00 UTC (rev 2731) @@ -0,0 +1,47 @@ +unit DummyLineNumberTranslator; + +interface + +uses + Classes, ActiveX, JclStackTraceViewerAPI; + +type + TDummyLineNumberTranslator = class(TInterfacedObject, IJclLineNumberTranslator) + function GetIDString: string; + function GetName: string; + function TranslateLineNumbers(ARevisionContent, ACurrentContent: IStream; + ARevisionLineNumbers: TList; ACurrentLineNumbers: TList): Integer; + end; + +implementation + +{ TDummyLineNumberTranslator } + +function TDummyLineNumberTranslator.GetIDString: string; +begin + Result := 'Project JEDI.DummyLineNumberTranslator'; +end; + +function TDummyLineNumberTranslator.GetName: string; +begin + Result := 'Dummy LineNumber Translator'; +end; + +function TDummyLineNumberTranslator.TranslateLineNumbers(ARevisionContent, + ACurrentContent: IStream; ARevisionLineNumbers, ACurrentLineNumbers: TList): Integer; +var + I: Integer; +begin + Result := 0; + if Assigned(ARevisionContent) and Assigned(ACurrentContent) and (ARevisionLineNumbers.Count > 0) then + begin + ACurrentLineNumbers.Clear; + for I := 0 to ARevisionLineNumbers.Count - 1 do + begin + ACurrentLineNumbers.Add(Pointer(Integer(ARevisionLineNumbers[I]) + 1)); + Inc(Result); + end; + end; +end; + +end. Added: branches/jcl-stack-trace/jcl/experts/stackviewer/APIExamples/Dummy/DummyRevisionProvider.pas =================================================================== --- branches/jcl-stack-trace/jcl/experts/stackviewer/APIExamples/Dummy/DummyRevisionProvider.pas (rev 0) +++ branches/jcl-stack-trace/jcl/experts/stackviewer/APIExamples/Dummy/DummyRevisionProvider.pas 2009-04-08 22:27:00 UTC (rev 2731) @@ -0,0 +1,46 @@ +unit DummyRevisionProvider; + +interface + +uses + SysUtils, Classes, ActiveX, JclStackTraceViewerAPI; + +type + TDummyRevisionProvider = class(TInterfacedObject, IJclRevisionProvider) + function GetIDString: string; + function GetName: string; + function GetRevisionContent(const AFileName, ARevision: string; AContent: IStream): Boolean; + end; + +implementation + +{ TDummyRevisionProvider } + +function TDummyRevisionProvider.GetIDString: string; +begin + Result := 'Project JEDI.DummyRevisionProvider'; +end; + +function TDummyRevisionProvider.GetName: string; +begin + Result := 'Dummy Revision Provider'; +end; + +function TDummyRevisionProvider.GetRevisionContent(const AFileName, ARevision: string; + AContent: IStream): Boolean; +var + FS: TFileStream; + SA: TStreamAdapter; + R, W: Int64; +begin + Result := True; + FS := TFileStream.Create(AFileName, fmOpenRead); + try + SA := TStreamAdapter.Create(FS); + SA.CopyTo(AContent, FS.Size, R, W); + finally + FS.Free; + end; +end; + +end. \ No newline at end of file Added: branches/jcl-stack-trace/jcl/experts/stackviewer/APIExamples/Dummy/StackTraceViewerDummyExample.dpk =================================================================== --- branches/jcl-stack-trace/jcl/experts/stackviewer/APIExamples/Dummy/StackTraceViewerDummyExample.dpk (rev 0) +++ branches/jcl-stack-trace/jcl/experts/stackviewer/APIExamples/Dummy/StackTraceViewerDummyExample.dpk 2009-04-08 22:27:00 UTC (rev 2731) @@ -0,0 +1,40 @@ +package StackTraceViewerDummyExample; + +{$R *.res} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO OFF} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS OFF} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO OFF} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $58060000} +{$DESCRIPTION 'JCL Stack Trace Viewer API Dummy Example'} +{$LIBSUFFIX '120'} +{$DESIGNONLY} +{$IMPLICITBUILD OFF} + +requires + rtl, + vcl, + JclStackTraceViewerExpert; + +contains + StackTraceViewerDummyExampleReg in 'StackTraceViewerDummyExampleReg.pas', + DummyLineNumberTranslator in 'DummyLineNumberTranslator.pas', + DummyRevisionProvider in 'DummyRevisionProvider.pas'; + +end. Added: branches/jcl-stack-trace/jcl/experts/stackviewer/APIExamples/Dummy/StackTraceViewerDummyExampleReg.pas =================================================================== --- branches/jcl-stack-trace/jcl/experts/stackviewer/APIExamples/Dummy/StackTraceViewerDummyExampleReg.pas (rev 0) +++ branches/jcl-stack-trace/jcl/experts/stackviewer/APIExamples/Dummy/StackTraceViewerDummyExampleReg.pas 2009-04-08 22:27:00 UTC (rev 2731) @@ -0,0 +1,30 @@ +unit StackTraceViewerDummyExampleReg; + +interface + +procedure Register; + +implementation + +uses + JclStackTraceViewerAPI, DummyLineNumberTranslator, DummyRevisionProvider; + +var + LineNumberTranslatorIndex: Integer = -1; + RevisionProviderIndex: Integer = -1; + +procedure Register; +begin + RegisterLineNumberTranslator(TDummyLineNumberTranslator.Create); + RegisterRevisionProvider(TDummyRevisionProvider.Create); +end; + +initialization + +finalization + if LineNumberTranslatorIndex <> -1 then + UnregisterLineNumberTranslator(LineNumberTranslatorIndex); + if RevisionProviderIndex <> -1 then + UnregisterRevisionProvider(RevisionProviderIndex); + +end. \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <usc...@us...> - 2009-04-08 19:27:21
|
Revision: 2730 http://jcl.svn.sourceforge.net/jcl/?rev=2730&view=rev Author: uschuster Date: 2009-04-08 19:27:17 +0000 (Wed, 08 Apr 2009) Log Message: ----------- first changes for installation Modified Paths: -------------- branches/jcl-stack-trace/jcl/TODO.txt branches/jcl-stack-trace/jcl/install/JclInstall.pas Added Paths: ----------- branches/jcl-stack-trace/jcl/packages/d12/JclStackTraceViewerExpert.dpk branches/jcl-stack-trace/jcl/packages/d12/JclStackTraceViewerExpert.dproj branches/jcl-stack-trace/jcl/packages/d12/JclStackTraceViewerExpert.rc branches/jcl-stack-trace/jcl/packages/d12/JclStackTraceViewerExpertDLL.dpr branches/jcl-stack-trace/jcl/packages/d12/JclStackTraceViewerExpertDLL.dproj branches/jcl-stack-trace/jcl/packages/d12/JclStackTraceViewerExpertDLL.rc branches/jcl-stack-trace/jcl/packages/xml/JclStackTraceViewerExpert-D.xml branches/jcl-stack-trace/jcl/packages/xml/JclStackTraceViewerExpertDLL-L.xml Modified: branches/jcl-stack-trace/jcl/TODO.txt =================================================================== --- branches/jcl-stack-trace/jcl/TODO.txt 2009-04-07 23:25:43 UTC (rev 2729) +++ branches/jcl-stack-trace/jcl/TODO.txt 2009-04-08 19:27:17 UTC (rev 2730) @@ -37,7 +37,8 @@ - add UNITVERSIONING * integrate it into the installation - - update jcl\packages - - update jcl\install\JclInstall.pas + - update jcl\packages\JclPackages*.* + - add all files to jcl\packages\xml\JclStackTraceViewerExpert*.xml + - generate packages for 5 - 11 * example Line number translator package \ No newline at end of file Modified: branches/jcl-stack-trace/jcl/install/JclInstall.pas =================================================================== --- branches/jcl-stack-trace/jcl/install/JclInstall.pas 2009-04-07 23:25:43 UTC (rev 2729) +++ branches/jcl-stack-trace/jcl/install/JclInstall.pas 2009-04-08 19:27:17 UTC (rev 2730) @@ -121,6 +121,7 @@ joJCLExpertUses, joJCLExpertSimdView, joJCLExpertVersionControl, + joJCLExpertStackTraceViewer, joJCLExceptDlg, joJCLExceptDlgVCL, joJCLExceptDlgVCLSnd, @@ -433,17 +434,18 @@ RsCaptionExceptDlgCLX = 'CLX Exception Dialog'; // experts - RsCaptionExperts = 'IDE experts'; - RsCaptionExpertsDsgnPackages = 'Design packages'; - RsCaptionExpertsDLL = 'DLL experts'; - RsCaptionExpertDebug = 'Debug Extension'; - RsCaptionExpertAnalyzer = 'Project Analyzer'; - RsCaptionExpertFavorite = 'Favorite combobox in Open/Save dialogs'; - RsCaptionExpertRepository = 'Exception dialog expert'; - RsCaptionExpertThreadNames = 'Displaying thread names in Thread Status window'; - RsCaptionExpertUses = 'Uses Wizard'; - RsCaptionExpertSimdView = 'Debug window for XMM registers'; - RsCaptionExpertVersionControl = 'Version control'; + RsCaptionExperts = 'IDE experts'; + RsCaptionExpertsDsgnPackages = 'Design packages'; + RsCaptionExpertsDLL = 'DLL experts'; + RsCaptionExpertDebug = 'Debug Extension'; + RsCaptionExpertAnalyzer = 'Project Analyzer'; + RsCaptionExpertFavorite = 'Favorite combobox in Open/Save dialogs'; + RsCaptionExpertRepository = 'Exception dialog expert'; + RsCaptionExpertThreadNames = 'Displaying thread names in Thread Status window'; + RsCaptionExpertUses = 'Uses Wizard'; + RsCaptionExpertSimdView = 'Debug window for XMM registers'; + RsCaptionExpertVersionControl = 'Version control'; + RsCaptionExpertStackTraceViewer = 'Stack Trace Viewer'; // help RsCaptionHelp = 'Help files'; @@ -555,17 +557,18 @@ RsHintExceptDlgCLX = 'Add CLX exception dialog (Windows only) to the Object Repository.'; // experts - RsHintExperts = 'Build and install selected IDE experts.'; - RsHintExpertsDsgnPackages = 'Design packages containing JCL experts'; - RsHintExpertsDLL = 'DLLs containing JCL experts'; - RsHintExpertDebug = 'Install IDE expert which assists to insert JCL Debug information into executable files.'; - RsHintExpertAnalyzer = 'Install IDE Project Analyzer.'; - RsHintExpertFavorite = 'Install "Favorites" combobox in IDE Open/Save dialogs.'; - RsHintExpertRepository = 'Repository expert to easily create exception dialogs'; - RsHintExpertThreadNames = 'Display thread names in Thread Status window IDE extension.'; - RsHintExpertUses = 'Install IDE Uses Wizard.'; - RsHintExpertSimdView = 'Install a debug window of XMM registers (used by SSE instructions)'; - RsHintExpertVersionControl = 'Integration of TortoiseCVS and TortoiseSVN in the IDE'; + RsHintExperts = 'Build and install selected IDE experts.'; + RsHintExpertsDsgnPackages = 'Design packages containing JCL experts'; + RsHintExpertsDLL = 'DLLs containing JCL experts'; + RsHintExpertDebug = 'Install IDE expert which assists to insert JCL Debug information into executable files.'; + RsHintExpertAnalyzer = 'Install IDE Project Analyzer.'; + RsHintExpertFavorite = 'Install "Favorites" combobox in IDE Open/Save dialogs.'; + RsHintExpertRepository = 'Repository expert to easily create exception dialogs'; + RsHintExpertThreadNames = 'Display thread names in Thread Status window IDE extension.'; + RsHintExpertUses = 'Install IDE Uses Wizard.'; + RsHintExpertSimdView = 'Install a debug window of XMM registers (used by SSE instructions)'; + RsHintExpertVersionControl = 'Integration of TortoiseCVS and TortoiseSVN in the IDE'; + RsHintExpertStackTraceViewer = 'Install an IDE expert which shows the JCL Debug stack trace information.'; // help RsHintHelp = 'Install JCL help files.'; @@ -680,6 +683,7 @@ (Id: -1; Caption: RsCaptionExpertUses; Hint: RsHintExpertUses), // joExpertUses (Id: -1; Caption: RsCaptionExpertSimdView; Hint: RsHintExpertSimdView), // joExpertSimdView (Id: -1; Caption: RsCaptionExpertVersionControl; Hint: RsHintExpertVersionControl), // joExpertVersionControl + (Id: -1; Caption: RsCaptionExpertStackTraceViewer; Hint: RsHintExpertStackTraceViewer), //joExpertStackTraceViewer (Id: -1; Caption: RsCaptionExceptDlg; Hint: RsHintExceptDlg), // joExceptDlg (Id: -1; Caption: RsCaptionExceptDlgVCL; Hint: RsHintExceptDlgVCL), // joExceptDlgVCL (Id: -1; Caption: RsCaptionExceptDlgVCLSnd; Hint: RsHintExceptDlgVCLSnd), // joExceptDlgVCLSnd @@ -711,21 +715,22 @@ JediJclDpk = 'Jedi.Jcl'; JediJclContainersDpk = 'Jedi.JclContainers'; - JclExpertBase = 'JclBaseExpert'; - JclExpertDebug = 'JclDebugExpert'; - JclExpertAnalyzer = 'JclProjectAnalysisExpert'; - JclExpertFavorite = 'JclFavoriteFoldersExpert'; - JclExpertRepository = 'JclRepositoryExpert'; - JclExpertThrNames = 'JclThreadNameExpert'; - JclExpertUses = 'JclUsesExpert'; - JclExpertSimdView = 'JclSIMDViewExpert'; - JclExpertVersionControl = 'JclVersionControlExpert'; + JclExpertBase = 'JclBaseExpert'; + JclExpertDebug = 'JclDebugExpert'; + JclExpertAnalyzer = 'JclProjectAnalysisExpert'; + JclExpertFavorite = 'JclFavoriteFoldersExpert'; + JclExpertRepository = 'JclRepositoryExpert'; + JclExpertThrNames = 'JclThreadNameExpert'; + JclExpertUses = 'JclUsesExpert'; + JclExpertSimdView = 'JclSIMDViewExpert'; + JclExpertVersionControl = 'JclVersionControlExpert'; + JclExpertStackTraceViewer = 'JclStackTraceViewerExpert'; - SupportedExperts: array [joJCLExperts..joJCLExpertVersionControl] of string = + SupportedExperts: array [joJCLExperts..joJCLExpertStackTraceViewer] of string = ( JclExpertBase, '', '', JclExpertDebug, JclExpertAnalyzer, JclExpertFavorite, JclExpertRepository, JclExpertThrNames, - JclExpertUses, JclExpertSimdView, JclExpertVersionControl + JclExpertUses, JclExpertSimdView, JclExpertVersionControl, JclExpertStackTraceViewer ); OldExperts: array [0..6] of string = @@ -1280,6 +1285,7 @@ AddOption(joJCLExpertUses, ExpertOptions, joJCLExperts); AddOption(joJCLExpertSimdView, ExpertOptions, joJCLExperts); AddOption(joJCLExpertRepository, ExpertOptions, joJCLExperts); + AddOption(joJCLExpertStackTraceViewer, ExpertOptions, joJCLExperts); end; AddOption(joJCLExpertFavorite, ExpertOptions, joJCLExperts); AddOption(joJCLExpertVersionControl, [goNoAutoCheck], joJCLExperts); Added: branches/jcl-stack-trace/jcl/packages/d12/JclStackTraceViewerExpert.dpk =================================================================== --- branches/jcl-stack-trace/jcl/packages/d12/JclStackTraceViewerExpert.dpk (rev 0) +++ branches/jcl-stack-trace/jcl/packages/d12/JclStackTraceViewerExpert.dpk 2009-04-08 19:27:17 UTC (rev 2730) @@ -0,0 +1,53 @@ +package JclStackTraceViewerExpert; +{ +----------------------------------------------------------------------------- + DO NOT EDIT THIS FILE, IT IS GENERATED BY THE PACKAGE GENERATOR + ALWAYS EDIT THE RELATED XML FILE (JclStackTraceViewerExpert-D.xml) + + Last generated: 08-04-2009 19:06:47 UTC +----------------------------------------------------------------------------- +} + +{$R *.res} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO OFF} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS OFF} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO OFF} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $58120000} +{$DESCRIPTION 'JCL Stack Trace Viewer'} +{$LIBSUFFIX '120'} +{$DESIGNONLY} +{$IMPLICITBUILD OFF} + +{$DEFINE BCB} +{$DEFINE RELEASE} + +requires + rtl, + vcl, + designide, + Jcl, + JclBaseExpert + ; + +contains + StackTraceViewerImpl in '..\..\experts\stackviewer\StackTraceViewerImpl.pas' + ; + +end. Added: branches/jcl-stack-trace/jcl/packages/d12/JclStackTraceViewerExpert.dproj =================================================================== --- branches/jcl-stack-trace/jcl/packages/d12/JclStackTraceViewerExpert.dproj (rev 0) +++ branches/jcl-stack-trace/jcl/packages/d12/JclStackTraceViewerExpert.dproj 2009-04-08 19:27:17 UTC (rev 2730) @@ -0,0 +1,143 @@ + <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <PropertyGroup> + <ProjectGuid>{85153A85-6CA4-4CD5-92E6-C39A5C5161E2}</ProjectGuid> + <MainSource>JclStackTraceViewerExpert.dpk</MainSource> + <ProjectVersion>12</ProjectVersion> + <ProjectVersion>11.1</ProjectVersion> + <Config Condition="'$(Config)'==''">Release</Config> + <DCC_DCCCompiler>DCC32</DCC_DCCCompiler> + <DCC_Define>BCB;RELEASE</DCC_Define> + </PropertyGroup> + <PropertyGroup Condition="'$(Config)'=='Base' or '$(Base)'!=''"> + <Base>true</Base> + </PropertyGroup> + <PropertyGroup Condition="'$(Config)'=='Release' or '$(Cfg_Release)'!=''"> + <Cfg_Release>true</Cfg_Release> + <CfgParent>Base</CfgParent> + <Base>true</Base> + </PropertyGroup> + <PropertyGroup Condition="'$(Config)'=='Debug' or '$(Cfg_Debug)'!=''"> + <Cfg_Debug>true</Cfg_Debug> + <CfgParent>Base</CfgParent> + <Base>true</Base> + </PropertyGroup> + <PropertyGroup Condition="'$(Base)'!=''"> + <DCC_WriteableConstants>true</DCC_WriteableConstants> + <DCC_OutputNeverBuildDcps>true</DCC_OutputNeverBuildDcps> + <DllSuffix>120</DllSuffix> + <GenDll>true</GenDll> + <GenPackage>true</GenPackage> + <DCC_ImageBase>$58120000</DCC_ImageBase> + <DCC_UsePackage>rtl;vcl;designide;Jcl;JclBaseExpert</DCC_UsePackage> + </PropertyGroup> + <PropertyGroup Condition="'$(Cfg_Release)'!=''"> + <DCC_AssertionsAtRuntime>false</DCC_AssertionsAtRuntime> + <DCC_DebugInformation>False</DCC_DebugInformation> + <DCC_LocalDebugSymbols>False</DCC_LocalDebugSymbols> + <DCC_SymbolReferenceInfo>0</DCC_SymbolReferenceInfo> + <DCC_DcuOutput>..\..\lib\d12</DCC_DcuOutput> + <DCC_ObjOutput>..\..\lib\d12</DCC_ObjOutput> + <DCC_HppOutput>..\..\lib\d12</DCC_HppOutput> + <DCC_DcpOutput>..\..\lib\d12</DCC_DcpOutput> + <DCC_UnitSearchPath>..\..\lib\d12;..\..\source\include</DCC_UnitSearchPath> + <DCC_ResourcePath>..\..\lib\d12;..\..\source\include</DCC_ResourcePath> + <DCC_ObjPath>..\..\lib\d12;..\..\source\include</DCC_ObjPath> + <DCC_IncludePath>..\..\lib\d12;..\..\source\include</DCC_IncludePath> + </PropertyGroup> + <PropertyGroup Condition="'$(Cfg_Debug)'!=''"> + <DCC_DebugInformation>True</DCC_DebugInformation> + <DCC_LocalDebugSymbols>True</DCC_LocalDebugSymbols> + <DCC_SymbolReferenceInfo>1</DCC_SymbolReferenceInfo> + <DCC_DcuOutput>..\..\lib\d12\debug</DCC_DcuOutput> + <DCC_ObjOutput>..\..\lib\d12\debug</DCC_ObjOutput> + <DCC_HppOutput>..\..\lib\d12\debug</DCC_HppOutput> + <DCC_DcpOutput>..\..\lib\d12\debug</DCC_DcpOutput> + <DCC_UnitSearchPath>..\..\lib\d12\debug;..\..\source\include</DCC_UnitSearchPath> + <DCC_ResourcePath>..\..\lib\d12\debug;..\..\source\include</DCC_ResourcePath> + <DCC_ObjPath>..\..\lib\d12\debug;..\..\source\include</DCC_ObjPath> + <DCC_IncludePath>..\..\lib\d12\debug;..\..\source\include</DCC_IncludePath> + </PropertyGroup> + <ItemGroup> + <DelphiCompile Include="JclStackTraceViewerExpert.dpk"> + <MainSource>MainSource</MainSource> + </DelphiCompile> + <DCCReference Include="rtl.dcp" /> + <DCCReference Include="vcl.dcp" /> + <DCCReference Include="designide.dcp" /> + <DCCReference Include="Jcl.dcp" /> + <DCCReference Include="JclBaseExpert.dcp" /> + <DCCReference Include="..\..\experts\stackviewer\StackTraceViewerImpl.pas" /> + <BuildConfiguration Include="Base"> + <Key>Base</Key> + </BuildConfiguration> + <BuildConfiguration Include="Release"> + <Key>Cfg_Release</Key> + <CfgParent>Base</CfgParent> + </BuildConfiguration> + <BuildConfiguration Include="Debug"> + <Key>Cfg_Debug</Key> + <CfgParent>Base</CfgParent> + </BuildConfiguration> + </ItemGroup> + <Import Project="$(BDS)\Bin\CodeGear.Delphi.Targets" Condition="Exists('$(BDS)\Bin\CodeGear.Delphi.Targets')"/> + <ProjectExtensions> + <Borland.Personality>Delphi.Personality</Borland.Personality> + <Borland.ProjectType>Package</Borland.ProjectType> + <Borland.PersonalityVersion>1.0</Borland.PersonalityVersion> + <BorlandProject> + <BorlandProject> + <Delphi.Personality> + <Parameters> + <Parameters Name="UseLauncher">False</Parameters> + <Parameters Name="LoadAllSymbols">True</Parameters> + <Parameters Name="LoadUnspecifiedSymbols">False</Parameters> + </Parameters> + <VersionInfo> + <VersionInfo Name="IncludeVerInfo">True</VersionInfo> + <VersionInfo Name="AutoIncBuild">False</VersionInfo> + <VersionInfo Name="MajorVer">1</VersionInfo> + <VersionInfo Name="MinorVer">105</VersionInfo> + <VersionInfo Name="Release">0</VersionInfo> + <VersionInfo Name="Build">3249</VersionInfo> + <VersionInfo Name="Debug">False</VersionInfo> + <VersionInfo Name="PreRelease">False</VersionInfo> + <VersionInfo Name="Special">False</VersionInfo> + <VersionInfo Name="Private">False</VersionInfo> + <VersionInfo Name="DLL">False</VersionInfo> + <VersionInfo Name="Locale">1031</VersionInfo> + <VersionInfo Name="CodePage">1252</VersionInfo> + </VersionInfo> + <VersionInfoKeys> + <VersionInfoKeys Name="CompanyName">Project JEDI</VersionInfoKeys> + <VersionInfoKeys Name="FileDescription">JEDI Code Library RTL package</VersionInfoKeys> + <VersionInfoKeys Name="FileVersion">1.102.0.2726</VersionInfoKeys> + <VersionInfoKeys Name="InternalName">Jcl</VersionInfoKeys> + <VersionInfoKeys Name="LegalCopyright">Copyright (C) 1999, 2008 Project JEDI</VersionInfoKeys> + <VersionInfoKeys Name="LegalTrademarks"></VersionInfoKeys> + <VersionInfoKeys Name="OriginalFilename">Jcl110.bpl</VersionInfoKeys> + <VersionInfoKeys Name="ProductName">JEDI Code Library</VersionInfoKeys> + <VersionInfoKeys Name="ProductVersion">1.102 Build 2726</VersionInfoKeys> + </VersionInfoKeys> + <Source> + <Source Name="MainSource">Jcl.dpk</Source> + </Source> + <VersionInfoKeys> + <VersionInfoKeys Name="CompanyName">Project JEDI</VersionInfoKeys> + <VersionInfoKeys Name="FileDescription">JCL Stack Trace Viewer</VersionInfoKeys> + <VersionInfoKeys Name="FileVersion">1.105.0.3249</VersionInfoKeys> + <VersionInfoKeys Name="InternalName">JclStackTraceViewerExpert</VersionInfoKeys> + <VersionInfoKeys Name="LegalCopyright">Copyright (C) 1999, 2008 Project JEDI</VersionInfoKeys> + <VersionInfoKeys Name="LegalTrademarks"></VersionInfoKeys> + <VersionInfoKeys Name="OriginalFilename">JclStackTraceViewerExpert120.bpl</VersionInfoKeys> + <VersionInfoKeys Name="ProductName">JEDI Code Library</VersionInfoKeys> + <VersionInfoKeys Name="ProductVersion">1.105 Build 3249</VersionInfoKeys> + </VersionInfoKeys> + <Source> + <Source Name="MainSource">JclStackTraceViewerExpert.dpk</Source> + </Source> + <Excluded_Packages/> + </Delphi.Personality> + </BorlandProject> + </BorlandProject> + </ProjectExtensions> + </Project> Added: branches/jcl-stack-trace/jcl/packages/d12/JclStackTraceViewerExpert.rc =================================================================== --- branches/jcl-stack-trace/jcl/packages/d12/JclStackTraceViewerExpert.rc (rev 0) +++ branches/jcl-stack-trace/jcl/packages/d12/JclStackTraceViewerExpert.rc 2009-04-08 19:27:17 UTC (rev 2730) @@ -0,0 +1,32 @@ +VS_VERSION_INFO VERSIONINFO +FILEVERSION 1,105,0,3249 +PRODUCTVERSION 1,105,0,3249 + FILEFLAGSMASK VS_FFI_FILEFLAGSMASK +#ifdef _DEBUG + FILEFLAGS VS_FF_DEBUG +#else + FILEFLAGS 0x0L +#endif + FILEOS VOS__WINDOWS32 + FILETYPE VFT_DLL + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904E4" + BEGIN + VALUE "CompanyName", "Project JEDI\0" + VALUE "FileDescription", "JCL Stack Trace Viewer\0" + VALUE "FileVersion", "1.105.0.3249\0" + VALUE "InternalName", "JclStackTraceViewerExpert\0" + VALUE "LegalCopyright", "Copyright (C) 1999, 2008 Project JEDI\0" + VALUE "OriginalFilename", "JclStackTraceViewerExpert120.bpl\0" + VALUE "ProductName", "JEDI Code Library\0" + VALUE "ProductVersion", "1.105 Build 3249\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0409, 1252 + END +END Added: branches/jcl-stack-trace/jcl/packages/d12/JclStackTraceViewerExpertDLL.dpr =================================================================== --- branches/jcl-stack-trace/jcl/packages/d12/JclStackTraceViewerExpertDLL.dpr (rev 0) +++ branches/jcl-stack-trace/jcl/packages/d12/JclStackTraceViewerExpertDLL.dpr 2009-04-08 19:27:17 UTC (rev 2730) @@ -0,0 +1,48 @@ +Library JclStackTraceViewerExpertDLL; +{ +----------------------------------------------------------------------------- + DO NOT EDIT THIS FILE, IT IS GENERATED BY THE PACKAGE GENERATOR + ALWAYS EDIT THE RELATED XML FILE (JclStackTraceViewerExpertDLL-L.xml) + + Last generated: 08-04-2009 19:06:47 UTC +----------------------------------------------------------------------------- +} + +{$R *.res} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO OFF} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS OFF} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO OFF} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $58120000} +{$DESCRIPTION 'JCL Stack Trace Viewer'} +{$LIBSUFFIX '120'} +{$IMPLICITBUILD OFF} + +{$DEFINE BCB} +{$DEFINE RELEASE} + +uses + ToolsAPI, + StackTraceViewerImpl in '..\..\experts\stackviewer\StackTraceViewerImpl.pas' + ; + +exports + JCLWizardInit name WizardEntryPoint; + +end. Added: branches/jcl-stack-trace/jcl/packages/d12/JclStackTraceViewerExpertDLL.dproj =================================================================== --- branches/jcl-stack-trace/jcl/packages/d12/JclStackTraceViewerExpertDLL.dproj (rev 0) +++ branches/jcl-stack-trace/jcl/packages/d12/JclStackTraceViewerExpertDLL.dproj 2009-04-08 19:27:17 UTC (rev 2730) @@ -0,0 +1,143 @@ + <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <PropertyGroup> + <ProjectGuid>{851E8773-ADE0-479D-94F9-FE3AAB64A847}</ProjectGuid> + <MainSource>JclStackTraceViewerExpertDLL.dpr</MainSource> + <ProjectVersion>12</ProjectVersion> + <ProjectVersion>11.1</ProjectVersion> + <Config Condition="'$(Config)'==''">Release</Config> + <DCC_DCCCompiler>DCC32</DCC_DCCCompiler> + <DCC_Define>BCB;RELEASE</DCC_Define> + </PropertyGroup> + <PropertyGroup Condition="'$(Config)'=='Base' or '$(Base)'!=''"> + <Base>true</Base> + </PropertyGroup> + <PropertyGroup Condition="'$(Config)'=='Release' or '$(Cfg_Release)'!=''"> + <Cfg_Release>true</Cfg_Release> + <CfgParent>Base</CfgParent> + <Base>true</Base> + </PropertyGroup> + <PropertyGroup Condition="'$(Config)'=='Debug' or '$(Cfg_Debug)'!=''"> + <Cfg_Debug>true</Cfg_Debug> + <CfgParent>Base</CfgParent> + <Base>true</Base> + </PropertyGroup> + <PropertyGroup Condition="'$(Base)'!=''"> + <DCC_WriteableConstants>true</DCC_WriteableConstants> + <DCC_OutputNeverBuildDcps>true</DCC_OutputNeverBuildDcps> + <DllSuffix>120</DllSuffix> + <GenDll>true</GenDll> + <GenPackage>true</GenPackage> + <DCC_ImageBase>$58120000</DCC_ImageBase> + <DCC_UsePackage>rtl;vcl;designide;Jcl;JclBaseExpert</DCC_UsePackage> + </PropertyGroup> + <PropertyGroup Condition="'$(Cfg_Release)'!=''"> + <DCC_AssertionsAtRuntime>false</DCC_AssertionsAtRuntime> + <DCC_DebugInformation>False</DCC_DebugInformation> + <DCC_LocalDebugSymbols>False</DCC_LocalDebugSymbols> + <DCC_SymbolReferenceInfo>0</DCC_SymbolReferenceInfo> + <DCC_DcuOutput>..\..\lib\d12</DCC_DcuOutput> + <DCC_ObjOutput>..\..\lib\d12</DCC_ObjOutput> + <DCC_HppOutput>..\..\lib\d12</DCC_HppOutput> + <DCC_DcpOutput>..\..\lib\d12</DCC_DcpOutput> + <DCC_UnitSearchPath>..\..\lib\d12;..\..\source\include</DCC_UnitSearchPath> + <DCC_ResourcePath>..\..\lib\d12;..\..\source\include</DCC_ResourcePath> + <DCC_ObjPath>..\..\lib\d12;..\..\source\include</DCC_ObjPath> + <DCC_IncludePath>..\..\lib\d12;..\..\source\include</DCC_IncludePath> + </PropertyGroup> + <PropertyGroup Condition="'$(Cfg_Debug)'!=''"> + <DCC_DebugInformation>True</DCC_DebugInformation> + <DCC_LocalDebugSymbols>True</DCC_LocalDebugSymbols> + <DCC_SymbolReferenceInfo>1</DCC_SymbolReferenceInfo> + <DCC_DcuOutput>..\..\lib\d12\debug</DCC_DcuOutput> + <DCC_ObjOutput>..\..\lib\d12\debug</DCC_ObjOutput> + <DCC_HppOutput>..\..\lib\d12\debug</DCC_HppOutput> + <DCC_DcpOutput>..\..\lib\d12\debug</DCC_DcpOutput> + <DCC_UnitSearchPath>..\..\lib\d12\debug;..\..\source\include</DCC_UnitSearchPath> + <DCC_ResourcePath>..\..\lib\d12\debug;..\..\source\include</DCC_ResourcePath> + <DCC_ObjPath>..\..\lib\d12\debug;..\..\source\include</DCC_ObjPath> + <DCC_IncludePath>..\..\lib\d12\debug;..\..\source\include</DCC_IncludePath> + </PropertyGroup> + <ItemGroup> + <DelphiCompile Include="JclStackTraceViewerExpertDLL.dpr"> + <MainSource>MainSource</MainSource> + </DelphiCompile> + <DCCReference Include="rtl.dcp" /> + <DCCReference Include="vcl.dcp" /> + <DCCReference Include="designide.dcp" /> + <DCCReference Include="Jcl.dcp" /> + <DCCReference Include="JclBaseExpert.dcp" /> + <DCCReference Include="..\..\experts\stackviewer\StackTraceViewerImpl.pas" /> + <BuildConfiguration Include="Base"> + <Key>Base</Key> + </BuildConfiguration> + <BuildConfiguration Include="Release"> + <Key>Cfg_Release</Key> + <CfgParent>Base</CfgParent> + </BuildConfiguration> + <BuildConfiguration Include="Debug"> + <Key>Cfg_Debug</Key> + <CfgParent>Base</CfgParent> + </BuildConfiguration> + </ItemGroup> + <Import Project="$(BDS)\Bin\CodeGear.Delphi.Targets" Condition="Exists('$(BDS)\Bin\CodeGear.Delphi.Targets')"/> + <ProjectExtensions> + <Borland.Personality>Delphi.Personality</Borland.Personality> + <Borland.ProjectType>Package</Borland.ProjectType> + <Borland.PersonalityVersion>1.0</Borland.PersonalityVersion> + <BorlandProject> + <BorlandProject> + <Delphi.Personality> + <Parameters> + <Parameters Name="UseLauncher">False</Parameters> + <Parameters Name="LoadAllSymbols">True</Parameters> + <Parameters Name="LoadUnspecifiedSymbols">False</Parameters> + </Parameters> + <VersionInfo> + <VersionInfo Name="IncludeVerInfo">True</VersionInfo> + <VersionInfo Name="AutoIncBuild">False</VersionInfo> + <VersionInfo Name="MajorVer">1</VersionInfo> + <VersionInfo Name="MinorVer">105</VersionInfo> + <VersionInfo Name="Release">0</VersionInfo> + <VersionInfo Name="Build">3249</VersionInfo> + <VersionInfo Name="Debug">False</VersionInfo> + <VersionInfo Name="PreRelease">False</VersionInfo> + <VersionInfo Name="Special">False</VersionInfo> + <VersionInfo Name="Private">False</VersionInfo> + <VersionInfo Name="DLL">False</VersionInfo> + <VersionInfo Name="Locale">1031</VersionInfo> + <VersionInfo Name="CodePage">1252</VersionInfo> + </VersionInfo> + <VersionInfoKeys> + <VersionInfoKeys Name="CompanyName">Project JEDI</VersionInfoKeys> + <VersionInfoKeys Name="FileDescription">JEDI Code Library RTL package</VersionInfoKeys> + <VersionInfoKeys Name="FileVersion">1.102.0.2726</VersionInfoKeys> + <VersionInfoKeys Name="InternalName">Jcl</VersionInfoKeys> + <VersionInfoKeys Name="LegalCopyright">Copyright (C) 1999, 2008 Project JEDI</VersionInfoKeys> + <VersionInfoKeys Name="LegalTrademarks"></VersionInfoKeys> + <VersionInfoKeys Name="OriginalFilename">Jcl110.bpl</VersionInfoKeys> + <VersionInfoKeys Name="ProductName">JEDI Code Library</VersionInfoKeys> + <VersionInfoKeys Name="ProductVersion">1.102 Build 2726</VersionInfoKeys> + </VersionInfoKeys> + <Source> + <Source Name="MainSource">Jcl.dpk</Source> + </Source> + <VersionInfoKeys> + <VersionInfoKeys Name="CompanyName">Project JEDI</VersionInfoKeys> + <VersionInfoKeys Name="FileDescription">JCL Stack Trace Viewer</VersionInfoKeys> + <VersionInfoKeys Name="FileVersion">1.105.0.3249</VersionInfoKeys> + <VersionInfoKeys Name="InternalName">JclStackTraceViewerExpertDLL</VersionInfoKeys> + <VersionInfoKeys Name="LegalCopyright">Copyright (C) 1999, 2008 Project JEDI</VersionInfoKeys> + <VersionInfoKeys Name="LegalTrademarks"></VersionInfoKeys> + <VersionInfoKeys Name="OriginalFilename">JclStackTraceViewerExpertDLL120.dll</VersionInfoKeys> + <VersionInfoKeys Name="ProductName">JEDI Code Library</VersionInfoKeys> + <VersionInfoKeys Name="ProductVersion">1.105 Build 3249</VersionInfoKeys> + </VersionInfoKeys> + <Source> + <Source Name="MainSource">JclStackTraceViewerExpertDLL.dpr</Source> + </Source> + <Excluded_Packages/> + </Delphi.Personality> + </BorlandProject> + </BorlandProject> + </ProjectExtensions> + </Project> Added: branches/jcl-stack-trace/jcl/packages/d12/JclStackTraceViewerExpertDLL.rc =================================================================== --- branches/jcl-stack-trace/jcl/packages/d12/JclStackTraceViewerExpertDLL.rc (rev 0) +++ branches/jcl-stack-trace/jcl/packages/d12/JclStackTraceViewerExpertDLL.rc 2009-04-08 19:27:17 UTC (rev 2730) @@ -0,0 +1,32 @@ +VS_VERSION_INFO VERSIONINFO +FILEVERSION 1,105,0,3249 +PRODUCTVERSION 1,105,0,3249 + FILEFLAGSMASK VS_FFI_FILEFLAGSMASK +#ifdef _DEBUG + FILEFLAGS VS_FF_DEBUG +#else + FILEFLAGS 0x0L +#endif + FILEOS VOS__WINDOWS32 + FILETYPE VFT_DLL + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904E4" + BEGIN + VALUE "CompanyName", "Project JEDI\0" + VALUE "FileDescription", "JCL Stack Trace Viewer\0" + VALUE "FileVersion", "1.105.0.3249\0" + VALUE "InternalName", "JclStackTraceViewerExpertDLL\0" + VALUE "LegalCopyright", "Copyright (C) 1999, 2008 Project JEDI\0" + VALUE "OriginalFilename", "JclStackTraceViewerExpertDLL120.dll\0" + VALUE "ProductName", "JEDI Code Library\0" + VALUE "ProductVersion", "1.105 Build 3249\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0409, 1252 + END +END Added: branches/jcl-stack-trace/jcl/packages/xml/JclStackTraceViewerExpert-D.xml =================================================================== --- branches/jcl-stack-trace/jcl/packages/xml/JclStackTraceViewerExpert-D.xml (rev 0) +++ branches/jcl-stack-trace/jcl/packages/xml/JclStackTraceViewerExpert-D.xml 2009-04-08 19:27:17 UTC (rev 2730) @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="iso-8859-1"?> +<Package Name="JclStackTraceViewerExpert" Design="-1"> + <Description>JCL Stack Trace Viewer</Description> + <GUID>{85153A85-6CA4-4CD5-92E6-C39A5C5161E2}</GUID> + <C5PFlags>-LUvcl50 -LUdsnide50 -LUJclC50 -LUJclBaseExpertC50</C5PFlags> + <C6PFlags>-LUdesignide</C6PFlags> + <C5Libs/> + <C6Libs/> + <CompilerDefines>RELEASE</CompilerDefines> + <ImageBase>58120000</ImageBase> + <Requires> + <Package Name="rtl" Targets="WinLibSuffix" Condition=""/> + <Package Name="vcl50" Targets="noLibSuffix" Condition=""/> + <Package Name="vcl" Targets="WinLibSuffix" Condition=""/> + <Package Name="dsnide50" Targets="noLibSuffix" Condition=""/> + <Package Name="designide" Targets="WinLibSuffix" Condition=""/> + <Package Name="Jcl-R" Targets="Windows" Condition=""/> + <Package Name="JclBaseExpert-D" Targets="Windows" Condition=""/> + </Requires> + <Contains> + <File Name="..\..\experts\stackviewer\StackTraceViewerImpl.pas" Targets="Windows" Formname="" Condition=""/> + </Contains> +</Package> Added: branches/jcl-stack-trace/jcl/packages/xml/JclStackTraceViewerExpertDLL-L.xml =================================================================== --- branches/jcl-stack-trace/jcl/packages/xml/JclStackTraceViewerExpertDLL-L.xml (rev 0) +++ branches/jcl-stack-trace/jcl/packages/xml/JclStackTraceViewerExpertDLL-L.xml 2009-04-08 19:27:17 UTC (rev 2730) @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="iso-8859-1"?> +<Package Name="JclStackTraceViewerDLL" Type="L"> + <Description>JCL Stack Trace Viewer</Description> + <GUID>{851E8773-ADE0-479D-94F9-FE3AAB64A847}</GUID> + <C5PFlags>-LUvcl50 -LUdsnide50 -LUJclC50 -LUJclBaseExpertC50</C5PFlags> + <C6PFlags>-LUdesignide</C6PFlags> + <C5Libs/> + <C6Libs/> + <CompilerDefines>RELEASE</CompilerDefines> + <ImageBase>58120000</ImageBase> + <Requires> + <Package Name="rtl" Targets="WinLibSuffix" Condition=""/> + <Package Name="vcl50" Targets="noLibSuffix" Condition=""/> + <Package Name="vcl" Targets="WinLibSuffix" Condition=""/> + <Package Name="dsnide50" Targets="noLibSuffix" Condition=""/> + <Package Name="designide" Targets="WinLibSuffix" Condition=""/> + <Package Name="Jcl-R" Targets="Windows" Condition=""/> + <Package Name="JclBaseExpert-D" Targets="Windows" Condition=""/> + </Requires> + <Contains> + <File Name="..\..\experts\stackviewer\StackTraceViewerImpl.pas" Targets="Windows" Formname="" Condition=""/> + </Contains> +</Package> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <usc...@us...> - 2009-04-07 23:25:44
|
Revision: 2729 http://jcl.svn.sourceforge.net/jcl/?rev=2729&view=rev Author: uschuster Date: 2009-04-07 23:25:43 +0000 (Tue, 07 Apr 2009) Log Message: ----------- splitted StackLineNumberTranslator.pas into API and internal stuff Modified Paths: -------------- branches/jcl-stack-trace/jcl/TODO.txt branches/jcl-stack-trace/jcl/experts/stackviewer/JclStackTraceViewerAPI.pas branches/jcl-stack-trace/jcl/experts/stackviewer/StackLineNumberTranslator.pas Modified: branches/jcl-stack-trace/jcl/TODO.txt =================================================================== --- branches/jcl-stack-trace/jcl/TODO.txt 2009-04-07 22:47:29 UTC (rev 2728) +++ branches/jcl-stack-trace/jcl/TODO.txt 2009-04-07 23:25:43 UTC (rev 2729) @@ -31,7 +31,6 @@ * clean up/minor things - add and test desktop state stuff in DLL expert mode - - split StackLineNumberTranslator.pas into API and internal stuff - use updated TJclFileEnumerator instead of TFileSearcher - rename some files - add MPL headers Modified: branches/jcl-stack-trace/jcl/experts/stackviewer/JclStackTraceViewerAPI.pas =================================================================== --- branches/jcl-stack-trace/jcl/experts/stackviewer/JclStackTraceViewerAPI.pas 2009-04-07 22:47:29 UTC (rev 2728) +++ branches/jcl-stack-trace/jcl/experts/stackviewer/JclStackTraceViewerAPI.pas 2009-04-07 23:25:43 UTC (rev 2729) @@ -1,4 +1,4 @@ -unit StackLineNumberTranslator; +unit JclStackTraceViewerAPI; interface @@ -27,224 +27,38 @@ property IDString: string read GetIDString; end; - TJclLineNumberTranslators = class(TObject) - private - FIndexList: TList; - FNextIndex: Integer; - FTranslators: TInterfaceList; - function GetCount: Integer; - function GetItems(AIndex: Integer): IJclLineNumberTranslator; - public - constructor Create; - destructor Destroy; override; - function RegisterTranslator(const ATranslator: IJclLineNumberTranslator): Integer; - function TranslateLineNumbers(ARevisionContent, ACurrentContent: IStream; - ARevisionLineNumbers: TList; ACurrentLineNumbers: TList): Integer; - procedure UnregisterTranslator(AIndex: Integer); - property Count: Integer read GetCount; - property Items[AIndex: Integer]: IJclLineNumberTranslator read GetItems; default; - end; - - TJclRevisionProviders = class(TObject) - private - FIndexList: TList; - FNextIndex: Integer; - FTranslators: TInterfaceList; - function GetCount: Integer; - function GetItems(AIndex: Integer): IJclRevisionProvider; - public - constructor Create; - destructor Destroy; override; - function RegisterProvider(const ATranslator: IJclRevisionProvider): Integer; - function GetRevisionContent(const AFileName, ARevision: string; AContent: IStream): Boolean; - procedure UnregisterProvider(AIndex: Integer); - property Count: Integer read GetCount; - property Items[AIndex: Integer]: IJclRevisionProvider read GetItems; default; - end; - var - LineNumberTranslators: TJclLineNumberTranslators; - RevisionProviders: TJclRevisionProviders; + RegisterLineNumberTranslatorProc: function(const ATranslator: IJclLineNumberTranslator): Integer = nil; + UnregisterLineNumberTranslatorProc: procedure(AIndex: Integer) = nil; + RegisterRevisionProviderProc: function(const ATranslator: IJclRevisionProvider): Integer = nil; + UnregisterRevisionProviderProc: procedure(AIndex: Integer) = nil; -function TranslateLineNumbers(ARevisionContent, ACurrentContent: IStream; ARevisionLineNumbers: TList; ACurrentLineNumbers: TList): Integer; - function RegisterLineNumberTranslator(const ATranslator: IJclLineNumberTranslator): Integer; procedure UnregisterLineNumberTranslator(AIndex: Integer); -function GetRevisionContent(const AFileName, ARevision: string; AContent: IStream): Boolean; - function RegisterRevisionProvider(const ATranslator: IJclRevisionProvider): Integer; procedure UnregisterRevisionProvider(AIndex: Integer); implementation -{ TJclLineNumberTranslators } - -constructor TJclLineNumberTranslators.Create; -begin - inherited Create; - FNextIndex := 1; - FIndexList := TList.Create; - FTranslators := TInterfaceList.Create; -end; - -destructor TJclLineNumberTranslators.Destroy; -begin - FTranslators.Free; - FIndexList.Free; - inherited Destroy; -end; - -function TJclLineNumberTranslators.GetCount: Integer; -begin - Result := FTranslators.Count; -end; - -function TJclLineNumberTranslators.GetItems(AIndex: Integer): IJclLineNumberTranslator; -begin - Result := IJclLineNumberTranslator(FTranslators[AIndex]); -end; - -function TJclLineNumberTranslators.RegisterTranslator(const ATranslator: IJclLineNumberTranslator): Integer; -begin - if Assigned(ATranslator) then - begin - Result := FNextIndex; - Inc(FNextIndex); - FTranslators.Add(ATranslator); - FIndexList.Add(Pointer(Result)); - end - else - Result := -1; -end; - -function TJclLineNumberTranslators.TranslateLineNumbers(ARevisionContent, ACurrentContent: IStream; - ARevisionLineNumbers: TList; ACurrentLineNumbers: TList): Integer; -var - I: Integer; -begin - Result := 0; - for I := 0 to Count - 1 do - begin - Result := Items[I].TranslateLineNumbers(ARevisionContent, ACurrentContent, ARevisionLineNumbers, ACurrentLineNumbers); - if Result > 0 then - Break; - end; -end; - -procedure TJclLineNumberTranslators.UnregisterTranslator(AIndex: Integer); -var - Idx: Integer; -begin - Idx := FIndexList.IndexOf(Pointer(AIndex)); - if Idx <> -1 then - begin - FTranslators.Delete(Idx); - FIndexList.Delete(Idx); - end; -end; - -{ TJclRevisionProviders } - -constructor TJclRevisionProviders.Create; -begin - inherited Create; - FNextIndex := 1; - FIndexList := TList.Create; - FTranslators := TInterfaceList.Create; -end; - -destructor TJclRevisionProviders.Destroy; -begin - FTranslators.Free; - FIndexList.Free; - inherited Destroy; -end; - -function TJclRevisionProviders.GetCount: Integer; -begin - Result := FTranslators.Count; -end; - -function TJclRevisionProviders.GetItems(AIndex: Integer): IJclRevisionProvider; -begin - Result := IJclRevisionProvider(FTranslators[AIndex]); -end; - -function TJclRevisionProviders.RegisterProvider(const ATranslator: IJclRevisionProvider): Integer; -begin - if Assigned(ATranslator) then - begin - Result := FNextIndex; - Inc(FNextIndex); - FTranslators.Add(ATranslator); - FIndexList.Add(Pointer(Result)); - end - else - Result := -1; -end; - -function TJclRevisionProviders.GetRevisionContent(const AFileName, ARevision: string; AContent: IStream): Boolean; -var - I: Integer; -begin - Result := False; - for I := 0 to Count - 1 do - if Items[I].GetRevisionContent(AFileName, ARevision, AContent) then - begin - Result := True; - Break; - end; -end; - -procedure TJclRevisionProviders.UnregisterProvider(AIndex: Integer); -var - Idx: Integer; -begin - Idx := FIndexList.IndexOf(Pointer(AIndex)); - if Idx <> -1 then - begin - FTranslators.Delete(Idx); - FIndexList.Delete(Idx); - end; -end; - function RegisterLineNumberTranslator(const ATranslator: IJclLineNumberTranslator): Integer; begin - Result := LineNumberTranslators.RegisterTranslator(ATranslator); + Result := RegisterLineNumberTranslatorProc(ATranslator); end; -function TranslateLineNumbers(ARevisionContent, ACurrentContent: IStream; ARevisionLineNumbers: TList; ACurrentLineNumbers: TList): Integer; -begin - Result := LineNumberTranslators.TranslateLineNumbers(ARevisionContent, ACurrentContent, ARevisionLineNumbers, ACurrentLineNumbers); -end; - procedure UnregisterLineNumberTranslator(AIndex: Integer); begin - LineNumberTranslators.UnregisterTranslator(AIndex); + UnregisterLineNumberTranslatorProc(AIndex); end; -function GetRevisionContent(const AFileName, ARevision: string; AContent: IStream): Boolean; -begin - Result := RevisionProviders.GetRevisionContent(AFileName, ARevision, AContent); -end; - function RegisterRevisionProvider(const ATranslator: IJclRevisionProvider): Integer; begin - Result := RevisionProviders.RegisterProvider(ATranslator); + Result := RegisterRevisionProviderProc(ATranslator); end; procedure UnregisterRevisionProvider(AIndex: Integer); begin - RevisionProviders.UnregisterProvider(AIndex); + UnregisterRevisionProviderProc(AIndex); end; -initialization - LineNumberTranslators := TJclLineNumberTranslators.Create; - RevisionProviders := TJclRevisionProviders.Create; - -finalization - LineNumberTranslators.Free; - RevisionProviders.Free; - end. Modified: branches/jcl-stack-trace/jcl/experts/stackviewer/StackLineNumberTranslator.pas =================================================================== --- branches/jcl-stack-trace/jcl/experts/stackviewer/StackLineNumberTranslator.pas 2009-04-07 22:47:29 UTC (rev 2728) +++ branches/jcl-stack-trace/jcl/experts/stackviewer/StackLineNumberTranslator.pas 2009-04-07 23:25:43 UTC (rev 2729) @@ -3,30 +3,9 @@ interface uses - Classes, ActiveX; + Classes, ActiveX, JclStackTraceViewerAPI; type - IJclLineNumberTranslator = interface - ['{01E06940-49AE-464B-AC47-D65DFBC41396}'] - function GetIDString: string; - function GetName: string; - function TranslateLineNumbers(ARevisionContent, ACurrentContent: IStream; - ARevisionLineNumbers: TList; ACurrentLineNumbers: TList): Integer; - - property Name: string read GetName; - property IDString: string read GetIDString; - end; - - IJclRevisionProvider = interface - ['{8127FF3C-083D-47FD-855D-6C68EC7CBFB9}'] - function GetIDString: string; - function GetName: string; - function GetRevisionContent(const AFileName, ARevision: string; AContent: IStream): Boolean; - - property Name: string read GetName; - property IDString: string read GetIDString; - end; - TJclLineNumberTranslators = class(TObject) private FIndexList: TList; @@ -67,15 +46,8 @@ RevisionProviders: TJclRevisionProviders; function TranslateLineNumbers(ARevisionContent, ACurrentContent: IStream; ARevisionLineNumbers: TList; ACurrentLineNumbers: TList): Integer; - -function RegisterLineNumberTranslator(const ATranslator: IJclLineNumberTranslator): Integer; -procedure UnregisterLineNumberTranslator(AIndex: Integer); - function GetRevisionContent(const AFileName, ARevision: string; AContent: IStream): Boolean; -function RegisterRevisionProvider(const ATranslator: IJclRevisionProvider): Integer; -procedure UnregisterRevisionProvider(AIndex: Integer); - implementation { TJclLineNumberTranslators } @@ -242,6 +214,10 @@ initialization LineNumberTranslators := TJclLineNumberTranslators.Create; RevisionProviders := TJclRevisionProviders.Create; + RegisterLineNumberTranslatorProc := RegisterLineNumberTranslator; + UnregisterLineNumberTranslatorProc := UnregisterLineNumberTranslator; + RegisterRevisionProviderProc := RegisterRevisionProvider; + UnregisterRevisionProviderProc := UnregisterRevisionProvider; finalization LineNumberTranslators.Free; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <usc...@us...> - 2009-04-07 22:47:31
|
Revision: 2728 http://jcl.svn.sourceforge.net/jcl/?rev=2728&view=rev Author: uschuster Date: 2009-04-07 22:47:29 +0000 (Tue, 07 Apr 2009) Log Message: ----------- split StackLineNumberTranslator.pas into API and internal stuff Added Paths: ----------- branches/jcl-stack-trace/jcl/experts/stackviewer/JclStackTraceViewerAPI.pas Copied: branches/jcl-stack-trace/jcl/experts/stackviewer/JclStackTraceViewerAPI.pas (from rev 2721, branches/jcl-stack-trace/jcl/experts/stackviewer/StackLineNumberTranslator.pas) =================================================================== --- branches/jcl-stack-trace/jcl/experts/stackviewer/JclStackTraceViewerAPI.pas (rev 0) +++ branches/jcl-stack-trace/jcl/experts/stackviewer/JclStackTraceViewerAPI.pas 2009-04-07 22:47:29 UTC (rev 2728) @@ -0,0 +1,250 @@ +unit StackLineNumberTranslator; + +interface + +uses + Classes, ActiveX; + +type + IJclLineNumberTranslator = interface + ['{01E06940-49AE-464B-AC47-D65DFBC41396}'] + function GetIDString: string; + function GetName: string; + function TranslateLineNumbers(ARevisionContent, ACurrentContent: IStream; + ARevisionLineNumbers: TList; ACurrentLineNumbers: TList): Integer; + + property Name: string read GetName; + property IDString: string read GetIDString; + end; + + IJclRevisionProvider = interface + ['{8127FF3C-083D-47FD-855D-6C68EC7CBFB9}'] + function GetIDString: string; + function GetName: string; + function GetRevisionContent(const AFileName, ARevision: string; AContent: IStream): Boolean; + + property Name: string read GetName; + property IDString: string read GetIDString; + end; + + TJclLineNumberTranslators = class(TObject) + private + FIndexList: TList; + FNextIndex: Integer; + FTranslators: TInterfaceList; + function GetCount: Integer; + function GetItems(AIndex: Integer): IJclLineNumberTranslator; + public + constructor Create; + destructor Destroy; override; + function RegisterTranslator(const ATranslator: IJclLineNumberTranslator): Integer; + function TranslateLineNumbers(ARevisionContent, ACurrentContent: IStream; + ARevisionLineNumbers: TList; ACurrentLineNumbers: TList): Integer; + procedure UnregisterTranslator(AIndex: Integer); + property Count: Integer read GetCount; + property Items[AIndex: Integer]: IJclLineNumberTranslator read GetItems; default; + end; + + TJclRevisionProviders = class(TObject) + private + FIndexList: TList; + FNextIndex: Integer; + FTranslators: TInterfaceList; + function GetCount: Integer; + function GetItems(AIndex: Integer): IJclRevisionProvider; + public + constructor Create; + destructor Destroy; override; + function RegisterProvider(const ATranslator: IJclRevisionProvider): Integer; + function GetRevisionContent(const AFileName, ARevision: string; AContent: IStream): Boolean; + procedure UnregisterProvider(AIndex: Integer); + property Count: Integer read GetCount; + property Items[AIndex: Integer]: IJclRevisionProvider read GetItems; default; + end; + +var + LineNumberTranslators: TJclLineNumberTranslators; + RevisionProviders: TJclRevisionProviders; + +function TranslateLineNumbers(ARevisionContent, ACurrentContent: IStream; ARevisionLineNumbers: TList; ACurrentLineNumbers: TList): Integer; + +function RegisterLineNumberTranslator(const ATranslator: IJclLineNumberTranslator): Integer; +procedure UnregisterLineNumberTranslator(AIndex: Integer); + +function GetRevisionContent(const AFileName, ARevision: string; AContent: IStream): Boolean; + +function RegisterRevisionProvider(const ATranslator: IJclRevisionProvider): Integer; +procedure UnregisterRevisionProvider(AIndex: Integer); + +implementation + +{ TJclLineNumberTranslators } + +constructor TJclLineNumberTranslators.Create; +begin + inherited Create; + FNextIndex := 1; + FIndexList := TList.Create; + FTranslators := TInterfaceList.Create; +end; + +destructor TJclLineNumberTranslators.Destroy; +begin + FTranslators.Free; + FIndexList.Free; + inherited Destroy; +end; + +function TJclLineNumberTranslators.GetCount: Integer; +begin + Result := FTranslators.Count; +end; + +function TJclLineNumberTranslators.GetItems(AIndex: Integer): IJclLineNumberTranslator; +begin + Result := IJclLineNumberTranslator(FTranslators[AIndex]); +end; + +function TJclLineNumberTranslators.RegisterTranslator(const ATranslator: IJclLineNumberTranslator): Integer; +begin + if Assigned(ATranslator) then + begin + Result := FNextIndex; + Inc(FNextIndex); + FTranslators.Add(ATranslator); + FIndexList.Add(Pointer(Result)); + end + else + Result := -1; +end; + +function TJclLineNumberTranslators.TranslateLineNumbers(ARevisionContent, ACurrentContent: IStream; + ARevisionLineNumbers: TList; ACurrentLineNumbers: TList): Integer; +var + I: Integer; +begin + Result := 0; + for I := 0 to Count - 1 do + begin + Result := Items[I].TranslateLineNumbers(ARevisionContent, ACurrentContent, ARevisionLineNumbers, ACurrentLineNumbers); + if Result > 0 then + Break; + end; +end; + +procedure TJclLineNumberTranslators.UnregisterTranslator(AIndex: Integer); +var + Idx: Integer; +begin + Idx := FIndexList.IndexOf(Pointer(AIndex)); + if Idx <> -1 then + begin + FTranslators.Delete(Idx); + FIndexList.Delete(Idx); + end; +end; + +{ TJclRevisionProviders } + +constructor TJclRevisionProviders.Create; +begin + inherited Create; + FNextIndex := 1; + FIndexList := TList.Create; + FTranslators := TInterfaceList.Create; +end; + +destructor TJclRevisionProviders.Destroy; +begin + FTranslators.Free; + FIndexList.Free; + inherited Destroy; +end; + +function TJclRevisionProviders.GetCount: Integer; +begin + Result := FTranslators.Count; +end; + +function TJclRevisionProviders.GetItems(AIndex: Integer): IJclRevisionProvider; +begin + Result := IJclRevisionProvider(FTranslators[AIndex]); +end; + +function TJclRevisionProviders.RegisterProvider(const ATranslator: IJclRevisionProvider): Integer; +begin + if Assigned(ATranslator) then + begin + Result := FNextIndex; + Inc(FNextIndex); + FTranslators.Add(ATranslator); + FIndexList.Add(Pointer(Result)); + end + else + Result := -1; +end; + +function TJclRevisionProviders.GetRevisionContent(const AFileName, ARevision: string; AContent: IStream): Boolean; +var + I: Integer; +begin + Result := False; + for I := 0 to Count - 1 do + if Items[I].GetRevisionContent(AFileName, ARevision, AContent) then + begin + Result := True; + Break; + end; +end; + +procedure TJclRevisionProviders.UnregisterProvider(AIndex: Integer); +var + Idx: Integer; +begin + Idx := FIndexList.IndexOf(Pointer(AIndex)); + if Idx <> -1 then + begin + FTranslators.Delete(Idx); + FIndexList.Delete(Idx); + end; +end; + +function RegisterLineNumberTranslator(const ATranslator: IJclLineNumberTranslator): Integer; +begin + Result := LineNumberTranslators.RegisterTranslator(ATranslator); +end; + +function TranslateLineNumbers(ARevisionContent, ACurrentContent: IStream; ARevisionLineNumbers: TList; ACurrentLineNumbers: TList): Integer; +begin + Result := LineNumberTranslators.TranslateLineNumbers(ARevisionContent, ACurrentContent, ARevisionLineNumbers, ACurrentLineNumbers); +end; + +procedure UnregisterLineNumberTranslator(AIndex: Integer); +begin + LineNumberTranslators.UnregisterTranslator(AIndex); +end; + +function GetRevisionContent(const AFileName, ARevision: string; AContent: IStream): Boolean; +begin + Result := RevisionProviders.GetRevisionContent(AFileName, ARevision, AContent); +end; + +function RegisterRevisionProvider(const ATranslator: IJclRevisionProvider): Integer; +begin + Result := RevisionProviders.RegisterProvider(ATranslator); +end; + +procedure UnregisterRevisionProvider(AIndex: Integer); +begin + RevisionProviders.UnregisterProvider(AIndex); +end; + +initialization + LineNumberTranslators := TJclLineNumberTranslators.Create; + RevisionProviders := TJclRevisionProviders.Create; + +finalization + LineNumberTranslators.Free; + RevisionProviders.Free; + +end. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <usc...@us...> - 2009-04-05 19:23:33
|
Revision: 2726 http://jcl.svn.sourceforge.net/jcl/?rev=2726&view=rev Author: uschuster Date: 2009-04-05 19:23:30 +0000 (Sun, 05 Apr 2009) Log Message: ----------- splitter persistence Modified Paths: -------------- branches/jcl-stack-trace/jcl/experts/stackviewer/ThreadFrame.dfm branches/jcl-stack-trace/jcl/experts/stackviewer/ThreadFrame.pas Modified: branches/jcl-stack-trace/jcl/experts/stackviewer/ThreadFrame.dfm =================================================================== --- branches/jcl-stack-trace/jcl/experts/stackviewer/ThreadFrame.dfm 2009-04-05 17:54:00 UTC (rev 2725) +++ branches/jcl-stack-trace/jcl/experts/stackviewer/ThreadFrame.dfm 2009-04-05 19:23:30 UTC (rev 2726) @@ -4,7 +4,7 @@ Width = 320 Height = 240 TabOrder = 0 - object Splitter1: TSplitter + object splCreationStack: TSplitter Left = 0 Top = 149 Width = 320 @@ -40,6 +40,5 @@ Align = alClient BevelOuter = bvNone TabOrder = 2 - ExplicitTop = 44 end end Modified: branches/jcl-stack-trace/jcl/experts/stackviewer/ThreadFrame.pas =================================================================== --- branches/jcl-stack-trace/jcl/experts/stackviewer/ThreadFrame.pas 2009-04-05 17:54:00 UTC (rev 2725) +++ branches/jcl-stack-trace/jcl/experts/stackviewer/ThreadFrame.pas 2009-04-05 19:23:30 UTC (rev 2726) @@ -11,7 +11,7 @@ pnlExceptInfo: TPanel; pnlCreationStack: TPanel; pnlStack: TPanel; - Splitter1: TSplitter; + splCreationStack: TSplitter; private FCreationStackFrame: TfrmStack; FExceptionFrame: TfrmException; @@ -20,15 +20,18 @@ FStackList: TStackViewItemsList; FException: TException; FLastStackFrame: TObject; + FCreationStackHeight: Integer; + procedure SaveSplitterState; procedure SetCreationStackList(const Value: TStackViewItemsList); procedure SetException(const Value: TException); procedure SetStackList(const Value: TStackViewItemsList); function GetSelected: TStackViewItem; procedure HandleStackSelection(ASender: TObject); + procedure UpdateSplitterState; { Private declarations } public { Public declarations } - constructor Create(AOwner: TComponent); + constructor Create(AOwner: TComponent); override; procedure LoadState(AIni: TCustomIniFile; const ASection: string); procedure SaveState(AIni: TCustomIniFile; const ASection: string); property CreationStackList: TStackViewItemsList read FCreationStackList write SetCreationStackList; @@ -59,6 +62,7 @@ FStackFrame.Parent := pnlStack; FStackFrame.Align := alClient; FStackFrame.OnSelectStackLine := HandleStackSelection; + FCreationStackHeight := pnlCreationStack.Height; FLastStackFrame := nil; end; @@ -80,14 +84,22 @@ procedure TfrmThread.LoadState(AIni: TCustomIniFile; const ASection: string); begin - { TODO -oUSc : Load splitter } + FCreationStackHeight := AIni.ReadInteger(ASection, 'CreationStackFrameHeight', FCreationStackHeight); + UpdateSplitterState; FStackFrame.LoadState(AIni, ASection, 'StackFrameThread'); FCreationStackFrame.LoadState(AIni, ASection, 'CreationStackFrameThread'); end; +procedure TfrmThread.SaveSplitterState; +begin + if pnlStack.Visible and pnlCreationStack.Visible then + FCreationStackHeight := pnlCreationStack.Height; +end; + procedure TfrmThread.SaveState(AIni: TCustomIniFile; const ASection: string); begin - { TODO -oUSc : Save splitter } + SaveSplitterState; + AIni.WriteInteger(ASection, 'CreationStackFrameHeight', FCreationStackHeight); FStackFrame.SaveState(AIni, ASection, 'StackFrameThread'); FCreationStackFrame.SaveState(AIni, ASection, 'CreationStackFrameThread'); end; @@ -96,7 +108,9 @@ begin FCreationStackList := Value; FCreationStackFrame.StackList := FCreationStackList; + SaveSplitterState; pnlCreationStack.Visible := Assigned(FCreationStackList); + UpdateSplitterState; end; procedure TfrmThread.SetException(const Value: TException); @@ -110,7 +124,19 @@ begin FStackList := Value; FStackFrame.StackList := FStackList; + SaveSplitterState; pnlStack.Visible := Assigned(FStackList); + UpdateSplitterState; end; +procedure TfrmThread.UpdateSplitterState; +begin + splCreationStack.Visible := pnlStack.Visible and pnlCreationStack.Visible; + if splCreationStack.Visible then + begin + pnlCreationStack.Height := FCreationStackHeight; + splCreationStack.Top := pnlCreationStack.Top - 1; + end; +end; + end. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <usc...@us...> - 2009-04-05 17:54:01
|
Revision: 2725 http://jcl.svn.sourceforge.net/jcl/?rev=2725&view=rev Author: uschuster Date: 2009-04-05 17:54:00 +0000 (Sun, 05 Apr 2009) Log Message: ----------- layout persistence Modified Paths: -------------- branches/jcl-stack-trace/jcl/TODO.txt branches/jcl-stack-trace/jcl/experts/stackviewer/ModuleFrame.pas branches/jcl-stack-trace/jcl/experts/stackviewer/StackFrame.pas branches/jcl-stack-trace/jcl/experts/stackviewer/StackTraceViewerImpl.pas branches/jcl-stack-trace/jcl/experts/stackviewer/StackViewForm.pas branches/jcl-stack-trace/jcl/experts/stackviewer/ThreadFrame.pas Modified: branches/jcl-stack-trace/jcl/TODO.txt =================================================================== --- branches/jcl-stack-trace/jcl/TODO.txt 2009-04-05 13:34:00 UTC (rev 2724) +++ branches/jcl-stack-trace/jcl/TODO.txt 2009-04-05 17:54:00 UTC (rev 2725) @@ -14,10 +14,6 @@ Expert ------ -* storing the layout - - e.g. settings of the stack listviews - - should go into the desktop layout and not into the expert settings? - * serialization - saving/loading - which classes for the viewer? @@ -33,7 +29,8 @@ * icon's -* clean up +* clean up/minor things + - add and test desktop state stuff in DLL expert mode - split StackLineNumberTranslator.pas into API and internal stuff - use updated TJclFileEnumerator instead of TFileSearcher - rename some files Modified: branches/jcl-stack-trace/jcl/experts/stackviewer/ModuleFrame.pas =================================================================== --- branches/jcl-stack-trace/jcl/experts/stackviewer/ModuleFrame.pas 2009-04-05 13:34:00 UTC (rev 2724) +++ branches/jcl-stack-trace/jcl/experts/stackviewer/ModuleFrame.pas 2009-04-05 17:54:00 UTC (rev 2725) @@ -3,8 +3,8 @@ interface uses - Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, - Dialogs, ComCtrls, JclDebugStackUtils; + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + ComCtrls, IniFiles, JclDebugStackUtils; type TfrmModule = class(TFrame) @@ -16,6 +16,8 @@ public { Public declarations } property ModuleList: TModuleList read FModuleList write SetModuleList; + procedure LoadState(AIni: TCustomIniFile; const ASection: string); + procedure SaveState(AIni: TCustomIniFile; const ASection: string); end; implementation @@ -24,6 +26,23 @@ { TfrmModule } +procedure TfrmModule.LoadState(AIni: TCustomIniFile; const ASection: string); +var + I: Integer; +begin + for I := 0 to lv.Columns.Count - 1 do + lv.Columns.Items[I].Width := AIni.ReadInteger(ASection, + Format('ModuleFrameColumnWidth%d', [I]), lv.Columns.Items[I].Width); +end; + +procedure TfrmModule.SaveState(AIni: TCustomIniFile; const ASection: string); +var + I: Integer; +begin + for I := 0 to lv.Columns.Count - 1 do + AIni.WriteInteger(ASection, Format('ModuleFrameColumnWidth%d', [I]), lv.Columns.Items[I].Width); +end; + procedure TfrmModule.SetModuleList(const Value: TModuleList); var I: Integer; Modified: branches/jcl-stack-trace/jcl/experts/stackviewer/StackFrame.pas =================================================================== --- branches/jcl-stack-trace/jcl/experts/stackviewer/StackFrame.pas 2009-04-05 13:34:00 UTC (rev 2724) +++ branches/jcl-stack-trace/jcl/experts/stackviewer/StackFrame.pas 2009-04-05 17:54:00 UTC (rev 2725) @@ -3,8 +3,8 @@ interface uses - Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, - Dialogs, ComCtrls, JclDebug, StackViewUnit, StackCodeUtils; + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + ComCtrls, IniFiles, JclDebug, StackViewUnit, StackCodeUtils; type TfrmStack = class(TFrame) @@ -20,6 +20,8 @@ function GetSelected: TStackViewItem; public { Public declarations } + procedure LoadState(AIni: TCustomIniFile; const ASection, APrefix: string); + procedure SaveState(AIni: TCustomIniFile; const ASection, APrefix: string); property StackList: TStackViewItemsList read FStackList write SetStackList; property Selected: TStackViewItem read GetSelected; property OnSelectStackLine: TNotifyEvent read FOnSelectStackLine write FOnSelectStackLine; @@ -45,6 +47,15 @@ Result := nil; end; +procedure TfrmStack.LoadState(AIni: TCustomIniFile; const ASection, APrefix: string); +var + I: Integer; +begin + for I := 0 to lv.Columns.Count - 1 do + lv.Columns.Items[I].Width := AIni.ReadInteger(ASection, + Format(APrefix + 'ColumnWidth%d', [I]), lv.Columns.Items[I].Width); +end; + procedure TfrmStack.lvChange(Sender: TObject; Item: TListItem; Change: TItemChange); begin DoSelectStackLine; @@ -55,6 +66,14 @@ JumpToCode(Selected); end; +procedure TfrmStack.SaveState(AIni: TCustomIniFile; const ASection, APrefix: string); +var + I: Integer; +begin + for I := 0 to lv.Columns.Count - 1 do + AIni.WriteInteger(ASection, Format(APrefix + 'ColumnWidth%d', [I]), lv.Columns.Items[I].Width); +end; + procedure TfrmStack.SetStackList(const Value: TStackViewItemsList); var I: Integer; Modified: branches/jcl-stack-trace/jcl/experts/stackviewer/StackTraceViewerImpl.pas =================================================================== --- branches/jcl-stack-trace/jcl/experts/stackviewer/StackTraceViewerImpl.pas 2009-04-05 13:34:00 UTC (rev 2724) +++ branches/jcl-stack-trace/jcl/experts/stackviewer/StackTraceViewerImpl.pas 2009-04-05 17:54:00 UTC (rev 2725) @@ -9,7 +9,8 @@ {$IFDEF UNITVERSIONING} JclUnitVersioning, {$ENDIF UNITVERSIONING} - JclOtaUtils, StackViewForm, StackTraceViewerConfigFrame, ExceptionViewerOptionsUnit;//td1 + JclOtaUtils, StackViewForm, StackTraceViewerConfigFrame, ExceptionViewerOptionsUnit, + DeskUtil; {$R 'JclSIMDIcon.dcr'} //todo - own icon @@ -70,6 +71,9 @@ procedure Register; begin try + if Assigned(RegisterFieldAddress) then + RegisterFieldAddress(IDEDesktopIniSection, @frmStackView); + RegisterDesktopFormClass(TfrmStackView, IDEDesktopIniSection, IDEDesktopIniSection); RegisterPackageWizard(TJclStackTraceViewerExpert.Create); except on ExceptionObj: TObject do @@ -96,6 +100,7 @@ end; end; +{ TODO -oUSc : Add and test desktop state stuff (RegisterFieldAddress and RegisterDesktopFormClass) } function JCLWizardInit(const BorlandIDEServices: IBorlandIDEServices; RegisterProc: TWizardRegisterProc; var TerminateProc: TWizardTerminateProc): Boolean stdcall; @@ -267,12 +272,16 @@ FreeAndNil(FStackTraceViewAction); end; -{$IFDEF UNITVERSIONING} initialization + {$IFDEF UNITVERSIONING} RegisterUnitVersion(HInstance, UnitVersioning); + {$ENDIF UNITVERSIONING} finalization + if Assigned(UnRegisterFieldAddress) then + UnRegisterFieldAddress(@frmStackView); + {$IFDEF UNITVERSIONING} UnregisterUnitVersion(HInstance); -{$ENDIF UNITVERSIONING} + {$ENDIF UNITVERSIONING} end. Modified: branches/jcl-stack-trace/jcl/experts/stackviewer/StackViewForm.pas =================================================================== --- branches/jcl-stack-trace/jcl/experts/stackviewer/StackViewForm.pas 2009-04-05 13:34:00 UTC (rev 2724) +++ branches/jcl-stack-trace/jcl/experts/stackviewer/StackViewForm.pas 2009-04-05 17:54:00 UTC (rev 2725) @@ -5,7 +5,7 @@ uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Docktoolform, StdCtrls, ComCtrls, Menus, - PlatformDefaultStyleActnCtrls, ActnPopup, ActnList, ToolWin, ExtCtrls, ToolsAPI, + PlatformDefaultStyleActnCtrls, ActnPopup, ActnList, ToolWin, ExtCtrls, IniFiles, ToolsAPI, JclDebug, JclDebugStackUtils, Contnrs, StackFrame, ModuleFrame, StackViewUnit, StackFrame2, StackCodeUtils, ExceptInfoFrame, ThreadFrame, ExceptionViewerOptionsUnit, StackLineNumberTranslator, JclOtaUtils @@ -63,6 +63,8 @@ { Public declarations } constructor Create(AOwner: TComponent); override; destructor Destroy; override; + procedure LoadWindowState(ADesktop: TCustomIniFile); override; + procedure SaveWindowState(ADesktop: TCustomIniFile; AIsProject: Boolean); override; property Options: TExceptionViewerOption read FOptions write SetOptions; property RootDir: string read FRootDir write FRootDir; end; @@ -70,11 +72,11 @@ var frmStackView: TfrmStackView; -implementation - const IDEDesktopIniSection = 'TStackViewAddIn';//todo - move +implementation + {$R *.dfm} type @@ -98,6 +100,17 @@ AutoSave := True; end; +procedure TfrmStackView.LoadWindowState(ADesktop: TCustomIniFile); +begin + inherited LoadWindowState(ADesktop); + if Assigned(ADesktop) then + begin + FStackFrame.LoadState(ADesktop, DeskSection, 'StackFrameSingle'); + FModuleFrame.LoadState(ADesktop, DeskSection); + FThreadFrame.LoadState(ADesktop, DeskSection); + end; +end; + type TFindMapping = class(TObject) private @@ -415,6 +428,17 @@ end; end; +procedure TfrmStackView.SaveWindowState(ADesktop: TCustomIniFile; AIsProject: Boolean); +begin + inherited SaveWindowState(ADesktop, AIsProject); + if SaveStateNecessary and Assigned(ADesktop) then + begin + FStackFrame.SaveState(ADesktop, DeskSection, 'StackFrameSingle'); + FModuleFrame.SaveState(ADesktop, DeskSection); + FThreadFrame.SaveState(ADesktop, DeskSection); + end; +end; + procedure TfrmStackView.SetOptions(const Value: TExceptionViewerOption); var OldOptions: TExceptionViewerOption; Modified: branches/jcl-stack-trace/jcl/experts/stackviewer/ThreadFrame.pas =================================================================== --- branches/jcl-stack-trace/jcl/experts/stackviewer/ThreadFrame.pas 2009-04-05 13:34:00 UTC (rev 2724) +++ branches/jcl-stack-trace/jcl/experts/stackviewer/ThreadFrame.pas 2009-04-05 17:54:00 UTC (rev 2725) @@ -3,8 +3,8 @@ interface uses - Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, - Dialogs, ExtCtrls, JclDebugStackUtils, StackViewUnit, StackFrame, ExceptInfoFrame; + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + ExtCtrls, IniFiles, JclDebugStackUtils, StackViewUnit, StackFrame, ExceptInfoFrame; type TfrmThread = class(TFrame) @@ -29,6 +29,8 @@ public { Public declarations } constructor Create(AOwner: TComponent); + procedure LoadState(AIni: TCustomIniFile; const ASection: string); + procedure SaveState(AIni: TCustomIniFile; const ASection: string); property CreationStackList: TStackViewItemsList read FCreationStackList write SetCreationStackList; property Exception: TException read FException write SetException; property StackList: TStackViewItemsList read FStackList write SetStackList; @@ -76,6 +78,20 @@ FLastStackFrame := ASender; end; +procedure TfrmThread.LoadState(AIni: TCustomIniFile; const ASection: string); +begin + { TODO -oUSc : Load splitter } + FStackFrame.LoadState(AIni, ASection, 'StackFrameThread'); + FCreationStackFrame.LoadState(AIni, ASection, 'CreationStackFrameThread'); +end; + +procedure TfrmThread.SaveState(AIni: TCustomIniFile; const ASection: string); +begin + { TODO -oUSc : Save splitter } + FStackFrame.SaveState(AIni, ASection, 'StackFrameThread'); + FCreationStackFrame.SaveState(AIni, ASection, 'CreationStackFrameThread'); +end; + procedure TfrmThread.SetCreationStackList(const Value: TStackViewItemsList); begin FCreationStackList := Value; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <usc...@us...> - 2009-04-05 14:22:25
|
Revision: 2724 http://jcl.svn.sourceforge.net/jcl/?rev=2724&view=rev Author: uschuster Date: 2009-04-05 13:34:00 +0000 (Sun, 05 Apr 2009) Log Message: ----------- - revision is now be shown in the stack trace - added option ModuleVersionAsRevision to use the build number from the modules BinFileVersion as revision - extended the module list (was partly necessary for ModuleVersionAsRevision) Modified Paths: -------------- branches/jcl-stack-trace/jcl/TODO.txt branches/jcl-stack-trace/jcl/examples/windows/debug/mttest/JclDebugMTTestMain.pas branches/jcl-stack-trace/jcl/experts/stackviewer/ExceptionViewerOptionsUnit.pas branches/jcl-stack-trace/jcl/experts/stackviewer/JclDebugStackUtils.pas branches/jcl-stack-trace/jcl/experts/stackviewer/ModuleFrame.dfm branches/jcl-stack-trace/jcl/experts/stackviewer/ModuleFrame.pas branches/jcl-stack-trace/jcl/experts/stackviewer/StackFrame.dfm branches/jcl-stack-trace/jcl/experts/stackviewer/StackFrame.pas branches/jcl-stack-trace/jcl/experts/stackviewer/StackTraceViewerConfigFrame.dfm branches/jcl-stack-trace/jcl/experts/stackviewer/StackTraceViewerConfigFrame.pas branches/jcl-stack-trace/jcl/experts/stackviewer/StackTraceViewerImpl.pas branches/jcl-stack-trace/jcl/experts/stackviewer/StackViewForm.pas Modified: branches/jcl-stack-trace/jcl/TODO.txt =================================================================== --- branches/jcl-stack-trace/jcl/TODO.txt 2009-04-04 18:42:57 UTC (rev 2723) +++ branches/jcl-stack-trace/jcl/TODO.txt 2009-04-05 13:34:00 UTC (rev 2724) @@ -26,8 +26,7 @@ this can be get from the handle which doesn't work in the viewer) * Revision property - - show revision in stack trace - - adding an option to use the version info of a module binary as revision + - load revision info provide in stack trace * progress for TfrmStackView.PrepareStack (getting revisions from a real SCM system can take some time) Modified: branches/jcl-stack-trace/jcl/examples/windows/debug/mttest/JclDebugMTTestMain.pas =================================================================== --- branches/jcl-stack-trace/jcl/examples/windows/debug/mttest/JclDebugMTTestMain.pas 2009-04-04 18:42:57 UTC (rev 2723) +++ branches/jcl-stack-trace/jcl/examples/windows/debug/mttest/JclDebugMTTestMain.pas 2009-04-05 13:34:00 UTC (rev 2724) @@ -6,7 +6,7 @@ uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - StdCtrls, PSAPI, JclDebug; + StdCtrls, PSAPI, JclDebug, JclFileUtils; type TMTTestForm = class(TForm) @@ -36,25 +36,43 @@ procedure LoadedModules(ModuleList: TStrings); var I: Integer; - Modules: array of DWORD; - BytesNeeded: DWORD; - ModuleCount: Integer; ProcessHandle: THandle; FileName: array [0..Max_Path] of Char; - S: string; + S, BinFileVersion, FileVersion, FileDescription: string; + FileVersionInfo: TJclFileVersionInfo; + ModuleInfoList: TJclModuleInfoList; + ModuleBase: Cardinal; begin ProcessHandle := GetCurrentProcess; - SetLength(Modules, 1); - EnumProcessModules(ProcessHandle, @Modules[0], 1, BytesNeeded); - ModuleCount := BytesNeeded div SizeOf(DWORD); - SetLength(Modules, ModuleCount); - EnumProcessModules(ProcessHandle, @Modules[0], BytesNeeded, BytesNeeded); - ModuleList.Add('Handle;FileName'); - for I := 0 to ModuleCount - 1 do - begin - GetModuleFileNameEx(ProcessHandle, Modules[I], FileName, SizeOf(FileName)); - S := Format('"0x%.8x";%s', [Modules[I], CSVEncode(ExtractFileName(FileName))]); - ModuleList.Add(S); + ModuleList.Add('StartAddr;EndAddr;SystemModule;FileName;BinFileVersion;FileVersion;FileDescription'); + ModuleInfoList := TJclModuleInfoList.Create(False, False); + try + for I := 0 to ModuleInfoList.Count - 1 do + begin + ModuleBase := Cardinal(ModuleInfoList.Items[I].StartAddr); + GetModuleFileNameEx(ProcessHandle, ModuleBase, FileName, SizeOf(FileName)); + FileVersion := ''; + if (FileName <> '') and VersionResourceAvailable(FileName) then + begin + FileVersionInfo := TJclFileVersionInfo.Create(FileName); + try + BinFileVersion := FileVersionInfo.BinFileVersion; + FileVersion := FileVersionInfo.FileVersion; + FileDescription := FileVersionInfo.FileDescription; + finally + FileVersionInfo.Free; + end; + end; + if ModuleInfoList.Items[I].SystemModule then + S := '1' + else + S := '0'; + S := Format('"0x%.8x";"0x%.8x";"%s";%s;%s;%s;%s', [ModuleBase, Cardinal(ModuleInfoList.Items[I].EndAddr), S, + CSVEncode(FileName), CSVEncode(BinFileVersion), CSVEncode(FileVersion), CSVEncode(FileDescription)]); + ModuleList.Add(S); + end; + finally + ModuleInfoList.Free; end; end; Modified: branches/jcl-stack-trace/jcl/experts/stackviewer/ExceptionViewerOptionsUnit.pas =================================================================== --- branches/jcl-stack-trace/jcl/experts/stackviewer/ExceptionViewerOptionsUnit.pas 2009-04-04 18:42:57 UTC (rev 2723) +++ branches/jcl-stack-trace/jcl/experts/stackviewer/ExceptionViewerOptionsUnit.pas 2009-04-05 13:34:00 UTC (rev 2724) @@ -9,11 +9,13 @@ TExceptionViewerOption = class(TPersistent) private FExpandTreeView: Boolean; + FModuleVersionAsRevision: Boolean; protected procedure AssignTo(Dest: TPersistent); override; public constructor Create; property ExpandTreeView: Boolean read FExpandTreeView write FExpandTreeView; + property ModuleVersionAsRevision: Boolean read FModuleVersionAsRevision write FModuleVersionAsRevision; end; implementation @@ -24,6 +26,7 @@ begin inherited Create; FExpandTreeView := False; + FModuleVersionAsRevision := False; end; procedure TExceptionViewerOption.AssignTo(Dest: TPersistent); @@ -31,6 +34,7 @@ if Dest is TExceptionViewerOption then begin TExceptionViewerOption(Dest).FExpandTreeView := ExpandTreeView; + TExceptionViewerOption(Dest).FModuleVersionAsRevision := ModuleVersionAsRevision; end else inherited AssignTo(Dest); Modified: branches/jcl-stack-trace/jcl/experts/stackviewer/JclDebugStackUtils.pas =================================================================== --- branches/jcl-stack-trace/jcl/experts/stackviewer/JclDebugStackUtils.pas 2009-04-04 18:42:57 UTC (rev 2723) +++ branches/jcl-stack-trace/jcl/experts/stackviewer/JclDebugStackUtils.pas 2009-04-05 13:34:00 UTC (rev 2724) @@ -83,11 +83,21 @@ TModule = class(TObject) private - FHandleStr: string; + FStartStr: string; + FEndStr: string; + FSystemModuleStr: string; FModuleName: string; + FBinFileVersion: string; + FFileVersion: string; + FFileDescription: string; public - property HandleStr: string read FHandleStr write FHandleStr; + property StartStr: string read FStartStr write FStartStr; + property EndStr: string read FEndStr write FEndStr; + property SystemModuleStr: string read FSystemModuleStr write FSystemModuleStr; property ModuleName: string read FModuleName write FModuleName; + property BinFileVersion: string read FBinFileVersion write FBinFileVersion; + property FileVersion: string read FFileVersion write FFileVersion; + property FileDescription: string read FFileDescription write FFileDescription; end; TModuleList = class(TObject) @@ -638,9 +648,19 @@ begin FItems.Add(TModule.Create); Module := TModule(FItems.Last); - Module.HandleStr := CSVRecord[0].Value; + Module.StartStr := CSVRecord[0].Value; if CSVRecord.Count > 1 then - Module.ModuleName := CSVRecord[1].Value; + Module.EndStr := CSVRecord[1].Value; + if CSVRecord.Count > 2 then + Module.SystemModuleStr := CSVRecord[2].Value; + if CSVRecord.Count > 3 then + Module.ModuleName := CSVRecord[3].Value; + if CSVRecord.Count > 4 then + Module.BinFileVersion := CSVRecord[4].Value; + if CSVRecord.Count > 5 then + Module.FileVersion := CSVRecord[5].Value; + if CSVRecord.Count > 6 then + Module.FileDescription := CSVRecord[6].Value; end; end; finally Modified: branches/jcl-stack-trace/jcl/experts/stackviewer/ModuleFrame.dfm =================================================================== --- branches/jcl-stack-trace/jcl/experts/stackviewer/ModuleFrame.dfm 2009-04-04 18:42:57 UTC (rev 2723) +++ branches/jcl-stack-trace/jcl/experts/stackviewer/ModuleFrame.dfm 2009-04-05 13:34:00 UTC (rev 2724) @@ -12,10 +12,25 @@ Align = alClient Columns = < item - Caption = 'Handle' + Caption = 'StartAddr' end item + Caption = 'EndAddr' + end + item + Caption = 'SystemModule' + end + item Caption = 'FileName' + end + item + Caption = 'BinFileVersion' + end + item + Caption = 'FileVersion' + end + item + Caption = 'FileDescription' end> GridLines = True ReadOnly = True Modified: branches/jcl-stack-trace/jcl/experts/stackviewer/ModuleFrame.pas =================================================================== --- branches/jcl-stack-trace/jcl/experts/stackviewer/ModuleFrame.pas 2009-04-04 18:42:57 UTC (rev 2723) +++ branches/jcl-stack-trace/jcl/experts/stackviewer/ModuleFrame.pas 2009-04-05 13:34:00 UTC (rev 2724) @@ -34,9 +34,15 @@ for I := 0 to FModuleList.Count - 1 do begin ListItem := lv.Items.Add; - ListItem.Caption := FModuleList[I].HandleStr; - ListItem.SubItems.Add(FModuleList[I].ModuleName); + ListItem.Caption := FModuleList[I].StartStr; + ListItem.SubItems.Add(FModuleList[I].EndStr); + ListItem.SubItems.Add(FModuleList[I].SystemModuleStr); + ListItem.SubItems.Add(ExtractFileName(FModuleList[I].ModuleName)); + ListItem.SubItems.Add(FModuleList[I].BinFileVersion); + ListItem.SubItems.Add(FModuleList[I].FileVersion); + ListItem.SubItems.Add(FModuleList[I].FileDescription); end; end; end. + Modified: branches/jcl-stack-trace/jcl/experts/stackviewer/StackFrame.dfm =================================================================== --- branches/jcl-stack-trace/jcl/experts/stackviewer/StackFrame.dfm 2009-04-04 18:42:57 UTC (rev 2723) +++ branches/jcl-stack-trace/jcl/experts/stackviewer/StackFrame.dfm 2009-04-05 13:34:00 UTC (rev 2724) @@ -30,6 +30,9 @@ Caption = 'LineNumberOffsetFromProcedureStart' end item + Caption = 'Revision' + end + item Caption = 'Project/File' end item Modified: branches/jcl-stack-trace/jcl/experts/stackviewer/StackFrame.pas =================================================================== --- branches/jcl-stack-trace/jcl/experts/stackviewer/StackFrame.pas 2009-04-04 18:42:57 UTC (rev 2723) +++ branches/jcl-stack-trace/jcl/experts/stackviewer/StackFrame.pas 2009-04-05 13:34:00 UTC (rev 2724) @@ -84,6 +84,7 @@ else S := ''; ListItem.SubItems.Add(S); + ListItem.SubItems.Add(FStackList[I].Revision); if FStackList[I].ProjectName <> '' then S := ExtractFileName(FStackList[I].ProjectName) else Modified: branches/jcl-stack-trace/jcl/experts/stackviewer/StackTraceViewerConfigFrame.dfm =================================================================== --- branches/jcl-stack-trace/jcl/experts/stackviewer/StackTraceViewerConfigFrame.dfm 2009-04-04 18:42:57 UTC (rev 2723) +++ branches/jcl-stack-trace/jcl/experts/stackviewer/StackTraceViewerConfigFrame.dfm 2009-04-05 13:34:00 UTC (rev 2724) @@ -14,4 +14,12 @@ Caption = 'Expand TreeView' TabOrder = 0 end + object cbModuleVersionAsRevision: TCheckBox + Left = 8 + Top = 31 + Width = 169 + Height = 17 + Caption = 'Module FileVersion as Revision' + TabOrder = 1 + end end Modified: branches/jcl-stack-trace/jcl/experts/stackviewer/StackTraceViewerConfigFrame.pas =================================================================== --- branches/jcl-stack-trace/jcl/experts/stackviewer/StackTraceViewerConfigFrame.pas 2009-04-04 18:42:57 UTC (rev 2723) +++ branches/jcl-stack-trace/jcl/experts/stackviewer/StackTraceViewerConfigFrame.pas 2009-04-05 13:34:00 UTC (rev 2724) @@ -12,6 +12,7 @@ type TJclStackTraceViewerConfigFrame = class(TFrame) cbExpandTreeView: TCheckBox; + cbModuleVersionAsRevision: TCheckBox; private FOptions: TExceptionViewerOption; function GetOptions: TExceptionViewerOption; @@ -54,12 +55,14 @@ begin Result := FOptions; FOptions.ExpandTreeView := cbExpandTreeView.Checked; + FOptions.ModuleVersionAsRevision := cbModuleVersionAsRevision.Checked; end; procedure TJclStackTraceViewerConfigFrame.SetOptions(const Value: TExceptionViewerOption); begin FOptions.Assign(Value); cbExpandTreeView.Checked := FOptions.ExpandTreeView; + cbModuleVersionAsRevision.Checked := FOptions.ModuleVersionAsRevision; end; {$IFDEF UNITVERSIONING} Modified: branches/jcl-stack-trace/jcl/experts/stackviewer/StackTraceViewerImpl.pas =================================================================== --- branches/jcl-stack-trace/jcl/experts/stackviewer/StackTraceViewerImpl.pas 2009-04-04 18:42:57 UTC (rev 2723) +++ branches/jcl-stack-trace/jcl/experts/stackviewer/StackTraceViewerImpl.pas 2009-04-05 13:34:00 UTC (rev 2724) @@ -177,6 +177,7 @@ procedure TJclStackTraceViewerExpert.LoadExpertValues; begin FOptions.ExpandTreeView := Settings.LoadBool('ExpandTreeView', FOptions.ExpandTreeView); + FOptions.ModuleVersionAsRevision := Settings.LoadBool('ModuleVersionAsRevision', FOptions.ModuleVersionAsRevision); end; procedure TJclStackTraceViewerExpert.RegisterCommands; @@ -253,6 +254,7 @@ procedure TJclStackTraceViewerExpert.SaveExpertValues; begin Settings.SaveBool('ExpandTreeView', FOptions.ExpandTreeView); + Settings.SaveBool('ModuleVersionAsRevision', FOptions.ModuleVersionAsRevision); end; procedure TJclStackTraceViewerExpert.UnregisterCommands; Modified: branches/jcl-stack-trace/jcl/experts/stackviewer/StackViewForm.pas =================================================================== --- branches/jcl-stack-trace/jcl/experts/stackviewer/StackViewForm.pas 2009-04-04 18:42:57 UTC (rev 2723) +++ branches/jcl-stack-trace/jcl/experts/stackviewer/StackViewForm.pas 2009-04-05 13:34:00 UTC (rev 2724) @@ -222,6 +222,49 @@ end; end; + //use the build number from the version number as revision number if the revision number is empty + if FOptions.ModuleVersionAsRevision then + begin + for I := 0 to FindFileList.Count - 1 do + begin + FindMapping := TFindMapping(FindFileList.Objects[I]); + if (FindMapping.Count > 0) and (FindMapping[0].Revision = '') and (FindMapping[0].ModuleName <> '') then + begin + Idx := -1; + { TODO -oUSc : Compare full filename when the filename in the stack contains also the path + + Why full filenames? + + It is possible to load + <Path 1>\TestDLL.DLL + <Path 2>\TestDLL.DLL} + for J := 0 to FExceptionInfo.Modules.Count - 1 do + if CompareText(ExtractFileName(FExceptionInfo.Modules[J].ModuleName), ExtractFileName(FindMapping[0].ModuleName)) = 0 then + begin + Idx := J; + Break; + end; + if Idx <> -1 then + begin + S := FExceptionInfo.Modules[Idx].BinFileVersion; + K := Pos('.', S); + if K > 0 then + Delete(S, 1, K); + K := Pos('.', S); + if K > 0 then + Delete(S, 1, K); + K := Pos('.', S); + if K > 0 then + begin + Delete(S, 1, K); + for J := 0 to FindMapping.Count - 1 do + FindMapping[J].Revision := S; + end; + end; + end; + end; + end; + //check if the other files can be found in BrowsingPath Found := False; for I := 0 to FindFileList.Count - 1 do @@ -373,8 +416,20 @@ end; procedure TfrmStackView.SetOptions(const Value: TExceptionViewerOption); +var + OldOptions: TExceptionViewerOption; begin - FOptions.Assign(Value); + OldOptions := TExceptionViewerOption.Create; + try + OldOptions.Assign(FOptions); + FOptions.Assign(Value); + if FOptions.ModuleVersionAsRevision <> OldOptions.ModuleVersionAsRevision then + begin + { TODO -oUSc : Update stack views } + end; + finally + OldOptions.Free; + end; end; procedure TfrmStackView.tvChange(Sender: TObject; Node: TTreeNode); @@ -590,12 +645,6 @@ begin inherited; TJclOTAExpertBase.ConfigurationDialog('Stack Trace Viewer'); - { - if ShowOptions(FOptions) then - begin - //todo options changed - end; - } end; procedure TfrmStackView.acUpdateLocalInfoExecute(Sender: TObject); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <usc...@us...> - 2009-04-04 18:43:01
|
Revision: 2723 http://jcl.svn.sourceforge.net/jcl/?rev=2723&view=rev Author: uschuster Date: 2009-04-04 18:42:57 +0000 (Sat, 04 Apr 2009) Log Message: ----------- JclUnitVersioning.pas: - TUnitVersion.RCSfile does now remove the path for SVN URL's in order to get IndexOf and FindUnit working with SVN URL's JclDebug.pas: - added BinaryFileName, DebugInfo and UnitVersion to TJclLocationInfoEx - added Options to TJclLocationInfoList to control which information TJclLocationInfoEx gathers automatically Modified Paths: -------------- branches/jcl-stack-trace/jcl/TODO.txt branches/jcl-stack-trace/jcl/experts/stackviewer/StackViewUnit.pas branches/jcl-stack-trace/jcl/source/common/JclUnitVersioning.pas branches/jcl-stack-trace/jcl/source/windows/JclDebug.pas Modified: branches/jcl-stack-trace/jcl/TODO.txt =================================================================== --- branches/jcl-stack-trace/jcl/TODO.txt 2009-04-04 10:36:42 UTC (rev 2722) +++ branches/jcl-stack-trace/jcl/TODO.txt 2009-04-04 18:42:57 UTC (rev 2723) @@ -4,6 +4,9 @@ * extending TJclThreadInfoList.Gather to exclude a set of threads or to include a set of threads (multiple functions to make things more clear) + - one function for exclude + - one function for include + (exclude + include together doesn't make sense without any wildcard like stuff) * ? merge TJclDebugThreadInfo/TJclDebugThreadList and TJclThreadInfo/TJclThreadInfoList - investigate if the stack can stay a TJclStackInfoList and if the location information can be retrieved later correctly @@ -23,15 +26,23 @@ this can be get from the handle which doesn't work in the viewer) * Revision property - - Integration UNITVERSIONING into TJclLocationInfoEx, but also adding an option to use the version info of a module binary as revision + - show revision in stack trace + - adding an option to use the version info of a module binary as revision * progress for TfrmStackView.PrepareStack - (getting revisions for a real SCM system can take some time) + (getting revisions from a real SCM system can take some time) * icon's * clean up + - split StackLineNumberTranslator.pas into API and internal stuff - use updated TJclFileEnumerator instead of TFileSearcher - rename some files - - MPL headers - - UNITVERSIONING \ No newline at end of file + - add MPL headers + - add UNITVERSIONING + +* integrate it into the installation + - update jcl\packages + - update jcl\install\JclInstall.pas + +* example Line number translator package \ No newline at end of file Modified: branches/jcl-stack-trace/jcl/experts/stackviewer/StackViewUnit.pas =================================================================== --- branches/jcl-stack-trace/jcl/experts/stackviewer/StackViewUnit.pas 2009-04-04 10:36:42 UTC (rev 2722) +++ branches/jcl-stack-trace/jcl/experts/stackviewer/StackViewUnit.pas 2009-04-04 18:42:57 UTC (rev 2723) @@ -52,7 +52,7 @@ function TStackViewItemsList.Add: TStackViewItem; begin - FItems.Add(TStackViewItem.Create(nil)); + FItems.Add(TStackViewItem.Create(nil, nil)); Result := TStackViewItem(FItems.Last); end; Modified: branches/jcl-stack-trace/jcl/source/common/JclUnitVersioning.pas =================================================================== --- branches/jcl-stack-trace/jcl/source/common/JclUnitVersioning.pas 2009-04-04 10:36:42 UTC (rev 2722) +++ branches/jcl-stack-trace/jcl/source/common/JclUnitVersioning.pas 2009-04-04 18:42:57 UTC (rev 2723) @@ -187,7 +187,7 @@ function TUnitVersion.RCSfile: string; var - I: Integer; + I, P: Integer; begin Result := Trim(FInfo.RCSfile); // the + is to have CVS not touch the string @@ -207,6 +207,13 @@ begin Delete(Result, 1, 6); Delete(Result, Length(Result) - 1, 2); + { TODO -oUSc : Is there any need for a function that returns the URL? } + P := Pos('/', Result); + while P > 0 do + begin + Delete(Result, 1, P); + P := Pos('/', Result); + end; end; end; Modified: branches/jcl-stack-trace/jcl/source/windows/JclDebug.pas =================================================================== --- branches/jcl-stack-trace/jcl/source/windows/JclDebug.pas 2009-04-04 10:36:42 UTC (rev 2722) +++ branches/jcl-stack-trace/jcl/source/windows/JclDebug.pas 2009-04-04 18:42:57 UTC (rev 2723) @@ -351,19 +351,28 @@ BinaryFileName: string; // Name of the binary file containing the symbol end; - TJclLocationInfoExValues = set of (lievLocationInfo, lievProcedureStartLocationInfo); + TJclLocationInfoExValues = set of (lievLocationInfo, lievProcedureStartLocationInfo, lievUnitVersionInfo); + TJclLocationInfoList = class; + + { TODO -oUSc : TUnitVersionInfo or TUnitVersion? } TJclLocationInfoEx = class(TPersistent) private FAddress: Pointer; + FBinaryFileName: string; + FDebugInfo: TJclDebugInfoSource; FLineNumber: Integer; FLineNumberOffsetFromProcedureStart: Integer; FModuleName: string; FOffsetFromLineNumber: Integer; FOffsetFromProcName: Integer; + FParent: TJclLocationInfoList; FProcedureName: string; FSourceName: string; FSourceUnitName: string; + {$IFDEF UNITVERSIONING} + FUnitVersion: TUnitVersion; + {$ENDIF UNITVERSIONING} FVAddress: Pointer; FValues: TJclLocationInfoExValues; procedure Fill; @@ -372,11 +381,13 @@ protected procedure AssignTo(Dest: TPersistent); override; public - constructor Create(Address: Pointer); + constructor Create(AParent: TJclLocationInfoList; Address: Pointer); class function CSVHeader: string; property Address: Pointer read FAddress write FAddress; property AsCSVString: string read GetAsCSVString; property AsString: string read GetAsString; + property BinaryFileName: string read FBinaryFileName write FBinaryFileName; + property DebugInfo: TJclDebugInfoSource read FDebugInfo write FDebugInfo; property LineNumber: Integer read FLineNumber write FLineNumber; property LineNumberOffsetFromProcedureStart: Integer read FLineNumberOffsetFromProcedureStart write FLineNumberOffsetFromProcedureStart; property ModuleName: string read FModuleName write FModuleName; @@ -387,13 +398,19 @@ { this is equal to TJclLocationInfo.UnitName, but has been renamed because UnitName is a class function in TObject since Delphi 2009 } property SourceUnitName: string read FSourceUnitName write FSourceUnitName; + {$IFDEF UNITVERSIONING} + property UnitVersion: TUnitVersion read FUnitVersion write FUnitVersion; + {$ENDIF UNITVERSIONING} property VAddress: Pointer read FVAddress write FVAddress; property Values: TJclLocationInfoExValues read FValues write FValues; end; + TJclLocationInfoListOptions = set of (liloAutoGetAddressInfo, liloAutoGetLocationInfo, liloAutoGetUnitVersionInfo); + TJclLocationInfoList = class(TObject) private FItems: TObjectList; + FOptions: TJclLocationInfoListOptions; function GetAsCSVString: string; function GetAsString: string; function GetCount: Integer; @@ -408,6 +425,7 @@ property AsString: string read GetAsString; property Count: Integer read GetCount; property Items[AIndex: Integer]: TJclLocationInfoEx read GetItems; default; + property Options: TJclLocationInfoListOptions read FOptions write FOptions; end; TJclDebugInfoSource = class(TObject) @@ -2775,10 +2793,11 @@ //=== { TJclLocationInfoEx } ================================================= -constructor TJclLocationInfoEx.Create(Address: Pointer); +constructor TJclLocationInfoEx.Create(AParent: TJclLocationInfoList; Address: Pointer); begin inherited Create; FAddress := Address; + FParent := AParent; Fill; end; @@ -2787,6 +2806,8 @@ if Dest is TJclLocationInfoEx then begin TJclLocationInfoEx(Dest).FAddress := FAddress; + TJclLocationInfoEx(Dest).FBinaryFileName := FBinaryFileName; + TJclLocationInfoEx(Dest).FDebugInfo := FDebugInfo; TJclLocationInfoEx(Dest).FLineNumber := FLineNumber; TJclLocationInfoEx(Dest).FLineNumberOffsetFromProcedureStart := FLineNumberOffsetFromProcedureStart; TJclLocationInfoEx(Dest).FModuleName := FModuleName; @@ -2795,6 +2816,9 @@ TJclLocationInfoEx(Dest).FProcedureName := FProcedureName; TJclLocationInfoEx(Dest).FSourceName := FSourceName; TJclLocationInfoEx(Dest).FSourceUnitName := FSourceUnitName; + {$IFDEF UNITVERSIONING} + TJclLocationInfoEx(Dest).FUnitVersion := FUnitVersion; + {$ENDIF UNITVERSIONING} TJclLocationInfoEx(Dest).FVAddress := FVAddress; TJclLocationInfoEx(Dest).FValues := FValues; end @@ -2805,6 +2829,9 @@ class function TJclLocationInfoEx.CSVHeader: string; begin Result := '"VAddress";"ModuleName";"Address";"OffsetFromProcName";"UnitName";"ProcedureName";"SourceName";"LineNumber";"OffsetFromLineNumber";"LineNumberOffsetFromProcedureStart"'; + {$IFDEF UNITVERSIONING} + Result := Result + '"Revision"'; + {$ENDIF UNITVERSIONING} end; procedure TJclLocationInfoEx.Fill; @@ -2812,13 +2839,33 @@ Info, StartProcInfo: TJclLocationInfo; FixedProcedureName: string; Module: HMODULE; + Options: TJclLocationInfoListOptions; + {$IFDEF UNITVERSIONING} + I: Integer; + UnitVersioning: TUnitVersioning; + UnitVersioningModule: TUnitVersioningModule; + {$ENDIF UNITVERSIONING} begin FValues := []; - Module := ModuleFromAddr(FAddress); - FVAddress := Pointer(DWORD_PTR(FAddress) - Module - ModuleCodeOffset); - FModuleName := ExtractFileName(GetModulePath(Module)); - if GetLocationInfo(FAddress, Info) then + Options := []; + if Assigned(FParent) then + Options := FParent.Options; + if liloAutoGetAddressInfo in Options then begin + Module := ModuleFromAddr(FAddress); + FVAddress := Pointer(DWORD_PTR(FAddress) - Module - ModuleCodeOffset); + FModuleName := ExtractFileName(GetModulePath(Module)); + end + else + begin + {$IFDEF UNITVERSIONING} + Module := 0; + {$ENDIF UNITVERSIONING} + FVAddress := nil; + FModuleName := ''; + end; + if (liloAutoGetLocationInfo in Options) and GetLocationInfo(FAddress, Info) then + begin FValues := FValues + [lievLocationInfo]; FOffsetFromProcName := Info.OffsetFromProcName; FSourceUnitName := Info.UnitName; @@ -2840,6 +2887,8 @@ end else FLineNumberOffsetFromProcedureStart := 0; + FDebugInfo := Info.DebugInfo; + FBinaryFileName := Info.BinaryFileName; end else begin @@ -2850,7 +2899,33 @@ FLineNumber := 0; FOffsetFromLineNumber := 0; FLineNumberOffsetFromProcedureStart := 0; + FDebugInfo := nil; + FBinaryFileName := ''; end; + {$IFDEF UNITVERSIONING} + FUnitVersion := nil; + if (liloAutoGetUnitVersionInfo in Options) and (FSourceName <> '') then + begin + if not (liloAutoGetAddressInfo in Options) then + Module := ModuleFromAddr(FAddress); + UnitVersioning := GetUnitVersioning; + for I := 0 to UnitVersioning.ModuleCount - 1 do + begin + UnitVersioningModule := UnitVersioning.Modules[I]; + if UnitVersioningModule.Instance = Module then + begin + FUnitVersion := UnitVersioningModule.FindUnit(FSourceName); + if Assigned(FUnitVersion) then + begin + FValues := FValues + [lievUnitVersionInfo]; + Break; + end; + end; + if lievUnitVersionInfo in FValues then + Break; + end; + end; + {$ENDIF UNITVERSIONING} end; function TJclLocationInfoEx.GetAsCSVString: string; @@ -2883,6 +2958,12 @@ end else S := S + ';"";"";"";"";"";"";""'; + {$IFDEF UNITVERSIONING} + if lievUnitVersionInfo in FValues then + S := S + Format(';"%s"', [UnitVersion.Revision]) + else + S := S + ';""'; + {$ENDIF UNITVERSIONING} Result := S; end; @@ -2949,6 +3030,7 @@ begin inherited Create; FItems := TObjectList.Create; + FOptions := [liloAutoGetAddressInfo, liloAutoGetLocationInfo, liloAutoGetUnitVersionInfo]; end; destructor TJclLocationInfoList.Destroy; @@ -2959,7 +3041,7 @@ function TJclLocationInfoList.Add(Addr: Pointer): TJclLocationInfoEx; begin - FItems.Add(TJclLocationInfoEx.Create(Addr)); + FItems.Add(TJclLocationInfoEx.Create(Self, Addr)); Result := TJclLocationInfoEx(FItems.Last); end; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <usc...@us...> - 2009-04-04 10:36:57
|
Revision: 2722 http://jcl.svn.sourceforge.net/jcl/?rev=2722&view=rev Author: uschuster Date: 2009-04-04 10:36:42 +0000 (Sat, 04 Apr 2009) Log Message: ----------- minor adjustments in the MT test Modified Paths: -------------- branches/jcl-stack-trace/jcl/examples/windows/debug/mttest/JclDebugMTTestMain.pas Added Paths: ----------- branches/jcl-stack-trace/jcl/examples/windows/debug/mttest/JclDebugMTTest.dof Added: branches/jcl-stack-trace/jcl/examples/windows/debug/mttest/JclDebugMTTest.dof =================================================================== --- branches/jcl-stack-trace/jcl/examples/windows/debug/mttest/JclDebugMTTest.dof (rev 0) +++ branches/jcl-stack-trace/jcl/examples/windows/debug/mttest/JclDebugMTTest.dof 2009-04-04 10:36:42 UTC (rev 2722) @@ -0,0 +1,3 @@ +[Directories] +OutputDir=..\..\..\..\bin + Modified: branches/jcl-stack-trace/jcl/examples/windows/debug/mttest/JclDebugMTTestMain.pas =================================================================== --- branches/jcl-stack-trace/jcl/examples/windows/debug/mttest/JclDebugMTTestMain.pas 2009-04-03 18:58:59 UTC (rev 2721) +++ branches/jcl-stack-trace/jcl/examples/windows/debug/mttest/JclDebugMTTestMain.pas 2009-04-04 10:36:42 UTC (rev 2722) @@ -5,8 +5,8 @@ interface uses - Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, - Dialogs, JclDebug, StdCtrls, PSAPI; + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + StdCtrls, PSAPI, JclDebug; type TMTTestForm = class(TForm) @@ -108,7 +108,7 @@ ThreadInfoList: TJclThreadInfoList; ThreadName, ExceptMessage, ExceptInfo: string; begin - if (not (stDisableIfDebuggerPresent in JclStackTrackingOptions) or (not IsDebuggerAttached)) then + if (not (stDisableIfDebuggerAttached in JclStackTrackingOptions) or (not IsDebuggerAttached)) then begin TID := GetCurrentThreadId; ThreadInfoList := TJclThreadInfoList.Create; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <usc...@us...> - 2009-04-03 18:59:01
|
Revision: 2721 http://jcl.svn.sourceforge.net/jcl/?rev=2721&view=rev Author: uschuster Date: 2009-04-03 18:58:59 +0000 (Fri, 03 Apr 2009) Log Message: ----------- removed old IJclLineNumberTranslator interface Modified Paths: -------------- branches/jcl-stack-trace/jcl/TODO.txt branches/jcl-stack-trace/jcl/experts/stackviewer/StackLineNumberTranslator.pas branches/jcl-stack-trace/jcl/experts/stackviewer/StackViewForm.pas Modified: branches/jcl-stack-trace/jcl/TODO.txt =================================================================== --- branches/jcl-stack-trace/jcl/TODO.txt 2009-04-03 18:49:43 UTC (rev 2720) +++ branches/jcl-stack-trace/jcl/TODO.txt 2009-04-03 18:58:59 UTC (rev 2721) @@ -32,7 +32,6 @@ * clean up - use updated TJclFileEnumerator instead of TFileSearcher - - remove IJclLineNumberTranslator stuff in StackLineNumberTranslator.pas - rename some files - MPL headers - UNITVERSIONING \ No newline at end of file Modified: branches/jcl-stack-trace/jcl/experts/stackviewer/StackLineNumberTranslator.pas =================================================================== --- branches/jcl-stack-trace/jcl/experts/stackviewer/StackLineNumberTranslator.pas 2009-04-03 18:49:43 UTC (rev 2720) +++ branches/jcl-stack-trace/jcl/experts/stackviewer/StackLineNumberTranslator.pas 2009-04-03 18:58:59 UTC (rev 2721) @@ -3,21 +3,10 @@ interface uses - Classes, SysUtils, ActiveX, ToolsAPI;//todo remove + Classes, ActiveX; type IJclLineNumberTranslator = interface - ['{864A28E9-5ED2-4386-975B-3F8ECC048074}'] - function GetIDString: string; - function GetName: string; - function TranslateLineNumber(ACurrentContent: IStream; const AFileName, ARevision: string; - ALineNumber: Integer; var ANewLineNumber: Integer): Boolean; - - property Name: string read GetName; - property IDString: string read GetIDString; - end; - - IJclLineNumberTranslator2 = interface ['{01E06940-49AE-464B-AC47-D65DFBC41396}'] function GetIDString: string; function GetName: string; @@ -44,20 +33,16 @@ FNextIndex: Integer; FTranslators: TInterfaceList; function GetCount: Integer; - function GetItems(AIndex: Integer): IJclLineNumberTranslator2; + function GetItems(AIndex: Integer): IJclLineNumberTranslator; public constructor Create; destructor Destroy; override; - function RegisterTranslator(const ATranslator: IJclLineNumberTranslator2): Integer; - { - function TranslateLineNumber(ACurrentContent: IStream; const AFileName, ARevision: string; - ALineNumber: Integer; var ANewLineNumber: Integer): Boolean; - } + function RegisterTranslator(const ATranslator: IJclLineNumberTranslator): Integer; function TranslateLineNumbers(ARevisionContent, ACurrentContent: IStream; ARevisionLineNumbers: TList; ACurrentLineNumbers: TList): Integer; procedure UnregisterTranslator(AIndex: Integer); property Count: Integer read GetCount; - property Items[AIndex: Integer]: IJclLineNumberTranslator2 read GetItems; default; + property Items[AIndex: Integer]: IJclLineNumberTranslator read GetItems; default; end; TJclRevisionProviders = class(TObject) @@ -71,10 +56,6 @@ constructor Create; destructor Destroy; override; function RegisterProvider(const ATranslator: IJclRevisionProvider): Integer; - { - function TranslateLineNumber(ACurrentContent: IStream; const AFileName, ARevision: string; - ALineNumber: Integer; var ANewLineNumber: Integer): Boolean; - } function GetRevisionContent(const AFileName, ARevision: string; AContent: IStream): Boolean; procedure UnregisterProvider(AIndex: Integer); property Count: Integer read GetCount; @@ -85,13 +66,9 @@ LineNumberTranslators: TJclLineNumberTranslators; RevisionProviders: TJclRevisionProviders; -{ -function TranslateLineNumber(ACurrentContent: IStream; const AFileName, ARevision: string; - ALineNumber: Integer; var ANewLineNumber: Integer): Boolean; -} function TranslateLineNumbers(ARevisionContent, ACurrentContent: IStream; ARevisionLineNumbers: TList; ACurrentLineNumbers: TList): Integer; -function RegisterLineNumberTranslator(const ATranslator: IJclLineNumberTranslator2): Integer; +function RegisterLineNumberTranslator(const ATranslator: IJclLineNumberTranslator): Integer; procedure UnregisterLineNumberTranslator(AIndex: Integer); function GetRevisionContent(const AFileName, ARevision: string; AContent: IStream): Boolean; @@ -123,12 +100,12 @@ Result := FTranslators.Count; end; -function TJclLineNumberTranslators.GetItems(AIndex: Integer): IJclLineNumberTranslator2; +function TJclLineNumberTranslators.GetItems(AIndex: Integer): IJclLineNumberTranslator; begin - Result := IJclLineNumberTranslator2(FTranslators[AIndex]); + Result := IJclLineNumberTranslator(FTranslators[AIndex]); end; -function TJclLineNumberTranslators.RegisterTranslator(const ATranslator: IJclLineNumberTranslator2): Integer; +function TJclLineNumberTranslators.RegisterTranslator(const ATranslator: IJclLineNumberTranslator): Integer; begin if Assigned(ATranslator) then begin @@ -141,26 +118,6 @@ Result := -1; end; -{ -function TJclLineNumberTranslators.TranslateLineNumber(ACurrentContent: IStream; const AFileName, ARevision: string; - ALineNumber: Integer; var ANewLineNumber: Integer): Boolean; -var - I: Integer; -begin - Result := False; - //todo remove debug - (BorlandIDEServices as IOTAMessageServices).AddTitleMessage(Format('TranslateLineNumber %s %s %d', [AFileName, ARevision, ALineNumber])); - for I := 0 to Count - 1 do - if Items[I].TranslateLineNumber(ACurrentContent, AFileName, ARevision, ALineNumber, ANewLineNumber) then - begin - Result := True; - Break; - end; - //todo remove debug - (BorlandIDEServices as IOTAMessageServices).AddTitleMessage(Format('TranslateLineNumber %d -> %d', [ALineNumber, ANewLineNumber])); -end; -} - function TJclLineNumberTranslators.TranslateLineNumbers(ARevisionContent, ACurrentContent: IStream; ARevisionLineNumbers: TList; ACurrentLineNumbers: TList): Integer; var @@ -252,20 +209,11 @@ end; end; - -function RegisterLineNumberTranslator(const ATranslator: IJclLineNumberTranslator2): Integer; +function RegisterLineNumberTranslator(const ATranslator: IJclLineNumberTranslator): Integer; begin Result := LineNumberTranslators.RegisterTranslator(ATranslator); end; -{ -function TranslateLineNumber(ACurrentContent: IStream; const AFileName, ARevision: string; - ALineNumber: Integer; var ANewLineNumber: Integer): Boolean; -begin - Result := LineNumberTranslators.TranslateLineNumber(ACurrentContent, AFileName, ARevision, ALineNumber, ANewLineNumber); -end; -} - function TranslateLineNumbers(ARevisionContent, ACurrentContent: IStream; ARevisionLineNumbers: TList; ACurrentLineNumbers: TList): Integer; begin Result := LineNumberTranslators.TranslateLineNumbers(ARevisionContent, ACurrentContent, ARevisionLineNumbers, ACurrentLineNumbers); Modified: branches/jcl-stack-trace/jcl/experts/stackviewer/StackViewForm.pas =================================================================== --- branches/jcl-stack-trace/jcl/experts/stackviewer/StackViewForm.pas 2009-04-03 18:49:43 UTC (rev 2720) +++ branches/jcl-stack-trace/jcl/experts/stackviewer/StackViewForm.pas 2009-04-03 18:58:59 UTC (rev 2721) @@ -356,10 +356,6 @@ RevisionLineNumbers.Free; CurrentLineNumbers.Free; end; - {//todo [old - remove] - if not TranslateLineNumber(Stream, StackViewItem.FileName, StackViewItem.Revision, StackViewItem.LineNumber, NewLineNumber) then - NewLineNumber := 0; - } end; finally FS.Free; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sf...@us...> - 2009-04-03 18:49:46
|
Revision: 2720 http://jcl.svn.sourceforge.net/jcl/?rev=2720&view=rev Author: sfarrow Date: 2009-04-03 18:49:43 +0000 (Fri, 03 Apr 2009) Log Message: ----------- Updates to the latest jcl. Modified Paths: -------------- branches/jcl-msi/jcl/source/common/JclBorlandTools.pas branches/jcl-msi/jcl/source/common/JclCompression.pas branches/jcl-msi/jcl/source/common/JclSimpleXml.pas branches/jcl-msi/jcl/source/windows/JclDebug.pas Property Changed: ---------------- branches/jcl-msi/ branches/jcl-msi/jcl/source/common/zlibh.pas branches/jcl-msi/thirdparty/Windows Installer/ branches/jcl-msi/thirdparty/Windows Installer/Custom Action/ branches/jcl-msi/thirdparty/Windows Installer/Custom Action/JclCustomAction.cbproj branches/jcl-msi/thirdparty/Windows Installer/Custom Action/JclCustomAction.cbproj.local branches/jcl-msi/thirdparty/Windows Installer/Custom Action/JclCustomAction.cpp branches/jcl-msi/thirdparty/Windows Installer/Installer/ branches/jcl-msi/thirdparty/Windows Installer/WiX Binaries/ branches/jcl-msi/thirdparty/jedi_code_format/ Property changes on: branches/jcl-msi ___________________________________________________________________ Added: svn:mergeinfo + /trunk:2709-2719 Modified: branches/jcl-msi/jcl/source/common/JclBorlandTools.pas =================================================================== --- branches/jcl-msi/jcl/source/common/JclBorlandTools.pas 2009-04-02 21:28:10 UTC (rev 2719) +++ branches/jcl-msi/jcl/source/common/JclBorlandTools.pas 2009-04-03 18:49:43 UTC (rev 2720) @@ -5390,7 +5390,7 @@ try EnvOptionsFileName := GetMsBuildEnvOptionsFileName; EnvOptionsFile.LoadFromFile(EnvOptionsFileName); - EnvOptionsFile.Options := EnvOptionsFile.Options + [sxoAutoCreate]; + EnvOptionsFile.Options := EnvOptionsFile.Options + [sxoAutoCreate,sxoDoNotSaveProlog]; PropertyGroupNode := EnvOptionsFile.Root.Items.ItemNamed[MsBuildPropertyGroupNodeName]; PropertyNode := PropertyGroupNode.Items.ItemNamed[OptionName]; Modified: branches/jcl-msi/jcl/source/common/JclCompression.pas =================================================================== --- branches/jcl-msi/jcl/source/common/JclCompression.pas 2009-04-02 21:28:10 UTC (rev 2719) +++ branches/jcl-msi/jcl/source/common/JclCompression.pas 2009-04-03 18:49:43 UTC (rev 2720) @@ -4542,7 +4542,7 @@ AItem := Items[Index]; - if FileName = '' then + if (FileName = '') and not Assigned(AStream) then begin PackedName := AItem.PackedName; Modified: branches/jcl-msi/jcl/source/common/JclSimpleXml.pas =================================================================== --- branches/jcl-msi/jcl/source/common/JclSimpleXml.pas 2009-04-02 21:28:10 UTC (rev 2719) +++ branches/jcl-msi/jcl/source/common/JclSimpleXml.pas 2009-04-03 18:49:43 UTC (rev 2720) @@ -451,7 +451,7 @@ TJclSimpleXML = class(TObject) protected - FEncoding: TJClStringEncoding; + FEncoding: TJclStringEncoding; FFileName: TFileName; FOptions: TJclSimpleXMLOptions; FRoot: TJclSimpleXMLElemClassic; @@ -1140,6 +1140,7 @@ end else AOutStream := Stream; + case Encoding of seAnsi: AStringStream := TJclAnsiStream.Create(AOutStream, False); @@ -1152,6 +1153,12 @@ end; try AStringStream.SkipBOM; + + if AStringStream is TJclAutoStream then + FEncoding := TJclAutoStream(AStringStream).Encoding + else + FEncoding := Encoding; + LoadFromStringStream(AStringStream); finally AStringStream.Free; Property changes on: branches/jcl-msi/jcl/source/common/zlibh.pas ___________________________________________________________________ Deleted: svn:mergeinfo - Modified: branches/jcl-msi/jcl/source/windows/JclDebug.pas =================================================================== --- branches/jcl-msi/jcl/source/windows/JclDebug.pas 2009-04-02 21:28:10 UTC (rev 2719) +++ branches/jcl-msi/jcl/source/windows/JclDebug.pas 2009-04-03 18:49:43 UTC (rev 2720) @@ -781,7 +781,7 @@ type TJclStackTrackingOption = (stStack, stExceptFrame, stRawMode, stAllModules, stStaticModuleList, - stDelayedTrace, stTraceAllExceptions, stMainThreadOnly); + stDelayedTrace, stTraceAllExceptions, stMainThreadOnly, stDisableIfDebuggerAttached); TJclStackTrackingOptions = set of TJclStackTrackingOption; {$IFDEF KEEP_DEPRECATED} @@ -4834,8 +4834,9 @@ procedure DoExceptNotify(ExceptObj: TObject; ExceptAddr: Pointer; OSException: Boolean; BaseOfStack: Pointer); begin - if TrackingActive and Assigned(ExceptObj) and (not IsIgnoredException(ExceptObj.ClassType)) and - (not (stMainThreadOnly in JclStackTrackingOptions) or (GetCurrentThreadId = MainThreadID)) then + if TrackingActive and (not (stDisableIfDebuggerAttached in JclStackTrackingOptions) or (not IsDebuggerAttached)) and + Assigned(ExceptObj) and (not IsIgnoredException(ExceptObj.ClassType)) and + (not (stMainThreadOnly in JclStackTrackingOptions) or (GetCurrentThreadId = MainThreadID)) then begin if stStack in JclStackTrackingOptions then DoExceptionStackTrace(ExceptObj, ExceptAddr, OSException, BaseOfStack); Property changes on: branches/jcl-msi/thirdparty/Windows Installer ___________________________________________________________________ Added: svn:mergeinfo + /trunk/thirdparty/Windows Installer:2709-2719* Property changes on: branches/jcl-msi/thirdparty/Windows Installer/Custom Action ___________________________________________________________________ Added: svn:mergeinfo + /trunk/thirdparty/Windows Installer/Custom Action:2709-2719* Property changes on: branches/jcl-msi/thirdparty/Windows Installer/Custom Action/JclCustomAction.cbproj ___________________________________________________________________ Added: svn:mergeinfo + /trunk/thirdparty/Windows Installer/Custom Action/JclCustomAction.cbproj:2709-2719 Property changes on: branches/jcl-msi/thirdparty/Windows Installer/Custom Action/JclCustomAction.cbproj.local ___________________________________________________________________ Added: svn:mergeinfo + /trunk/thirdparty/Windows Installer/Custom Action/JclCustomAction.cbproj.local:2709-2719 Property changes on: branches/jcl-msi/thirdparty/Windows Installer/Custom Action/JclCustomAction.cpp ___________________________________________________________________ Added: svn:mergeinfo + /trunk/thirdparty/Windows Installer/Custom Action/JclCustomAction.cpp:2709-2719 Property changes on: branches/jcl-msi/thirdparty/Windows Installer/Installer ___________________________________________________________________ Added: svn:mergeinfo + /trunk/thirdparty/Windows Installer/Installer:2709-2719* Property changes on: branches/jcl-msi/thirdparty/Windows Installer/WiX Binaries ___________________________________________________________________ Added: svn:mergeinfo + /trunk/thirdparty/Windows Installer/WiX Binaries:2709-2719* Property changes on: branches/jcl-msi/thirdparty/jedi_code_format ___________________________________________________________________ Deleted: svn:mergeinfo - This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ou...@us...> - 2009-04-03 01:20:48
|
Revision: 2718 http://jcl.svn.sourceforge.net/jcl/?rev=2718&view=rev Author: outchy Date: 2009-04-02 17:46:36 +0000 (Thu, 02 Apr 2009) Log Message: ----------- Support for multiple roots in TJclFileEnumerator. Modified Paths: -------------- branches/jcl-stack-trace/jcl/examples/common/filesearch/FileSearchDemoMain.pas branches/jcl-stack-trace/jcl/source/common/JclFileUtils.pas Modified: branches/jcl-stack-trace/jcl/examples/common/filesearch/FileSearchDemoMain.pas =================================================================== --- branches/jcl-stack-trace/jcl/examples/common/filesearch/FileSearchDemoMain.pas 2009-04-01 23:08:02 UTC (rev 2717) +++ branches/jcl-stack-trace/jcl/examples/common/filesearch/FileSearchDemoMain.pas 2009-04-02 17:46:36 UTC (rev 2718) @@ -148,6 +148,8 @@ end; procedure TFileSearchForm.StartBtnClick(Sender: TObject); +var + RootDirectories: TStrings; begin RootDirInput.Text := PathCanonicalize(RootDirInput.Text); @@ -157,7 +159,13 @@ FFileEnumerator.LastChangeAfterAsString := edLastChangeAfter.Text; if FFileEnumerator.SearchOption[fsLastChangeBefore] then FFileEnumerator.LastChangeBeforeAsString := edLastChangeBefore.Text; - FFileEnumerator.RootDirectory := RootDirInput.Text; + RootDirectories := TStringList.Create; + try + StrToStrings(RootDirInput.Text, DirSeparator, RootDirectories, False); + FFileEnumerator.RootDirectories := RootDirectories; + finally + RootDirectories.Free; + end; FFileEnumerator.FileMask := FileMaskInput.Text; FFileEnumerator.SearchOption[fsMinSize] := cbFileSizeMin.Checked; FFileEnumerator.SearchOption[fsMaxSize] := cbFileSizeMax.Checked; Modified: branches/jcl-stack-trace/jcl/source/common/JclFileUtils.pas =================================================================== --- branches/jcl-stack-trace/jcl/source/common/JclFileUtils.pas 2009-04-01 23:08:02 UTC (rev 2717) +++ branches/jcl-stack-trace/jcl/source/common/JclFileUtils.pas 2009-04-02 17:46:36 UTC (rev 2718) @@ -436,6 +436,7 @@ // property access methods function GetAttributeMask: TJclFileAttributeMask; function GetCaseSensitiveSearch: Boolean; + function GetRootDirectories: TStrings; function GetRootDirectory: string; function GetFileMask: string; function GetFileMasks: TStrings; @@ -456,6 +457,7 @@ function GetOptions: TFileSearchoptions; procedure SetAttributeMask(const Value: TJclFileAttributeMask); procedure SetCaseSensitiveSearch(const Value: Boolean); + procedure SetRootDirectories(const Value: TStrings); procedure SetRootDirectory(const Value: string); procedure SetFileMask(const Value: string); procedure SetFileMasks(const Value: TStrings); @@ -481,6 +483,7 @@ procedure StopAllTasks(Silently: Boolean = False); // Silently: Don't call OnTerminateTask // properties property CaseSensitiveSearch: Boolean read GetCaseSensitiveSearch write SetCaseSensitiveSearch; + property RootDirectories: TStrings read GetRootDirectories write SetRootDirectories; property RootDirectory: string read GetRootDirectory write SetRootDirectory; property FileMask: string read GetFileMask write SetFileMask; property SubDirectoryMask: string read GetSubDirectoryMask write SetSubDirectoryMask; @@ -510,7 +513,7 @@ {$ENDIF ~CLR} FTasks: TList; FFileMasks: TStringList; - FRootDirectory: string; + FRootDirectories: TStringList; FSubDirectoryMask: string; FOnEnterDirectory: TFileHandler; FOnTerminateTask: TFileSearchTerminationEvent; @@ -539,6 +542,7 @@ procedure TaskTerminated(Sender: TObject); // IJclFileEnumerator property access methods function GetAttributeMask: TJclFileAttributeMask; + function GetRootDirectories: TStrings; function GetRootDirectory: string; function GetFileMask: string; function GetFileMasks: TStrings; @@ -558,6 +562,7 @@ function GetOnEnterDirectory: TFileHandler; function GetOnTerminateTask: TFileSearchTerminationEvent; procedure SetAttributeMask(const Value: TJclFileAttributeMask); + procedure SetRootDirectories(const Value: TStrings); procedure SetRootDirectory(const Value: string); procedure SetFileMask(const Value: string); procedure SetFileMasks(const Value: TStrings); @@ -600,7 +605,8 @@ property CaseSensitiveSearch: Boolean read GetCaseSensitiveSearch write SetCaseSensitiveSearch default {$IFDEF MSWINDOWS} False {$ELSE} True {$ENDIF}; property FileMasks: TStrings read GetFileMasks write SetFileMasks; - property RootDirectory: string read FRootDirectory write FRootDirectory; + property RootDirectories: TStrings read GetRootDirectories write SetRootDirectories; + property RootDirectory: string read GetRootDirectory write SetRootDirectory; property SubDirectoryMask: string read FSubDirectoryMask write FSubDirectoryMask; property AttributeMask: TJclFileAttributeMask read FAttributeMask write SetAttributeMask; property FileSizeMin: Int64 read FFileSizeMin write FFileSizeMin; @@ -6264,7 +6270,8 @@ private FID: TFileSearchTaskID; FFileMasks: TStringList; - FDirectory: string; + FDirectories: TStrings; + FCurrentDirectory: string; FSubDirectoryMask: string; FOnEnterDirectory: TFileHandler; FFileHandlerEx: TFileHandlerEx; @@ -6289,7 +6296,9 @@ procedure SyncProcessDirectory(const Directory: string); procedure AsyncProcessFile(const Directory: string; const FileInfo: TSearchRec); procedure SyncProcessFile(const Directory: string; const FileInfo: TSearchRec); + function GetDirectories: TStrings; function GetFileMasks: TStrings; + procedure SetDirectories(const Value: TStrings); procedure SetFileMasks(const Value: TStrings); protected procedure DoTerminate; override; @@ -6304,7 +6313,7 @@ property FileMasks: TStrings read GetFileMasks write SetFileMasks; property FileSizeMin: Int64 read FFileSizeMin write FFileSizeMin; property FileSizeMax: Int64 read FFileSizeMax write FFileSizeMax; - property Directory: string read FDirectory write FDirectory; + property Directories: TStrings read GetDirectories write SetDirectories; property IncludeSubDirectories: Boolean read FIncludeSubDirectories write FIncludeSubDirectories; property IncludeHiddenSubDirectories: Boolean @@ -6328,6 +6337,7 @@ constructor TEnumFileThread.Create; begin inherited Create(True); + FDirectories := TStringList.Create; FFileMasks := TStringList.Create; FFileTimeMin := Low(FFileInfo.Time); FFileTimeMax := High(FFileInfo.Time); @@ -6353,10 +6363,13 @@ destructor TEnumFileThread.Destroy; begin FFileMasks.Free; + FDirectories.Free; inherited Destroy; end; procedure TEnumFileThread.Execute; +var + Index: Integer; begin if SynchronizationMode = smPerDirectory then begin @@ -6370,10 +6383,16 @@ end; if FIncludeSubDirectories then - EnumDirectories(Directory, FInternalDirHandler, FIncludeHiddenSubDirectories, - FSubDirectoryMask, {$IFDEF CLR}TObject(Terminated){$ELSE}@Terminated{$ENDIF}) + begin + for Index := 0 to FDirectories.Count - 1 do + EnumDirectories(FDirectories.Strings[Index], FInternalDirHandler, FIncludeHiddenSubDirectories, + FSubDirectoryMask, {$IFDEF CLR}TObject(Terminated){$ELSE}@Terminated{$ENDIF}) + end else - FInternalDirHandler(CanonicalizedSearchPath(Directory)); + begin + for Index := 0 to FDirectories.Count - 1 do + FInternalDirHandler(CanonicalizedSearchPath(FDirectories.Strings[Index])); + end; end; procedure TEnumFileThread.DoTerminate; @@ -6384,7 +6403,7 @@ procedure TEnumFileThread.EnterDirectory; begin - FOnEnterDirectory(Directory); + FOnEnterDirectory(FCurrentDirectory); end; procedure TEnumFileThread.ProcessDirectory; @@ -6396,7 +6415,7 @@ procedure TEnumFileThread.AsyncProcessDirectory(const Directory: string); begin - FDirectory := Directory; + FCurrentDirectory := Directory; if Assigned(FOnEnterDirectory) then Synchronize(EnterDirectory); ProcessDirFiles; @@ -6404,13 +6423,13 @@ procedure TEnumFileThread.SyncProcessDirectory(const Directory: string); begin - FDirectory := Directory; + FCurrentDirectory := Directory; Synchronize(ProcessDirectory); end; procedure TEnumFileThread.ProcessDirFiles; begin - EnumFiles(Directory + '*', FInternalFileHandler, FRejectedAttr, FRequiredAttr, + EnumFiles(FCurrentDirectory + '*', FInternalFileHandler, FRejectedAttr, FRequiredAttr, {$IFDEF CLR}TObject(Terminated){$ELSE}@Terminated{$ENDIF}); end; @@ -6443,9 +6462,9 @@ procedure TEnumFileThread.ProcessFile; begin if Assigned(FFileHandlerEx) then - FFileHandlerEx(Directory, FFileInfo) + FFileHandlerEx(FCurrentDirectory, FFileInfo) else - FFileHandler(Directory + FFileInfo.Name); + FFileHandler(FCurrentDirectory + FFileInfo.Name); end; procedure TEnumFileThread.AsyncProcessFile(const Directory: string; const FileInfo: TSearchRec); @@ -6462,11 +6481,21 @@ Synchronize(ProcessFile); end; +function TEnumFileThread.GetDirectories: TStrings; +begin + Result := FDirectories; +end; + function TEnumFileThread.GetFileMasks: TStrings; begin Result := FFileMasks; end; +procedure TEnumFileThread.SetDirectories(const Value: TStrings); +begin + FDirectories.Assign(Value); +end; + procedure TEnumFileThread.SetFileMasks(const Value: TStrings); var I: Integer; @@ -6491,7 +6520,8 @@ inherited Create; FTasks := TList.Create; FAttributeMask := TJclFileAttributeMask.Create; - FRootDirectory := '.'; + FRootDirectories := TStringList.Create; + FRootDirectories.Add('.'); FFileMasks := TStringList.Create; FFileMasks.Add('*'); FSubDirectoryMask := '*'; @@ -6514,6 +6544,7 @@ FTasks.Free; FAttributeMask.Free; FFileMasks.Free; + FRootDirectories.Free; inherited Destroy; end; @@ -6589,7 +6620,7 @@ Task.FID := NextTaskID; Task.CaseSensitiveSearch := FCaseSensitiveSearch; Task.FileMasks := FileMasks; - Task.Directory := RootDirectory; + Task.Directories := RootDirectories; Task.RejectedAttr := AttributeMask.Rejected; Task.RequiredAttr := AttributeMask.Required; Task.IncludeSubDirectories := IncludeSubDirectories; @@ -6738,9 +6769,17 @@ Result := FCaseSensitiveSearch; end; +function TJclFileEnumerator.GetRootDirectories: TStrings; +begin + Result := FRootDirectories; +end; + function TJclFileEnumerator.GetRootDirectory: string; begin - Result := FRootDirectory; + if FRootDirectories.Count = 1 then + Result := FRootDirectories.Strings[0] + else + Result := ''; end; function TJclFileEnumerator.GetFileMask: string; @@ -6828,9 +6867,15 @@ FCaseSensitiveSearch := Value; end; +procedure TJclFileEnumerator.SetRootDirectories(const Value: TStrings); +begin + FRootDirectories.Assign(Value); +end; + procedure TJclFileEnumerator.SetRootDirectory(const Value: string); begin - FRootDirectory := Value; + FRootDirectories.Clear; + FRootDirectories.Add(Value); end; procedure TJclFileEnumerator.SetFileMask(const Value: string); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <usc...@us...> - 2009-04-02 21:28:15
|
Revision: 2719 http://jcl.svn.sourceforge.net/jcl/?rev=2719&view=rev Author: uschuster Date: 2009-04-02 21:28:10 +0000 (Thu, 02 Apr 2009) Log Message: ----------- added promised todo Added Paths: ----------- branches/jcl-stack-trace/jcl/TODO.txt Added: branches/jcl-stack-trace/jcl/TODO.txt =================================================================== --- branches/jcl-stack-trace/jcl/TODO.txt (rev 0) +++ branches/jcl-stack-trace/jcl/TODO.txt 2009-04-02 21:28:10 UTC (rev 2719) @@ -0,0 +1,38 @@ +JclDebug +-------- +* (Florent) TJclLocationInfoEx should replace TJclLocationInfo + +* extending TJclThreadInfoList.Gather to exclude a set of threads or to include a set of threads + (multiple functions to make things more clear) + +* ? merge TJclDebugThreadInfo/TJclDebugThreadList and TJclThreadInfo/TJclThreadInfoList + - investigate if the stack can stay a TJclStackInfoList and if the location information can be retrieved later correctly + + +Expert +------ +* storing the layout + - e.g. settings of the stack listviews + - should go into the desktop layout and not into the expert settings? + +* serialization + - saving/loading + - which classes for the viewer? + (for exam. JclDebug.TJclModuleInfoList vs. JclDebugStackUtils.TModuleList; + TJclModuleInfoList doesn't store the module name, because + this can be get from the handle which doesn't work in the viewer) + +* Revision property + - Integration UNITVERSIONING into TJclLocationInfoEx, but also adding an option to use the version info of a module binary as revision + +* progress for TfrmStackView.PrepareStack + (getting revisions for a real SCM system can take some time) + +* icon's + +* clean up + - use updated TJclFileEnumerator instead of TFileSearcher + - remove IJclLineNumberTranslator stuff in StackLineNumberTranslator.pas + - rename some files + - MPL headers + - UNITVERSIONING \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <usc...@us...> - 2009-04-01 23:08:18
|
Revision: 2717 http://jcl.svn.sourceforge.net/jcl/?rev=2717&view=rev Author: uschuster Date: 2009-04-01 23:08:02 +0000 (Wed, 01 Apr 2009) Log Message: ----------- initial checkin (there is still a lot to do and details follow in the near future in a text file) Modified Paths: -------------- branches/jcl-stack-trace/jcl/source/windows/JclDebug.pas Added Paths: ----------- branches/jcl-stack-trace/jcl/examples/windows/debug/mttest/ branches/jcl-stack-trace/jcl/examples/windows/debug/mttest/JclDebugMTTest.dpr branches/jcl-stack-trace/jcl/examples/windows/debug/mttest/JclDebugMTTestMain.dfm branches/jcl-stack-trace/jcl/examples/windows/debug/mttest/JclDebugMTTestMain.pas branches/jcl-stack-trace/jcl/experts/stackviewer/ branches/jcl-stack-trace/jcl/experts/stackviewer/ExceptInfoFrame.dfm branches/jcl-stack-trace/jcl/experts/stackviewer/ExceptInfoFrame.pas branches/jcl-stack-trace/jcl/experts/stackviewer/ExceptionViewerOptionsUnit.pas branches/jcl-stack-trace/jcl/experts/stackviewer/FileSearcherUnit.pas branches/jcl-stack-trace/jcl/experts/stackviewer/JclDebugIdeIcon.res branches/jcl-stack-trace/jcl/experts/stackviewer/JclDebugStackUtils.pas branches/jcl-stack-trace/jcl/experts/stackviewer/JclSIMDIcon.dcr branches/jcl-stack-trace/jcl/experts/stackviewer/JclStackTraceViewerExpert.dpk branches/jcl-stack-trace/jcl/experts/stackviewer/JclStackTraceViewerExpert.rc branches/jcl-stack-trace/jcl/experts/stackviewer/JclStackTraceViewerExpert.res branches/jcl-stack-trace/jcl/experts/stackviewer/ModuleFrame.dfm branches/jcl-stack-trace/jcl/experts/stackviewer/ModuleFrame.pas branches/jcl-stack-trace/jcl/experts/stackviewer/StackCodeUtils.pas branches/jcl-stack-trace/jcl/experts/stackviewer/StackFrame.dfm branches/jcl-stack-trace/jcl/experts/stackviewer/StackFrame.pas branches/jcl-stack-trace/jcl/experts/stackviewer/StackFrame2.dfm branches/jcl-stack-trace/jcl/experts/stackviewer/StackFrame2.pas branches/jcl-stack-trace/jcl/experts/stackviewer/StackLineNumberTranslator.pas branches/jcl-stack-trace/jcl/experts/stackviewer/StackTraceViewerConfigFrame.dfm branches/jcl-stack-trace/jcl/experts/stackviewer/StackTraceViewerConfigFrame.pas branches/jcl-stack-trace/jcl/experts/stackviewer/StackTraceViewerImpl.pas branches/jcl-stack-trace/jcl/experts/stackviewer/StackViewForm.dfm branches/jcl-stack-trace/jcl/experts/stackviewer/StackViewForm.pas branches/jcl-stack-trace/jcl/experts/stackviewer/StackViewUnit.pas branches/jcl-stack-trace/jcl/experts/stackviewer/ThreadFrame.dfm branches/jcl-stack-trace/jcl/experts/stackviewer/ThreadFrame.pas Property changes on: branches/jcl-stack-trace/jcl/examples/windows/debug/mttest ___________________________________________________________________ Added: tsvn:projectlanguage + 1033 Added: bugtraq:url + http://homepages.codegear.com/jedi/issuetracker/view.php?id=%BUGID% Added: bugtraq:message + (Mantis #%BUGID%) Added: bugtraq:logregex + [Mm]antis #?(\d+)(,? ?#?(\d+))+ (\d+) Added: branches/jcl-stack-trace/jcl/examples/windows/debug/mttest/JclDebugMTTest.dpr =================================================================== --- branches/jcl-stack-trace/jcl/examples/windows/debug/mttest/JclDebugMTTest.dpr (rev 0) +++ branches/jcl-stack-trace/jcl/examples/windows/debug/mttest/JclDebugMTTest.dpr 2009-04-01 23:08:02 UTC (rev 2717) @@ -0,0 +1,13 @@ +program JclDebugMTTest; + +uses + Forms, + JclDebugMTTestMain in 'JclDebugMTTestMain.pas' {MTTestForm}; + +{$R *.res} + +begin + Application.Initialize; + Application.CreateForm(TMTTestForm, MTTestForm); + Application.Run; +end. Added: branches/jcl-stack-trace/jcl/examples/windows/debug/mttest/JclDebugMTTestMain.dfm =================================================================== --- branches/jcl-stack-trace/jcl/examples/windows/debug/mttest/JclDebugMTTestMain.dfm (rev 0) +++ branches/jcl-stack-trace/jcl/examples/windows/debug/mttest/JclDebugMTTestMain.dfm 2009-04-01 23:08:02 UTC (rev 2717) @@ -0,0 +1,36 @@ +object MTTestForm: TMTTestForm + Left = 399 + Top = 375 + Width = 325 + Height = 159 + Caption = 'JclDebug MT Test' + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = False + Position = poScreenCenter + OnCreate = FormCreate + PixelsPerInch = 96 + TextHeight = 13 + object Button1: TButton + Left = 8 + Top = 8 + Width = 225 + Height = 25 + Caption = 'Thread Exception Test (requires 2009)' + TabOrder = 0 + OnClick = Button1Click + end + object Button3: TButton + Left = 8 + Top = 40 + Width = 225 + Height = 25 + Caption = 'Show Thread Snapshot' + TabOrder = 1 + OnClick = Button3Click + end +end Added: branches/jcl-stack-trace/jcl/examples/windows/debug/mttest/JclDebugMTTestMain.pas =================================================================== --- branches/jcl-stack-trace/jcl/examples/windows/debug/mttest/JclDebugMTTestMain.pas (rev 0) +++ branches/jcl-stack-trace/jcl/examples/windows/debug/mttest/JclDebugMTTestMain.pas 2009-04-01 23:08:02 UTC (rev 2717) @@ -0,0 +1,199 @@ +unit JclDebugMTTestMain; + +{$I jcl.inc} + +interface + +uses + Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, + Dialogs, JclDebug, StdCtrls, PSAPI; + +type + TMTTestForm = class(TForm) + Button1: TButton; + Button3: TButton; + procedure Button1Click(Sender: TObject); + procedure Button3Click(Sender: TObject); + procedure FormCreate(Sender: TObject); + private + { Private declarations } + public + { Public declarations } + end; + +var + MTTestForm: TMTTestForm; + +implementation + +{$R *.dfm} + +function CSVEncode(const AStr: string): string; +begin + Result := '"' + StringReplace(AStr, '"', '""', [rfReplaceAll]) + '"'; +end; + +procedure LoadedModules(ModuleList: TStrings); +var + I: Integer; + Modules: array of DWORD; + BytesNeeded: DWORD; + ModuleCount: Integer; + ProcessHandle: THandle; + FileName: array [0..Max_Path] of Char; + S: string; +begin + ProcessHandle := GetCurrentProcess; + SetLength(Modules, 1); + EnumProcessModules(ProcessHandle, @Modules[0], 1, BytesNeeded); + ModuleCount := BytesNeeded div SizeOf(DWORD); + SetLength(Modules, ModuleCount); + EnumProcessModules(ProcessHandle, @Modules[0], BytesNeeded, BytesNeeded); + ModuleList.Add('Handle;FileName'); + for I := 0 to ModuleCount - 1 do + begin + GetModuleFileNameEx(ProcessHandle, Modules[I], FileName, SizeOf(FileName)); + S := Format('"0x%.8x";%s', [Modules[I], CSVEncode(ExtractFileName(FileName))]); + ModuleList.Add(S); + end; +end; + +procedure SaveExceptInfo(AExceptObj: TObject; AThreadInfoList: TJclThreadInfoList); +var + StackInfo, DetailSL: TStringList; +begin + StackInfo := TStringList.Create; + try + StackInfo.Add('Type;Data'); + if AExceptObj is Exception then + begin + DetailSL := TStringList.Create; + try + DetailSL.Add('ClassName;Message'); + DetailSL.Add(CSVEncode(Exception(AExceptObj).ClassName) + ';' + CSVEncode(Exception(AExceptObj).Message)); + StackInfo.Add('"Exception";' + CSVEncode(DetailSL.Text)); + finally + DetailSL.Free; + end; + end; + StackInfo.Add('"ThreadInfo";' + CSVEncode(AThreadInfoList.AsCSVString)); + DetailSL := TStringList.Create; + try + LoadedModules(DetailSL); + StackInfo.Add('"Modules";' + CSVEncode(DetailSL.Text)); + finally + DetailSL.Free; + end; + StackInfo.SaveToFile('ExceptInfo.csv'); + finally + StackInfo.Free; + end; +end; + +type + TCrashThread = class(TThread) + public + procedure Execute; override; + end; + +procedure TCrashThread.Execute; +begin + Sleep(5000); + raise Exception.Create('TestException'); +end; + +procedure ExceptionAcquiredProc(AObj: TObject); +var + TID: DWORD; + ThreadInfoList: TJclThreadInfoList; + ThreadName, ExceptMessage, ExceptInfo: string; +begin + if (not (stDisableIfDebuggerPresent in JclStackTrackingOptions) or (not IsDebuggerAttached)) then + begin + TID := GetCurrentThreadId; + ThreadInfoList := TJclThreadInfoList.Create; + try + ThreadInfoList.Add.FillFromExceptThread(ThreadInfoList.GatherOptions); + ThreadInfoList.Gather(TID); + + ThreadName := ThreadInfoList[0].Name; + if tioIsMainThread in ThreadInfoList[0].Values then + ThreadName := '[MainThread]' + else + ThreadName := ThreadInfoList[0].Name; + //ExceptInfo := ThreadInfoList.AsCSVString; + ExceptInfo := ThreadInfoList.AsString; + SaveExceptInfo(AObj, ThreadInfoList); + finally + ThreadInfoList.Free; + end; + ExceptMessage := Exception(AObj).Message; + MessageBox(0, PChar(ExceptMessage + #13#10#13#10 + ExceptInfo), PChar(Format('Exception in Thread %d%s', [TID, ThreadName])), MB_OK); + end; +end; + +procedure TMTTestForm.Button1Click(Sender: TObject); +begin + {$IFDEF COMPILER12_UP} + ExceptionAcquired := @ExceptionAcquiredProc; + {$ELSE} + raise Exception.Create('This is not supported by your Delphi version!'); + {$ENDIF COMPILER12_UP} + TCrashThread.Create(False); +end; + +type + TLoopSleepThread = class(TThread) + public + procedure Execute; override; + end; + +procedure TLoopSleepThread.Execute; +begin + while True do + begin + Sleep(100); + Sleep(100); + Sleep(100); + Sleep(100); + Sleep(100); + Sleep(100); + Sleep(100); + Sleep(100); + Sleep(100); + Sleep(100); + end; +end; + +procedure TMTTestForm.Button3Click(Sender: TObject); +var + TID: DWORD; + ThreadInfoList: TJclThreadInfoList; + ThreadInfo: string; +begin + TLoopSleepThread.Create(False); + Sleep(100); + TLoopSleepThread.Create(False); + Sleep(100); + TLoopSleepThread.Create(False); + Sleep(100); + TID := GetCurrentThreadId; + ThreadInfoList := TJclThreadInfoList.Create; + try + ThreadInfoList.Gather(TID); + //ExceptInfo := ThreadInfoList.AsCSVString; + ThreadInfo := ThreadInfoList.AsString; + finally + ThreadInfoList.Free; + end; + MessageBox(0, PChar(ThreadInfo), 'Thread info (except current thread)', MB_OK); +end; + +procedure TMTTestForm.FormCreate(Sender: TObject); +begin + JclStartExceptionTracking; + JclDebugThreadList.SaveCreationStack := True; + JclHookThreads; +end; + +end. Property changes on: branches/jcl-stack-trace/jcl/experts/stackviewer ___________________________________________________________________ Added: tsvn:projectlanguage + 1033 Added: bugtraq:url + http://homepages.codegear.com/jedi/issuetracker/view.php?id=%BUGID% Added: bugtraq:message + (Mantis #%BUGID%) Added: bugtraq:logregex + [Mm]antis #?(\d+)(,? ?#?(\d+))+ (\d+) Added: branches/jcl-stack-trace/jcl/experts/stackviewer/ExceptInfoFrame.dfm =================================================================== --- branches/jcl-stack-trace/jcl/experts/stackviewer/ExceptInfoFrame.dfm (rev 0) +++ branches/jcl-stack-trace/jcl/experts/stackviewer/ExceptInfoFrame.dfm 2009-04-01 23:08:02 UTC (rev 2717) @@ -0,0 +1,35 @@ +object frmException: TfrmException + Left = 0 + Top = 0 + Width = 320 + Height = 240 + TabOrder = 0 + object Label1: TLabel + Left = 3 + Top = 3 + Width = 56 + Height = 13 + Caption = 'ClassName:' + end + object Label2: TLabel + Left = 3 + Top = 22 + Width = 46 + Height = 13 + Caption = 'Message:' + end + object lbExceptionClassName: TLabel + Left = 65 + Top = 3 + Width = 9 + Height = 13 + Caption = ' ' + end + object lbExceptionMessage: TLabel + Left = 65 + Top = 22 + Width = 9 + Height = 13 + Caption = ' ' + end +end Added: branches/jcl-stack-trace/jcl/experts/stackviewer/ExceptInfoFrame.pas =================================================================== --- branches/jcl-stack-trace/jcl/experts/stackviewer/ExceptInfoFrame.pas (rev 0) +++ branches/jcl-stack-trace/jcl/experts/stackviewer/ExceptInfoFrame.pas 2009-04-01 23:08:02 UTC (rev 2717) @@ -0,0 +1,45 @@ +unit ExceptInfoFrame; + +interface + +uses + Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, + Dialogs, StdCtrls, JclDebugStackUtils; + +type + TfrmException = class(TFrame) + Label1: TLabel; + Label2: TLabel; + lbExceptionClassName: TLabel; + lbExceptionMessage: TLabel; + private + FException: TException; + procedure SetException(const Value: TException); + { Private declarations } + public + { Public declarations } + property Exception: TException read FException write SetException; + end; + +implementation + +{$R *.dfm} + +{ TfrmException } + +procedure TfrmException.SetException(const Value: TException); +begin + FException := Value; + if Assigned(FException) then + begin + lbExceptionClassName.Caption := FException.ExceptionClassName; + lbExceptionMessage.Caption := FException.ExceptionMessage; + end + else + begin + lbExceptionClassName.Caption := ''; + lbExceptionMessage.Caption := ''; + end; +end; + +end. Added: branches/jcl-stack-trace/jcl/experts/stackviewer/ExceptionViewerOptionsUnit.pas =================================================================== --- branches/jcl-stack-trace/jcl/experts/stackviewer/ExceptionViewerOptionsUnit.pas (rev 0) +++ branches/jcl-stack-trace/jcl/experts/stackviewer/ExceptionViewerOptionsUnit.pas 2009-04-01 23:08:02 UTC (rev 2717) @@ -0,0 +1,39 @@ +unit ExceptionViewerOptionsUnit; + +interface + +uses + Classes; + +type + TExceptionViewerOption = class(TPersistent) + private + FExpandTreeView: Boolean; + protected + procedure AssignTo(Dest: TPersistent); override; + public + constructor Create; + property ExpandTreeView: Boolean read FExpandTreeView write FExpandTreeView; + end; + +implementation + +{ TExceptionViewerOption } + +constructor TExceptionViewerOption.Create; +begin + inherited Create; + FExpandTreeView := False; +end; + +procedure TExceptionViewerOption.AssignTo(Dest: TPersistent); +begin + if Dest is TExceptionViewerOption then + begin + TExceptionViewerOption(Dest).FExpandTreeView := ExpandTreeView; + end + else + inherited AssignTo(Dest); +end; + +end. Added: branches/jcl-stack-trace/jcl/experts/stackviewer/FileSearcherUnit.pas =================================================================== --- branches/jcl-stack-trace/jcl/experts/stackviewer/FileSearcherUnit.pas (rev 0) +++ branches/jcl-stack-trace/jcl/experts/stackviewer/FileSearcherUnit.pas 2009-04-01 23:08:02 UTC (rev 2717) @@ -0,0 +1,154 @@ +unit FileSearcherUnit; + +interface + +uses + SysUtils, Classes, Contnrs, JclFileUtils; + +type + TFileSearchItem = class(TObject) + private + FName: string; + FResults: TStringList; + public + constructor Create(const AName: string); + destructor Destroy; override; + property Name: string read FName; + property Results: TStringList read FResults; + end; + + TFileSearcher = class(TObject) + private + FFiles: TObjectList; + FSearchPaths: TStringList; + function GetCount: Integer; + function GetItems(AIndex: Integer): TFileSearchItem; + public + constructor Create; + destructor Destroy; override; + function Add(const AName: string): TFileSearchItem; + procedure Clear; + procedure Delete(AIndex: Integer); + function IndexOf(const AName: string): Integer; + procedure Search; + property Count: Integer read GetCount; + property Items[AIndex: Integer]: TFileSearchItem read GetItems; default; + property SearchPaths: TStringList read FSearchPaths; + end; + +implementation + +{ TFileSearcher } + +constructor TFileSearcher.Create; +begin + inherited Create; + FFiles := TObjectList.Create; + FSearchPaths := TStringList.Create; +end; + +destructor TFileSearcher.Destroy; +begin + FSearchPaths.Free; + FFiles.Free; + inherited Destroy; +end; + +function TFileSearcher.Add(const AName: string): TFileSearchItem; +begin + FFiles.Add(TFileSearchItem.Create(AName)); + Result := TFileSearchItem(FFiles.Last); +end; + +procedure TFileSearcher.Clear; +begin + FFiles.Clear; +end; + +procedure TFileSearcher.Delete(AIndex: Integer); +begin + FFiles.Delete(AIndex); +end; + +function TFileSearcher.GetCount: Integer; +begin + Result := FFiles.Count; +end; + +function TFileSearcher.GetItems(AIndex: Integer): TFileSearchItem; +begin + Result := TFileSearchItem(FFiles[AIndex]); +end; + +function TFileSearcher.IndexOf(const AName: string): Integer; +var + I: Integer; +begin + Result := -1; + for I := 0 to Count - 1 do + if Items[I].Name = AName then + begin + Result := I; + Break; + end; +end; + +procedure TFileSearcher.Search; +var + I, Idx: Integer; + FastIndexList: TStringList; + FS: TFileSearchItem; + Path: string; + sr: TSearchRec; + re: Integer; +begin + if (Count > 0) then + begin + for I := 0 to Count - 1 do + Items[I].Results.Clear; + if FSearchPaths.Count > 0 then + begin + FastIndexList := TStringList.Create; + try + FastIndexList.Sorted := True; + for I := 0 to Count - 1 do + FastIndexList.AddObject(Items[I].Name, Items[I]); + for I := 0 to FSearchPaths.Count - 1 do + begin + Path := PathAddSeparator(FSearchPaths[I]); + re := FindFirst(Path + '*.*', faAnyFile - faDirectory, sr); + while re = 0 do + begin + Idx := FastIndexList.IndexOf(sr.Name); + if Idx <> -1 then + begin + FS := TFileSearchItem(FastIndexList.Objects[Idx]); + FS.Results.Add(Path + sr.Name); + end; + re := FindNext(sr); + end; + FindClose(sr); + end; + finally + FastIndexList.Free; + end; + end; + end; +end; + +{ TFileSearchItem } + +constructor TFileSearchItem.Create(const AName: string); +begin + inherited Create; + FResults := TStringList.Create; + FName := AName; +end; + +destructor TFileSearchItem.Destroy; +begin + FResults.Free; + inherited Destroy; +end; + +end. Added: branches/jcl-stack-trace/jcl/experts/stackviewer/JclDebugIdeIcon.res =================================================================== (Binary files differ) Property changes on: branches/jcl-stack-trace/jcl/experts/stackviewer/JclDebugIdeIcon.res ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Added: branches/jcl-stack-trace/jcl/experts/stackviewer/JclDebugStackUtils.pas =================================================================== --- branches/jcl-stack-trace/jcl/experts/stackviewer/JclDebugStackUtils.pas (rev 0) +++ branches/jcl-stack-trace/jcl/experts/stackviewer/JclDebugStackUtils.pas 2009-04-01 23:08:02 UTC (rev 2717) @@ -0,0 +1,651 @@ +unit JclDebugStackUtils; + +interface + +uses + Windows, SysUtils, Classes, Contnrs, JclDebug; + +type + TStackItem = class(TPersistent) + private + FSourceUnitName: string; + FSourceName: string; + FLineNumber: Integer; + FProcedureName: string; + FModuleName: string; + protected + procedure AssignTo(Dest: TPersistent); override; + public + property ModuleName: string read FModuleName write FModuleName; + property ProcedureName: string read FProcedureName write FProcedureName; + property SourceUnitName: string read FSourceUnitName write FSourceUnitName; + property SourceName: string read FSourceName write FSourceName; + property LineNumber: Integer read FLineNumber write FLineNumber; + end; + + TThreadInfoStack = class(TObject) + private + FItems: TObjectList; + function GetCount: Integer; + function GetItems(AIndex: Integer): TStackItem; + public + constructor Create; + destructor Destroy; override; + procedure LoadFromString(AInString: string); + property Count: Integer read GetCount; + property Items[AIndex: Integer]: TStackItem read GetItems; default; + end; + + TThreadInfo = class(TObject) + private + FThreadID: DWORD; + FStack: TThreadInfoStack; + public + constructor Create; + destructor Destroy; override; + property ThreadID: DWORD read FThreadID write FThreadID; + property Stack: TThreadInfoStack read FStack; + end; + + { + TThreadInfoList = class(TObject) + private + FItems: TObjectList; + FCount: Integer; + function GetItems(AIndex: Integer): TThreadInfo; + function GetCount: Integer; + public + constructor Create; + destructor Destroy; override; + procedure LoadFromString(AInString: string); + property Count: Integer read GetCount; + property Items[AIndex: Integer]: TThreadInfo read GetItems; default; + end; + } + + TThreadInfoList = class(TJclThreadInfoList) + private + procedure LoadStackFromString(AStack: TJclLocationInfoList; AInString: string); + public + procedure LoadFromString(AInString: string); + end; + + TException = class(TObject) + private + FExceptionClassName: string; + FExceptionMessage: string; + public + procedure Clear; + procedure LoadFromString(AInString: string); + property ExceptionClassName: string read FExceptionClassName write FExceptionClassName; + property ExceptionMessage: string read FExceptionMessage write FExceptionMessage; + end; + + TModule = class(TObject) + private + FHandleStr: string; + FModuleName: string; + public + property HandleStr: string read FHandleStr write FHandleStr; + property ModuleName: string read FModuleName write FModuleName; + end; + + TModuleList = class(TObject) + private + FItems: TObjectList; + function GetCount: Integer; + function GetItems(AIndex: Integer): TModule; + public + constructor Create; + destructor Destroy; override; + procedure Clear; + procedure LoadFromString(AInString: string); + property Count: Integer read GetCount; + property Items[AIndex: Integer]: TModule read GetItems; default; + end; + + TExceptionInfo = class(TObject) + private + FException: TException; + FThreadInfoList: TThreadInfoList; + FModules: TModuleList; + public + constructor Create; + destructor Destroy; override; + procedure LoadFromString(AInString: string); + property ThreadInfoList: TThreadInfoList read FThreadInfoList; + property Exception: TException read FException; + property Modules: TModuleList read FModules; + end; + +implementation + +type + TCSVValue = class(TObject) + Value: string; + end; + + TCSVRecord = class(TObject) + private + FItems: TObjectList; + function GetCount: Integer; + function GetItems(AIndex: Integer): TCSVValue; + public + constructor Create; + destructor Destroy; override; + function Add: TCSVValue; + procedure Clear; + property Count: Integer read GetCount; + property Items[AIndex: Integer]: TCSVValue read GetItems; default; + end; + + TCSVFile = class(TObject) + private + FItems: TObjectList; + function GetCount: Integer; + function GetItems(AIndex: Integer): TCSVRecord; + public + constructor Create; + destructor Destroy; override; + function Add: TCSVRecord; + procedure LoadFromString(AInString: string); + property Count: Integer read GetCount; + property Items[AIndex: Integer]: TCSVRecord read GetItems; default; + end; + +{ TCSVRecord } + +function TCSVRecord.Add: TCSVValue; +begin + FItems.Add(TCSVValue.Create); + Result := TCSVValue(FItems.Last); +end; + +procedure TCSVRecord.Clear; +begin + FItems.Clear; +end; + +constructor TCSVRecord.Create; +begin + inherited Create; + FItems := TObjectList.Create; +end; + +destructor TCSVRecord.Destroy; +begin + FItems.Free; + inherited Destroy; +end; + +function TCSVRecord.GetCount: Integer; +begin + Result := FItems.Count; +end; + +function TCSVRecord.GetItems(AIndex: Integer): TCSVValue; +begin + Result := TCSVValue(FItems[AIndex]); +end; + +{ TCSVFile } + +constructor TCSVFile.Create; +begin + inherited Create; + FItems := TObjectList.Create; +end; + +destructor TCSVFile.Destroy; +begin + FItems.Free; + inherited Destroy; +end; + +function TCSVFile.Add: TCSVRecord; +begin + FItems.Add(TCSVRecord.Create); + Result := TCSVRecord(FItems.Last); +end; + +function TCSVFile.GetCount: Integer; +begin + Result := FItems.Count; +end; + +function TCSVFile.GetItems(AIndex: Integer): TCSVRecord; +begin + Result := TCSVRecord(FItems[AIndex]); +end; + +function JvAnsiStrSplitStrings2(var InString: AnsiString; const SplitChar, QuoteChar: AnsiChar; CSVItems: TCSVRecord): Integer; +var + I, Len, SplitCounter: Integer; + Ch: AnsiChar; + InQuotes: Boolean; + OutString: AnsiString; +begin + InQuotes := False; + Len := Length(InString); + CSVItems.Clear; + SplitCounter := 0; // ALWAYS ASSUME THAT ZERO IS VALID IN THE OUTGOING ARRAY. + + for I := 1 to Len do + begin + Ch := InString[I]; + if (Ch in [#10]) and not InQuotes then + begin + Delete(InString, 1, I); + Break; + end + else + if (Ch = SplitChar) and not InQuotes then + begin + CSVItems.Add.Value := AnsiDequotedStr(string(OutString), Char(QuoteChar)); + OutString := ''; + Inc(SplitCounter); + end + else + begin + OutString := OutString + Ch; + if Ch = QuoteChar then + InQuotes := not InQuotes; + end; + if I = Len then + InString := ''; + end; + I := Length(OutString); + if (I > 0) and (OutString[I] = #13) then + Delete(OutString, I, 1); + CSVItems.Add.Value := AnsiDequotedStr(string(OutString), Char(QuoteChar)); + Inc(SplitCounter); + Result := SplitCounter; +end; + +procedure TCSVFile.LoadFromString(AInString: string); +var + S: AnsiString; + P: Integer; +begin + FItems.Clear; + S := AInString; + P := Pos(#10, S); + if P > 0 then + Delete(S, 1, P); + while S <> '' do + JvAnsiStrSplitStrings2(S, ';', '"', Add); +end; + + +{ TStackInfo } +{ + +constructor TThreadInfoList.Create; +begin + inherited Create; + FItems := TObjectList.Create; +end; + +destructor TThreadInfoList.Destroy; +begin + FItems.Free; + inherited Destroy; +end; + +function TThreadInfoList.GetCount: Integer; +begin + Result := FItems.Count; +end; + +function TThreadInfoList.GetItems(AIndex: Integer): TThreadInfo; +begin + Result := TThreadInfo(FItems[AIndex]); +end; + +procedure TThreadInfoList.LoadFromString(AInString: string); +var + CSVFile: TCSVFile; + I: Integer; + ThreadInfo: TThreadInfo; +begin + FItems.Clear; + CSVFile := TCSVFile.Create; + try + CSVFile.LoadFromString(AInString); + for I := 0 to CSVFile.Count - 1 do + begin + FItems.Add(TThreadInfo.Create); + ThreadInfo := TThreadInfo(FItems.Last); + if CSVFile[I].Count > 0 then + ThreadInfo.ThreadID := StrToIntDef(CSVFile[I][0].Value, 0); + if CSVFile[I].Count > 6 then + ThreadInfo.Stack.LoadFromString(CSVFile[I][6].Value); + end; + finally + CSVFile.Free; + end; +end; +} +procedure TThreadInfoList.LoadFromString(AInString: string); +var + CSVFile: TCSVFile; + CSVRecord: TCSVRecord; + I: Integer; + ThreadInfo: TJclThreadInfo; +begin + Clear; + CSVFile := TCSVFile.Create; + try + CSVFile.LoadFromString(AInString); + for I := 0 to CSVFile.Count - 1 do + begin + CSVRecord := CSVFile[I]; + ThreadInfo := Add; + ThreadInfo.Values := []; + if CSVRecord.Count > 0 then + ThreadInfo.ThreadID := StrToIntDef(CSVRecord[0].Value, 0); + if (CSVRecord.Count > 1) and (CSVRecord[1].Value = '1') then + ThreadInfo.Values := ThreadInfo.Values + [tioIsMainThread]; + if (CSVRecord.Count > 2) and (CSVRecord[2].Value <> '') then + begin + ThreadInfo.Name := CSVRecord[2].Value; + ThreadInfo.Values := ThreadInfo.Values + [tioName]; + end; + if (CSVRecord.Count > 3) and (CSVRecord[3].Value <> '') then + begin + ThreadInfo.CreationTime := StrToDateTime(CSVRecord[3].Value); + ThreadInfo.Values := ThreadInfo.Values + [tioCreationTime]; + end; + if (CSVRecord.Count > 4) and (CSVRecord[4].Value <> '') then + begin + ThreadInfo.ParentThreadID := StrToIntDef(CSVRecord[4].Value, 0); + if ThreadInfo.ParentThreadID <> 0 then + ThreadInfo.Values := ThreadInfo.Values + [tioParentThreadID]; + end; + if (CSVRecord.Count > 5) and (CSVRecord[5].Value <> '') then + begin + LoadStackFromString(ThreadInfo.Stack, CSVRecord[5].Value); + ThreadInfo.Values := ThreadInfo.Values + [tioStack]; + end; + if (CSVRecord.Count > 6) and (CSVRecord[6].Value <> '') then + begin + LoadStackFromString(ThreadInfo.CreationStack, CSVRecord[6].Value); + ThreadInfo.Values := ThreadInfo.Values + [tioCreationStack]; + end; + end; + finally + CSVFile.Free; + end; +end; + +procedure TThreadInfoList.LoadStackFromString(AStack: TJclLocationInfoList; AInString: string); +var + CSVFile: TCSVFile; + CSVRecord: TCSVRecord; + I: Integer; + LocationInfoEx: TJclLocationInfoEx; +begin + AStack.Clear; + CSVFile := TCSVFile.Create; + try + CSVFile.LoadFromString(AInString); + for I := 0 to CSVFile.Count - 1 do + begin + CSVRecord := CSVFile[I]; + LocationInfoEx := AStack.Add(nil); + LocationInfoEx.Values := []; + if (CSVRecord.Count > 3) and (CSVRecord[3].Value <> '') then + LocationInfoEx.Values := LocationInfoEx.Values + [lievLocationInfo]; + if (CSVRecord.Count > 9) and (CSVRecord[9].Value <> '') then + LocationInfoEx.Values := LocationInfoEx.Values + [lievProcedureStartLocationInfo]; + if CSVRecord.Count > 0 then + LocationInfoEx.VAddress := Pointer(StrToIntDef('$' + CSVRecord[0].Value, 0)); + if CSVRecord.Count > 1 then + LocationInfoEx.ModuleName := CSVRecord[1].Value; + if CSVRecord.Count > 2 then + LocationInfoEx.Address := Pointer(StrToIntDef('$' + CSVRecord[2].Value, 0)); + if CSVRecord.Count > 3 then + LocationInfoEx.OffsetFromProcName := StrToIntDef('$' + CSVRecord[3].Value, 0); + if CSVRecord.Count > 4 then + LocationInfoEx.SourceUnitName := CSVRecord[4].Value; + if CSVRecord.Count > 5 then + LocationInfoEx.ProcedureName := CSVRecord[5].Value; + if CSVRecord.Count > 6 then + LocationInfoEx.SourceName := CSVRecord[6].Value; + if CSVRecord.Count > 7 then + LocationInfoEx.LineNumber := StrToIntDef(CSVRecord[7].Value, -1); + if CSVRecord.Count > 8 then + LocationInfoEx.OffsetFromLineNumber := StrToIntDef(CSVRecord[8].Value, -1); + if CSVRecord.Count > 9 then + LocationInfoEx.LineNumberOffsetFromProcedureStart := StrToIntDef(CSVRecord[9].Value, -1); + end; + finally + CSVFile.Free; + end; +end; + + +{ TStack } + +constructor TThreadInfoStack.Create; +begin + inherited Create; + FItems := TObjectList.Create; +end; + +destructor TThreadInfoStack.Destroy; +begin + FItems.Free; + inherited Destroy; +end; + +function TThreadInfoStack.GetCount: Integer; +begin + Result := FItems.Count; +end; + +function TThreadInfoStack.GetItems(AIndex: Integer): TStackItem; +begin + Result := TStackItem(FItems[AIndex]); +end; + +procedure TThreadInfoStack.LoadFromString(AInString: string); +var + CSVFile: TCSVFile; + I: Integer; + Stack: TStackItem; +begin + FItems.Clear; + CSVFile := TCSVFile.Create; + try + CSVFile.LoadFromString(AInString); + for I := 0 to CSVFile.Count - 1 do + begin + FItems.Add(TStackItem.Create); + Stack := TStackItem(FItems.Last); + if CSVFile[I].Count > 1 then + Stack.ModuleName := CSVFile[I][1].Value; + if CSVFile[I].Count > 4 then + Stack.SourceUnitName := CSVFile[I][4].Value; + if CSVFile[I].Count > 5 then + Stack.ProcedureName := CSVFile[I][5].Value; + if CSVFile[I].Count > 6 then + Stack.SourceName := CSVFile[I][6].Value; + if CSVFile[I].Count > 7 then + Stack.LineNumber := StrToIntDef(CSVFile[I][7].Value, -1); + end; + finally + CSVFile.Free; + end; +end; + +{ TStackItem } + +procedure TStackItem.AssignTo(Dest: TPersistent); +begin + if Dest is TStackItem then + begin + TStackItem(Dest).ModuleName := ModuleName; + TStackItem(Dest).ProcedureName := ProcedureName; + TStackItem(Dest).SourceUnitName := SourceUnitName; + TStackItem(Dest).SourceName := SourceName; + TStackItem(Dest).LineNumber := LineNumber; + end + else + inherited AssignTo(Dest); +end; + +{ TThreadInfo } + +constructor TThreadInfo.Create; +begin + inherited Create; + FStack := TThreadInfoStack.Create; +end; + +destructor TThreadInfo.Destroy; +begin + FStack.Free; + inherited Destroy; +end; + +{ TExceptionInfo } + +constructor TExceptionInfo.Create; +begin + inherited Create; + FException := TException.Create; + FThreadInfoList := TThreadInfoList.Create; + FModules := TModuleList.Create; +end; + +destructor TExceptionInfo.Destroy; +begin + FModules.Free; + FException.Free; + FThreadInfoList.Free; + inherited Destroy; +end; + +procedure TExceptionInfo.LoadFromString(AInString: string); +var + CSVFile: TCSVFile; + CSVRecord: TCSVRecord; + I: Integer; + S: string; +begin + FThreadInfoList.Clear; + FException.Clear; + FModules.Clear; + CSVFile := TCSVFile.Create; + try + CSVFile.LoadFromString(AInString); + for I := 0 to CSVFile.Count - 1 do + begin + CSVRecord := CSVFile[I]; + if CSVRecord.Count > 1 then + begin + S := CSVRecord[0].Value; + if S = 'ThreadInfo' then + FThreadInfoList.LoadFromString(CSVRecord[1].Value) + else + if S = 'Exception' then + FException.LoadFromString(CSVRecord[1].Value) + else + if S = 'Modules' then + FModules.LoadFromString(CSVRecord[1].Value); + end; + end; + finally + CSVFile.Free; + end; +end; + +{ TException } + +procedure TException.Clear; +begin + FExceptionClassName := ''; + FExceptionMessage := ''; +end; + +procedure TException.LoadFromString(AInString: string); +var + CSVFile: TCSVFile; + CSVRecord: TCSVRecord; +begin + Clear; + CSVFile := TCSVFile.Create; + try + CSVFile.LoadFromString(AInString); + if CSVFile.Count > 0 then + begin + CSVRecord := CSVFile[0]; + if CSVRecord.Count > 0 then + FExceptionClassName := CSVRecord[0].Value; + if CSVRecord.Count > 1 then + FExceptionMessage := CSVRecord[1].Value; + end; + finally + CSVFile.Free; + end; +end; + +{ TModuleList } + +constructor TModuleList.Create; +begin + inherited Create; + FItems := TObjectList.Create; +end; + +destructor TModuleList.Destroy; +begin + FItems.Free; + inherited Destroy; +end; + +procedure TModuleList.Clear; +begin + FItems.Clear; +end; + +function TModuleList.GetCount: Integer; +begin + Result := FItems.Count; +end; + +function TModuleList.GetItems(AIndex: Integer): TModule; +begin + Result := TModule(FItems[AIndex]); +end; + +procedure TModuleList.LoadFromString(AInString: string); +var + CSVFile: TCSVFile; + CSVRecord: TCSVRecord; + I: Integer; + Module: TModule; +begin + Clear; + CSVFile := TCSVFile.Create; + try + CSVFile.LoadFromString(AInString); + for I := 0 to CSVFile.Count - 1 do + begin + CSVRecord := CSVFile[I]; + if CSVRecord.Count > 0 then + begin + FItems.Add(TModule.Create); + Module := TModule(FItems.Last); + Module.HandleStr := CSVRecord[0].Value; + if CSVRecord.Count > 1 then + Module.ModuleName := CSVRecord[1].Value; + end; + end; + finally + CSVFile.Free; + end; +end; + +end. Added: branches/jcl-stack-trace/jcl/experts/stackviewer/JclSIMDIcon.dcr =================================================================== (Binary files differ) Property changes on: branches/jcl-stack-trace/jcl/experts/stackviewer/JclSIMDIcon.dcr ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Added: branches/jcl-stack-trace/jcl/experts/stackviewer/JclStackTraceViewerExpert.dpk =================================================================== --- branches/jcl-stack-trace/jcl/experts/stackviewer/JclStackTraceViewerExpert.dpk (rev 0) +++ branches/jcl-stack-trace/jcl/experts/stackviewer/JclStackTraceViewerExpert.dpk 2009-04-01 23:08:02 UTC (rev 2717) @@ -0,0 +1,44 @@ +package JclStackTraceViewerExpert; +{$R *.res} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO OFF} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS OFF} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO OFF} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST ON} +{$MINENUMSIZE 1} +{$IMAGEBASE $58060000} +{$DESCRIPTION 'JCL Stack Trace Viewer'} +{$LIBSUFFIX '120'} +{$DESIGNONLY} +{$IMPLICITBUILD OFF} + +requires + rtl, + vcl, + designide, + Jcl, + JclBaseExpert, + xmlrtl, + vclactnband, + vclx; + +contains + StackTraceViewerImpl in 'StackTraceViewerImpl.pas', + StackTraceViewerConfigFrame in 'StackTraceViewerConfigFrame.pas' {JclStackTraceViewerConfigFrame: TFrame}, + StackViewForm in 'StackViewForm.pas' {frmStackView}; + +end. Added: branches/jcl-stack-trace/jcl/experts/stackviewer/JclStackTraceViewerExpert.rc =================================================================== --- branches/jcl-stack-trace/jcl/experts/stackviewer/JclStackTraceViewerExpert.rc (rev 0) +++ branches/jcl-stack-trace/jcl/experts/stackviewer/JclStackTraceViewerExpert.rc 2009-04-01 23:08:02 UTC (rev 2717) @@ -0,0 +1,32 @@ +VS_VERSION_INFO VERSIONINFO +FILEVERSION 1,105,0,3249 +PRODUCTVERSION 1,105,0,3249 + FILEFLAGSMASK VS_FFI_FILEFLAGSMASK +#ifdef _DEBUG + FILEFLAGS VS_FF_DEBUG +#else + FILEFLAGS 0x0L +#endif + FILEOS VOS__WINDOWS32 + FILETYPE VFT_DLL + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904E4" + BEGIN + VALUE "CompanyName", "Project JEDI\0" + VALUE "FileDescription", "JCL Project Analyzer\0" + VALUE "FileVersion", "1.105.0.3249\0" + VALUE "InternalName", "JclProjectAnalysisExpert\0" + VALUE "LegalCopyright", "Copyright (C) 1999, 2008 Project JEDI\0" + VALUE "OriginalFilename", "JclProjectAnalysisExpert120.bpl\0" + VALUE "ProductName", "JEDI Code Library\0" + VALUE "ProductVersion", "1.105 Build 3249\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0409, 1252 + END +END Added: branches/jcl-stack-trace/jcl/experts/stackviewer/JclStackTraceViewerExpert.res =================================================================== (Binary files differ) Property changes on: branches/jcl-stack-trace/jcl/experts/stackviewer/JclStackTraceViewerExpert.res ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Added: branches/jcl-stack-trace/jcl/experts/stackviewer/ModuleFrame.dfm =================================================================== --- branches/jcl-stack-trace/jcl/experts/stackviewer/ModuleFrame.dfm (rev 0) +++ branches/jcl-stack-trace/jcl/experts/stackviewer/ModuleFrame.dfm 2009-04-01 23:08:02 UTC (rev 2717) @@ -0,0 +1,26 @@ +object frmModule: TfrmModule + Left = 0 + Top = 0 + Width = 320 + Height = 240 + TabOrder = 0 + object lv: TListView + Left = 0 + Top = 0 + Width = 320 + Height = 240 + Align = alClient + Columns = < + item + Caption = 'Handle' + end + item + Caption = 'FileName' + end> + GridLines = True + ReadOnly = True + RowSelect = True + TabOrder = 0 + ViewStyle = vsReport + end +end Added: branches/jcl-stack-trace/jcl/experts/stackviewer/ModuleFrame.pas =================================================================== --- branches/jcl-stack-trace/jcl/experts/stackviewer/ModuleFrame.pas (rev 0) +++ branches/jcl-stack-trace/jcl/experts/stackviewer/ModuleFrame.pas 2009-04-01 23:08:02 UTC (rev 2717) @@ -0,0 +1,42 @@ +unit ModuleFrame; + +interface + +uses + Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, + Dialogs, ComCtrls, JclDebugStackUtils; + +type + TfrmModule = class(TFrame) + lv: TListView; + private + FModuleList: TModuleList; + procedure SetModuleList(const Value: TModuleList); + { Private declarations } + public + { Public declarations } + property ModuleList: TModuleList read FModuleList write SetModuleList; + end; + +implementation + +{$R *.dfm} + +{ TfrmModule } + +procedure TfrmModule.SetModuleList(const Value: TModuleList); +var + I: Integer; + ListItem: TListItem; +begin + FModuleList := Value; + lv.Items.Clear; + for I := 0 to FModuleList.Count - 1 do + begin + ListItem := lv.Items.Add; + ListItem.Caption := FModuleList[I].HandleStr; + ListItem.SubItems.Add(FModuleList[I].ModuleName); + end; +end; + +end. Added: branches/jcl-stack-trace/jcl/experts/stackviewer/StackCodeUtils.pas =================================================================== --- branches/jcl-stack-trace/jcl/experts/stackviewer/StackCodeUtils.pas (rev 0) +++ branches/jcl-stack-trace/jcl/experts/stackviewer/StackCodeUtils.pas 2009-04-01 23:08:02 UTC (rev 2717) @@ -0,0 +1,112 @@ +unit StackCodeUtils; + +interface + +uses + SysUtils, ToolsAPI, StackViewUnit; + +function FindModule(const AFileName: string): string; +function FindModuleAndProject(const AFileName: string; var AProjectName: string): string; +procedure JumpToCode(AStackViewItem: TStackViewItem); + +implementation + +function FindModuleInProject(AProject: IOTAProject; const AFileName: string): string; +var + I, P: Integer; + ModuleInfo: IOTAModuleInfo; + S, S2: string; +begin + Result := ''; + if AProject.GetModuleCount > 0 then + begin + S := UpperCase(AFileName); + for I := 0 to Pred(AProject.GetModuleCount) do + begin + ModuleInfo := AProject.GetModule(I); + if Assigned(ModuleInfo) then + begin + S2 := UpperCase(ModuleInfo.FileName); + P := Pos(S, S2); + if (P > 0) and (P = Length(S2) - Length(S) + 1) then + begin + Result := ModuleInfo.FileName; + Break; + end; + end; + end; + end; +end; + +function FindModule(const AFileName: string): string; +var + Dummy: string; +begin + Result := FindModuleAndProject(AFilename, Dummy); +end; + +function FindModuleAndProject(const AFileName: string; var AProjectName: string): string; +var + I: Integer; + ProjectGroup: IOTAProjectGroup; +begin + Result := ''; + AProjectName := ''; + ProjectGroup := (BorlandIDEServices as IOTAModuleServices).MainProjectGroup; + if Assigned(ProjectGroup) then + for I := 0 to ProjectGroup.ProjectCount - 1 do + begin + Result := FindModuleInProject(ProjectGroup.Projects[I], AFileName); + if Result <> '' then + begin + AProjectName := ProjectGroup.Projects[I].FileName; + Break; + end; + end; +end; + +procedure JumpToCode(AStackViewItem: TStackViewItem); +var + S, FileName: string; + Module: IOTAModule; + + SourceEditor: IOTASourceEditor; + I, LineNumber: Integer; + EditPos: TOTAEditPos; +begin + if Assigned(AStackViewItem) then + begin + FileName := AStackViewItem.SourceName; + S := FindModule(FileName); + if (S <> '') and Assigned(BorlandIDEServices) then + begin + Module := (BorlandIDEServices as IOTAModuleServices).OpenModule(S); + if Assigned(Module) then + begin + Module.Show; + for I := 0 to Module.ModuleFileCount - 1 do + if Supports(Module.ModuleFileEditors[I], IOTASourceEditor, SourceEditor) then + begin + SourceEditor.Show; + if SourceEditor.EditViewCount > 0 then + begin + if AStackViewItem.TranslatedLineNumber > 0 then + LineNumber := AStackViewItem.TranslatedLineNumber + else + LineNumber := AStackViewItem.LineNumber; + if LineNumber > 0 then + begin + SourceEditor.EditViews[0].Center(LineNumber, 1); + EditPos.Line := LineNumber; + EditPos.Col := 1; + SourceEditor.EditViews[0].CursorPos := EditPos; + end; + end; + Break; + end; + end; + end; + end; +end; + +end. Added: branches/jcl-stack-trace/jcl/experts/stackviewer/StackFrame.dfm =================================================================== --- branches/jcl-stack-trace/jcl/experts/stackviewer/StackFrame.dfm (rev 0) +++ branches/jcl-stack-trace/jcl/experts/stackviewer/StackFrame.dfm 2009-04-01 23:08:02 UTC (rev 2717) @@ -0,0 +1,47 @@ +object frmStack: TfrmStack + Left = 0 + Top = 0 + Width = 320 + Height = 240 + TabOrder = 0 + object lv: TListView + Left = 0 + Top = 0 + Width = 320 + Height = 240 + Align = alClient + Columns = < + item + Caption = 'ModuleName' + end + item + Caption = 'SourceUnitName' + end + item + Caption = 'ProcedureName' + end + item + Caption = 'SourceName' + end + item + Caption = 'LineNumber' + end + item + Caption = 'LineNumberOffsetFromProcedureStart' + end + item + Caption = 'Project/File' + end + item + Caption = 'TranslatedLineNumber' + end> + GridLines = True + HideSelection = False + ReadOnly = True + RowSelect = True + TabOrder = 0 + ViewStyle = vsReport + OnChange = lvChange + OnDblClick = lvDblClick + end +end Added: branches/jcl-stack-trace/jcl/experts/stackviewer/StackFrame.pas =================================================================== --- branches/jcl-stack-trace/jcl/experts/stackviewer/StackFrame.pas (rev 0) +++ branches/jcl-stack-trace/jcl/experts/stackviewer/StackFrame.pas 2009-04-01 23:08:02 UTC (rev 2717) @@ -0,0 +1,104 @@ +unit StackFrame; + +interface + +uses + Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, + Dialogs, ComCtrls, JclDebug, StackViewUnit, StackCodeUtils; + +type + TfrmStack = class(TFrame) + lv: TListView; + procedure lvDblClick(Sender: TObject); + procedure lvChange(Sender: TObject; Item: TListItem; Change: TItemChange); + private + { Private declarations } + FStackList: TStackViewItemsList; + FOnSelectStackLine: TNotifyEvent; + procedure DoSelectStackLine; + procedure SetStackList(const Value: TStackViewItemsList); + function GetSelected: TStackViewItem; + public + { Public declarations } + property StackList: TStackViewItemsList read FStackList write SetStackList; + property Selected: TStackViewItem read GetSelected; + property OnSelectStackLine: TNotifyEvent read FOnSelectStackLine write FOnSelectStackLine; + end; + +implementation + +{$R *.dfm} + +{ TfrmStack } + +procedure TfrmStack.DoSelectStackLine; +begin + if Assigned(FOnSelectStackLine) then + FOnSelectStackLine(Self); +end; + +function TfrmStack.GetSelected: TStackViewItem; +begin + if Assigned(lv.Selected) and Assigned(lv.Selected.Data) and (TObject(lv.Selected.Data) is TStackViewItem) then + Result := TStackViewItem(lv.Selected.Data) + else + Result := nil; +end; + +procedure TfrmStack.lvChange(Sender: TObject; Item: TListItem; Change: TItemChange); +begin + DoSelectStackLine; +end; + +procedure TfrmStack.lvDblClick(Sender: TObject); +begin + JumpToCode(Selected); +end; + +procedure TfrmStack.SetStackList(const Value: TStackViewItemsList); +var + I: Integer; + ListItem: TListItem; + S: string; +begin + FStackList := Value; + + lv.Items.BeginUpdate; + try + lv.Items.Clear; + if Assigned(FStackList) then + for I := 0 to FStackList.Count - 1 do + begin + ListItem := lv.Items.Add; + ListItem.Caption := FStackList[I].ModuleName; + ListItem.SubItems.Add(FStackList[I].SourceUnitName); + ListItem.SubItems.Add(FStackList[I].ProcedureName); + ListItem.SubItems.Add(FStackList[I].SourceName); + if FStackList[I].LineNumber > 0 then + S := IntToStr(FStackList[I].LineNumber) + else + S := ''; + ListItem.SubItems.Add(S); + if lievProcedureStartLocationInfo in FStackList[I].Values then + S := IntToStr(FStackList[I].LineNumberOffsetFromProcedureStart) + else + S := ''; + ListItem.SubItems.Add(S); + if FStackList[I].ProjectName <> '' then + S := ExtractFileName(FStackList[I].ProjectName) + else + S := ExtractFileName(FStackList[I].FileName); + ListItem.SubItems.Add(S); + if FStackList[I].TranslatedLineNumber > 0 then + S := IntToStr(FStackList[I].TranslatedLineNumber) + else + S := ''; + ListItem.SubItems.Add(S); + ListItem.Data := FStackList[I]; + end; + finally + lv.Items.EndUpdate; + end; +end; + +end. Added: branches/jcl-stack-trace/jcl/experts/stackviewer/StackFrame2.dfm =================================================================== --- branches/jcl-stack-trace/jcl/experts/stackviewer/StackFrame2.dfm (rev 0) +++ branches/jcl-stack-trace/jcl/experts/stackviewer/StackFrame2.dfm 2009-04-01 23:08:02 UTC (rev 2717) @@ -0,0 +1,20 @@ +object frmStack2: TfrmStack2 + Left = 0 + Top = 0 + Width = 320 + Height = 240 + TabOrder = 0 + object lbStack: TListBox + Left = 0 + Top = 0 + Width = 320 + Height = 240 + Style = lbOwnerDrawVariable + Align = alClient + ItemHeight = 13 + TabOrder = 0 + OnDblClick = lbStackDblClick + OnDrawItem = lbStackDrawItem + OnMeasureItem = lbStackMeasureItem + end +end Added: branches/jcl-stack-trace/jcl/experts/stackviewer/StackFrame2.pas =================================================================== --- branches/jcl-stack-trace/jcl/experts/stackviewer/StackFrame2.pas (rev 0) +++ branches/jcl-stack-trace/jcl/experts/stackviewer/StackFrame2.pas 2009-04-01 23:08:02 UTC (rev 2717) @@ -0,0 +1,109 @@ +unit StackFrame2; + +interface + +uses + Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, + Dialogs, StdCtrls, JclDebug, StackViewUnit, StackCodeUtils; + +type + TfrmStack2 = class(TFrame) + lbStack: TListBox; + procedure lbStackDblClick(Sender: TObject); + procedure lbStackDrawItem(Control: TWinControl; Index: Integer; Rect: TRect; + State: TOwnerDrawState); + procedure lbStackMeasureItem(Control: TWinControl; Index: Integer; + var Height: Integer); + private + { Private declarations } + FStackList: TStackViewItemsList; + procedure SetStackList(const Value: TStackViewItemsList); + function GetSelected: TStackViewItem; + public + { Public declarations } + property StackList: TStackViewItemsList read FStackList write SetStackList; + property Selected: TStackViewItem read GetSelected; + end; + +implementation + +{$R *.dfm} + +function TfrmStack2.GetSelected: TStackViewItem; +begin + if (lbStack.ItemIndex <> -1) and (lbStack.Items.Objects[lbStack.ItemIndex] is TStackViewItem) then + Result := TStackViewItem(lbStack.Items.Objects[lbStack.ItemIndex]) + else + Result := nil; +end; + +procedure TfrmStack2.lbStackDblClick(Sender: TObject); +begin + JumpToCode(Selected); +end; + +procedure TfrmStack2.lbStackDrawItem(Control: TWinControl; Index: Integer; + Rect: TRect; State: TOwnerDrawState); +var + ListboxCanvas: TCanvas; + StackItem: TStackViewItem; + BkgColor: TColor; + S: string; + P: Integer; +begin + ListboxCanvas := TListBox(Control).Canvas; + if TListBox(Control).Items.Objects[Index] is TStackViewItem then + begin + StackItem := TStackViewItem(TListBox(Control).Items.Objects[Index]); + S := StackItem.AsString; + P := Pos(']', S); + if P > 0 then + begin + Delete(S, P + 1, 1); + Insert(#13#10, S, P + 1); + end; + if StackItem.FoundFile then + BkgColor := clMoneyGreen + else + BkgColor := clWindow; + end + else + begin + S := TListBox(Control).Items[Index]; + BkgColor := clWindow; + end; + if odSelected in State then + ListboxCanvas.Brush.Color := clHighlight + else + ListboxCanvas.Brush.Color := BkgColor; + ListboxCanvas.FillRect(Rect); + Rect.Left := Rect.Left + 2; + ListboxCanvas.TextRect(Rect, S); +end; + +procedure TfrmStack2.lbStackMeasureItem(Control: TWinControl; Index: Integer; + var Height: Integer); +var + TextHeight: Integer; +begin + TextHeight := TListBox(Control).Canvas.TextHeight('Ay'); + Height := TextHeight * 2 + 1; +end; + +procedure TfrmStack2.SetStackList(const Value: TStackViewItemsList); +var + I: Integer; +begin + FStackList := Value; + lbStack.Items.BeginUpdate; + try + lbStack.Items.Clear; + if Assigned(FStackList) then + for I := 0 to FStackList.Count - 1 do + lbStack.Items.AddObject(FStackList[I].SourceName, FStackList[I]); + finally + lbStack.Items.EndUpdate; + end; +end; + +end. Added: branches/jcl-stack-trace/jcl/experts/stackviewer/StackLineNumberTranslator.pas =================================================================== --- branches/jcl-stack-trace/jcl/experts/stackviewer/StackLineNumberTranslator.pas (rev 0) +++ branches/jcl-stack-trace/jcl/experts/stackviewer/StackLineNumberTranslator.pas 2009-04-01 23:08:02 UTC (rev 2717) @@ -0,0 +1,302 @@ +unit StackLineNumberTranslator; + +interface + +uses + Classes, SysUtils, ActiveX, ToolsAPI;//todo remove + +type + IJclLineNumberTranslator = interface + ['{864A28E9-5ED2-4386-975B-3F8ECC048074}'] + function GetIDString: string; + function GetName: string; + function TranslateLineNumber(ACurrentContent: IStream; const AFileName, ARevision: string; + ALineNumber: Integer; var ANewLineNumber: Integer): Boolean; + + property Name: string read GetName; + property IDString: string read GetIDString; + end; + + IJclLineNumberTranslator2 = interface + ['{01E06940-49AE-464B-AC47-D65DFBC41396}'] + function GetIDString: string; + function GetName: string; + function TranslateLineNumbers(ARevisionContent, ACurrentContent: IStream; + ARevisionLineNumbers: TList; ACurrentLineNumbers: TList): Integer; + + property Name: string read GetName; + property IDString: string read GetIDString; + end; + + IJclRevisionProvider = interface + ['{8127FF3C-083D-47FD-855D-6C68EC7CBFB9}'] + function GetIDString: string; + function GetName: string; + function GetRevisionContent(const AFileName, ARevision: string; AContent: IStream): Boolean; + + property Name: string read GetName; + property IDString: string read GetIDString; + end; + + TJclLineNumberTranslators = class(TObject) + private + FIndexList: TList; + FNextIndex: Integer; + FTranslators: TInterfaceList; + function GetCount: Integer; + function GetItems(AIndex: Integer): IJclLineNumberTranslator2; + public + constructor Create; + destructor Destroy; override; + function RegisterTranslator(const ATranslator: IJclLineNumberTranslator2): Integer; + { + function TranslateLineNumber(ACurrentContent: IStream; const AFileName, ARevision: string; + ALineNumber: Integer; var ANewLineNumber: Integer): Boolean; + } + function TranslateLineNumbers(ARevisionContent, ACurrentContent: IStream; + ARevisionLineNumbers: TList; ACurrentLineNumbers: TList): Integer; + procedure UnregisterTranslator(AIndex: Integer); + property Count: Integer read GetCount; + property Items[AIndex: Integer]: IJclLineNumberTranslator2 read GetItems; default; + end; + + TJclRevisionProviders = class(TObject) + private + FIndexList: TList; + FNextIndex: Integer; + FTranslators: TInterfaceList; + function GetCount: Integer; + function GetItems(AIndex: Integer): IJclRevisionProvider; + public + constructor Create; + destructor Destroy; override; + function RegisterProvider(const ATranslator: IJclRevisionProvider): Integer; + { + function TranslateLineNumber(ACurrentContent: IStream; const AFileName, ARevision: string; + ALineNumber: Integer; var ANewLineNumber: Integer): Boolean; + } + function GetRevisionContent(const AFileName, ARevision: string; AContent: IStream): Boolean; + procedure UnregisterProvider(AIndex: Integer); + property Count: Integer read GetCount; + property Items[AIndex: Integer]: IJclRevisionProvider read GetItems; default; + end; + +var + LineNumberTranslators: TJclLineNumberTranslators; + RevisionProviders: TJclRevisionProviders; + +{ +function TranslateLineNumber(ACurrentContent: IStream; const AFileName, ARevision: string; + ALineNumber: Integer; var ANewLineNumber: Integer): Boolean; +} +function TranslateLineNumbers(ARevisionContent, ACurrentContent: IStream; ARevisionLineNumbers: TList; ACurrentLineNumbers: TList): Integer; + +function RegisterLineNumberTranslator(const ATranslator: IJclLineNumberTranslator2): Integer; +procedure UnregisterLineNumberTranslator(AIndex: Integer); + +function GetRevisionContent(const AFileName, ARevision: string; AContent: IStream): Boolean; + +function RegisterRevisionProvider(const ATranslator: IJclRevisionProvider): Integer; +procedure UnregisterRevisionProvider(AIndex: Integer); + +implementation + +{ TJclLineNumberTranslators } + +constructor TJclLineNumberTranslators.Create; +begin + inherited Create; + FNextIndex := 1; + FIndexList := TList.Create; + FTranslators := TInterfaceList.Create; +end; + +destructor TJclLineNumberTranslators.Destroy; +begin + FTranslators.Free; + FIndexList.Free; + inherited Destroy; +end; + +function TJclLineNumberTranslators.GetCount: Integer; +begin + Result := FTranslators.Count; +end; + +function TJclLineNumberTranslators.GetItems(AIndex: Integer): IJclLineNumberTranslator2; +begin + Result := IJclLineNumberTranslator2(FTranslators[AIndex]); +end; + +function TJclLineNumberTranslators.RegisterTranslator(const ATranslator: IJclLineNumberTranslator2): Integer; +begin + if Assigned(ATranslator) then + begin + Result := FNextIndex; + Inc(FNextIndex); + FTranslators.Add(ATranslator); + FIndexList.Add(Pointer(Result)); + end + else + Result := -1; +end; + +{ +function TJclLineNumberTranslators.TranslateLineNumber(ACurrentContent: IStream; const AFileName, ARevision: string; + ALineNumber: Integer; var ANewLineNumber: Integer): Boolean; +var + I: Integer; +begin + Result := False; + //todo remove debug + (BorlandIDEServices as IOTAMessageServices).AddTitleMessage(Format('TranslateLineNumber %s %s %d', [AFileName, ARevision, ALineNumber])); + for I := 0 to Count - 1 do + if Items[I].TranslateLineNumber(ACurrentContent, AFileName, ARevision, ALineNumber, ANewLineNumber) then + begin + Result := True; + Break; + end; + //todo remove debug + (BorlandIDEServices as IOTAMessageServices).AddTitleMessage(Format('TranslateLineNumber %d -> %d', [ALineNumber, ANewLineNumber])); +end; +} + +function TJclLineNumberTranslators.TranslateLineNumbers(ARevisionContent, ACurrentContent: IStream; + ARevisionLineNumbers: TList; ACurrentLineNumbers: TList): Integer; +var + I: Integer; +begin + Result := 0; + for I := 0 to Count - 1 do + begin + Result := Items[I].TranslateLineNumbers(ARevisionContent, ACurrentContent, ARevisionLineNumbers, ACurrentLineNumbers); + if Result > 0 then + Break; + end; +end; + +procedure TJclLineNumberTranslators.UnregisterTranslator(AIndex: Integer); +var + Idx: Integer; +begin + Idx := FIndexList.IndexOf(Pointer(AIndex)); + if Idx <> -1 then + begin + FTranslators.Delete(Idx); + FIndexList.Delete(Idx); + end; +end; + +{ TJclRevisionProviders } + +constructor TJclRevisionProviders.Create; +begin + inherited Create; + FNextIndex := 1; + FIndexList := TList.Create; + FTranslators := TInterfaceList.Create; +end; + +destructor TJclRevisionProviders.Destroy; +begin + FTranslators.Free; + FIndexList.Free; + inherited Destroy; +end; + +function TJclRevisionProviders.GetCount: Integer; +begin + Result := FTranslators.Count; +end; + ... [truncated message content] |