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...> - 2011-06-17 09:46:24
|
Revision: 3542 http://jcl.svn.sourceforge.net/jcl/?rev=3542&view=rev Author: outchy Date: 2011-06-17 09:46:16 +0000 (Fri, 17 Jun 2011) Log Message: ----------- A-Z unit reordering. Modified Paths: -------------- trunk/jcl/packages/c6/Jcl.bpk trunk/jcl/packages/c6/Jcl.dpk trunk/jcl/packages/d10/Jcl.dpk trunk/jcl/packages/d11/Jcl.dpk trunk/jcl/packages/d11/Jcl.dproj trunk/jcl/packages/d12/Jcl.dpk trunk/jcl/packages/d12/Jcl.dproj trunk/jcl/packages/d14/Jcl.dpk trunk/jcl/packages/d14/Jcl.dproj trunk/jcl/packages/d15/Jcl.dpk trunk/jcl/packages/d15/Jcl.dproj trunk/jcl/packages/d6/Jcl.dpk trunk/jcl/packages/d7/Jcl.dpk trunk/jcl/packages/d9/Jcl.dpk trunk/jcl/packages/fpc/Jcl.lpk trunk/jcl/packages/fpc/Jcl.pas trunk/jcl/packages/help/Jcl.dox trunk/jcl/packages/xml/Jcl-R.xml Modified: trunk/jcl/packages/c6/Jcl.bpk =================================================================== --- trunk/jcl/packages/c6/Jcl.bpk 2011-06-16 09:26:18 UTC (rev 3541) +++ trunk/jcl/packages/c6/Jcl.bpk 2011-06-17 09:46:16 UTC (rev 3542) @@ -5,7 +5,7 @@ DO NOT EDIT THIS FILE, IT IS GENERATED BY THE PACKAGE GENERATOR ALWAYS EDIT THE RELATED XML FILE (Jcl-R.xml) - Last generated: 27-05-2011 01:09:11 UTC + Last generated: 17-06-2011 09:43:08 UTC ***************************************************************************** --> <PROJECT> @@ -59,6 +59,7 @@ ..\..\lib\c6\JclCLR.obj ..\..\lib\c6\JclCOM.obj ..\..\lib\c6\JclConsole.obj + ..\..\lib\c6\JclCppException.obj ..\..\lib\c6\JclDebug.obj ..\..\lib\c6\JclDebugSerialization.obj ..\..\lib\c6\JclDebugXMLDeserializer.obj @@ -87,7 +88,6 @@ ..\..\lib\c6\MSTask.obj ..\..\lib\c6\sevenzip.obj ..\..\lib\c6\Snmp.obj - ..\..\lib\c6\JclCppException.obj "/> <RESFILES value="Jcl.res"/> <IDLFILES value=""/> @@ -183,6 +183,7 @@ <FILE FILENAME="..\..\source\windows\JclCLR.pas" FORMNAME="" UNITNAME="JclCLR" CONTAINERID="PascalCompiler" DESIGNCLASS="" LOCALCOMMAND=""/> <FILE FILENAME="..\..\source\windows\JclCOM.pas" FORMNAME="" UNITNAME="JclCOM" CONTAINERID="PascalCompiler" DESIGNCLASS="" LOCALCOMMAND=""/> <FILE FILENAME="..\..\source\windows\JclConsole.pas" FORMNAME="" UNITNAME="JclConsole" CONTAINERID="PascalCompiler" DESIGNCLASS="" LOCALCOMMAND=""/> + <FILE FILENAME="..\..\source\windows\JclCppException.pas" FORMNAME="" UNITNAME="JclCppException" CONTAINERID="PascalCompiler" DESIGNCLASS="" LOCALCOMMAND=""/> <FILE FILENAME="..\..\source\windows\JclDebug.pas" FORMNAME="" UNITNAME="JclDebug" CONTAINERID="PascalCompiler" DESIGNCLASS="" LOCALCOMMAND=""/> <FILE FILENAME="..\..\source\windows\JclDebugSerialization.pas" FORMNAME="" UNITNAME="JclDebugSerialization" CONTAINERID="PascalCompiler" DESIGNCLASS="" LOCALCOMMAND=""/> <FILE FILENAME="..\..\source\windows\JclDebugXMLDeserializer.pas" FORMNAME="" UNITNAME="JclDebugXMLDeserializer" CONTAINERID="PascalCompiler" DESIGNCLASS="" LOCALCOMMAND=""/> @@ -211,7 +212,6 @@ <FILE FILENAME="..\..\source\windows\MSTask.pas" FORMNAME="" UNITNAME="MSTask" CONTAINERID="PascalCompiler" DESIGNCLASS="" LOCALCOMMAND=""/> <FILE FILENAME="..\..\source\windows\sevenzip.pas" FORMNAME="" UNITNAME="sevenzip" CONTAINERID="PascalCompiler" DESIGNCLASS="" LOCALCOMMAND=""/> <FILE FILENAME="..\..\source\windows\Snmp.pas" FORMNAME="" UNITNAME="Snmp" CONTAINERID="PascalCompiler" DESIGNCLASS="" LOCALCOMMAND=""/> - <FILE FILENAME="..\..\source\windows\JclCppException.pas" FORMNAME="" UNITNAME="JclCppException" CONTAINERID="PascalCompiler" DESIGNCLASS="" LOCALCOMMAND=""/> </FILELIST> <BUILDTOOLS> </BUILDTOOLS> Modified: trunk/jcl/packages/c6/Jcl.dpk =================================================================== --- trunk/jcl/packages/c6/Jcl.dpk 2011-06-16 09:26:18 UTC (rev 3541) +++ trunk/jcl/packages/c6/Jcl.dpk 2011-06-17 09:46:16 UTC (rev 3542) @@ -4,7 +4,7 @@ DO NOT EDIT THIS FILE, IT IS GENERATED BY THE PACKAGE GENERATOR ALWAYS EDIT THE RELATED XML FILE (Jcl-R.xml) - Last generated: 27-05-2011 01:09:12 UTC + Last generated: 17-06-2011 09:43:09 UTC ----------------------------------------------------------------------------- } @@ -90,6 +90,7 @@ JclCLR in '..\..\source\windows\JclCLR.pas' , JclCOM in '..\..\source\windows\JclCOM.pas' , JclConsole in '..\..\source\windows\JclConsole.pas' , + JclCppException in '..\..\source\windows\JclCppException.pas' , JclDebug in '..\..\source\windows\JclDebug.pas' , JclDebugSerialization in '..\..\source\windows\JclDebugSerialization.pas' , JclDebugXMLDeserializer in '..\..\source\windows\JclDebugXMLDeserializer.pas' , @@ -117,7 +118,6 @@ JclWinMIDI in '..\..\source\windows\JclWinMIDI.pas' , MSTask in '..\..\source\windows\MSTask.pas' , sevenzip in '..\..\source\windows\sevenzip.pas' , - Snmp in '..\..\source\windows\Snmp.pas' , - JclCppException in '..\..\source\windows\JclCppException.pas' + Snmp in '..\..\source\windows\Snmp.pas' ; end. Modified: trunk/jcl/packages/d10/Jcl.dpk =================================================================== --- trunk/jcl/packages/d10/Jcl.dpk 2011-06-16 09:26:18 UTC (rev 3541) +++ trunk/jcl/packages/d10/Jcl.dpk 2011-06-17 09:46:16 UTC (rev 3542) @@ -4,7 +4,7 @@ DO NOT EDIT THIS FILE, IT IS GENERATED BY THE PACKAGE GENERATOR ALWAYS EDIT THE RELATED XML FILE (Jcl-R.xml) - Last generated: 27-05-2011 01:09:15 UTC + Last generated: 17-06-2011 09:43:12 UTC ----------------------------------------------------------------------------- } @@ -91,6 +91,7 @@ JclCLR in '..\..\source\windows\JclCLR.pas' , JclCOM in '..\..\source\windows\JclCOM.pas' , JclConsole in '..\..\source\windows\JclConsole.pas' , + JclCppException in '..\..\source\windows\JclCppException.pas' , JclDebug in '..\..\source\windows\JclDebug.pas' , JclDebugSerialization in '..\..\source\windows\JclDebugSerialization.pas' , JclDebugXMLDeserializer in '..\..\source\windows\JclDebugXMLDeserializer.pas' , @@ -121,8 +122,7 @@ mscorlib_TLB in '..\..\source\windows\mscorlib_TLB.pas' , MSTask in '..\..\source\windows\MSTask.pas' , sevenzip in '..\..\source\windows\sevenzip.pas' , - Snmp in '..\..\source\windows\Snmp.pas' , - JclCppException in '..\..\source\windows\JclCppException.pas' + Snmp in '..\..\source\windows\Snmp.pas' ; end. Modified: trunk/jcl/packages/d11/Jcl.dpk =================================================================== --- trunk/jcl/packages/d11/Jcl.dpk 2011-06-16 09:26:18 UTC (rev 3541) +++ trunk/jcl/packages/d11/Jcl.dpk 2011-06-17 09:46:16 UTC (rev 3542) @@ -4,7 +4,7 @@ DO NOT EDIT THIS FILE, IT IS GENERATED BY THE PACKAGE GENERATOR ALWAYS EDIT THE RELATED XML FILE (Jcl-R.xml) - Last generated: 27-05-2011 01:09:16 UTC + Last generated: 17-06-2011 09:44:13 UTC ----------------------------------------------------------------------------- } @@ -92,6 +92,7 @@ JclCLR in '..\..\source\windows\JclCLR.pas' , JclCOM in '..\..\source\windows\JclCOM.pas' , JclConsole in '..\..\source\windows\JclConsole.pas' , + JclCppException in '..\..\source\windows\JclCppException.pas' , JclDebug in '..\..\source\windows\JclDebug.pas' , JclDebugSerialization in '..\..\source\windows\JclDebugSerialization.pas' , JclDebugXMLDeserializer in '..\..\source\windows\JclDebugXMLDeserializer.pas' , @@ -122,8 +123,7 @@ mscorlib_TLB in '..\..\source\windows\mscorlib_TLB.pas' , MSTask in '..\..\source\windows\MSTask.pas' , sevenzip in '..\..\source\windows\sevenzip.pas' , - Snmp in '..\..\source\windows\Snmp.pas' , - JclCppException in '..\..\source\windows\JclCppException.pas' + Snmp in '..\..\source\windows\Snmp.pas' ; end. Modified: trunk/jcl/packages/d11/Jcl.dproj =================================================================== --- trunk/jcl/packages/d11/Jcl.dproj 2011-06-16 09:26:18 UTC (rev 3541) +++ trunk/jcl/packages/d11/Jcl.dproj 2011-06-17 09:46:16 UTC (rev 3542) @@ -131,6 +131,7 @@ <DCCReference Include="..\..\source\windows\JclCLR.pas"/> <DCCReference Include="..\..\source\windows\JclCOM.pas"/> <DCCReference Include="..\..\source\windows\JclConsole.pas"/> + <DCCReference Include="..\..\source\windows\JclCppException.pas"/> <DCCReference Include="..\..\source\windows\JclDebug.pas"/> <DCCReference Include="..\..\source\windows\JclDebugSerialization.pas"/> <DCCReference Include="..\..\source\windows\JclDebugXMLDeserializer.pas"/> @@ -162,6 +163,5 @@ <DCCReference Include="..\..\source\windows\MSTask.pas"/> <DCCReference Include="..\..\source\windows\sevenzip.pas"/> <DCCReference Include="..\..\source\windows\Snmp.pas"/> - <DCCReference Include="..\..\source\windows\JclCppException.pas"/> </ItemGroup> </Project> Modified: trunk/jcl/packages/d12/Jcl.dpk =================================================================== --- trunk/jcl/packages/d12/Jcl.dpk 2011-06-16 09:26:18 UTC (rev 3541) +++ trunk/jcl/packages/d12/Jcl.dpk 2011-06-17 09:46:16 UTC (rev 3542) @@ -4,7 +4,7 @@ DO NOT EDIT THIS FILE, IT IS GENERATED BY THE PACKAGE GENERATOR ALWAYS EDIT THE RELATED XML FILE (Jcl-R.xml) - Last generated: 27-05-2011 01:09:16 UTC + Last generated: 17-06-2011 09:43:13 UTC ----------------------------------------------------------------------------- } @@ -91,6 +91,7 @@ JclCLR in '..\..\source\windows\JclCLR.pas' , JclCOM in '..\..\source\windows\JclCOM.pas' , JclConsole in '..\..\source\windows\JclConsole.pas' , + JclCppException in '..\..\source\windows\JclCppException.pas' , JclDebug in '..\..\source\windows\JclDebug.pas' , JclDebugSerialization in '..\..\source\windows\JclDebugSerialization.pas' , JclDebugXMLDeserializer in '..\..\source\windows\JclDebugXMLDeserializer.pas' , @@ -121,8 +122,7 @@ mscorlib_TLB in '..\..\source\windows\mscorlib_TLB.pas' , MSTask in '..\..\source\windows\MSTask.pas' , sevenzip in '..\..\source\windows\sevenzip.pas' , - Snmp in '..\..\source\windows\Snmp.pas' , - JclCppException in '..\..\source\windows\JclCppException.pas' + Snmp in '..\..\source\windows\Snmp.pas' ; end. Modified: trunk/jcl/packages/d12/Jcl.dproj =================================================================== --- trunk/jcl/packages/d12/Jcl.dproj 2011-06-16 09:26:18 UTC (rev 3541) +++ trunk/jcl/packages/d12/Jcl.dproj 2011-06-17 09:46:16 UTC (rev 3542) @@ -106,6 +106,7 @@ <DCCReference Include="..\..\source\windows\JclCLR.pas"/> <DCCReference Include="..\..\source\windows\JclCOM.pas"/> <DCCReference Include="..\..\source\windows\JclConsole.pas"/> + <DCCReference Include="..\..\source\windows\JclCppException.pas"/> <DCCReference Include="..\..\source\windows\JclDebug.pas"/> <DCCReference Include="..\..\source\windows\JclDebugSerialization.pas"/> <DCCReference Include="..\..\source\windows\JclDebugXMLDeserializer.pas"/> @@ -137,7 +138,6 @@ <DCCReference Include="..\..\source\windows\MSTask.pas"/> <DCCReference Include="..\..\source\windows\sevenzip.pas"/> <DCCReference Include="..\..\source\windows\Snmp.pas"/> - <DCCReference Include="..\..\source\windows\JclCppException.pas"/> <BuildConfiguration Include="Base"> <Key>Base</Key> </BuildConfiguration> Modified: trunk/jcl/packages/d14/Jcl.dpk =================================================================== --- trunk/jcl/packages/d14/Jcl.dpk 2011-06-16 09:26:18 UTC (rev 3541) +++ trunk/jcl/packages/d14/Jcl.dpk 2011-06-17 09:46:16 UTC (rev 3542) @@ -4,7 +4,7 @@ DO NOT EDIT THIS FILE, IT IS GENERATED BY THE PACKAGE GENERATOR ALWAYS EDIT THE RELATED XML FILE (Jcl-R.xml) - Last generated: 27-05-2011 01:09:18 UTC + Last generated: 17-06-2011 09:43:14 UTC ----------------------------------------------------------------------------- } @@ -91,6 +91,7 @@ JclCLR in '..\..\source\windows\JclCLR.pas' , JclCOM in '..\..\source\windows\JclCOM.pas' , JclConsole in '..\..\source\windows\JclConsole.pas' , + JclCppException in '..\..\source\windows\JclCppException.pas' , JclDebug in '..\..\source\windows\JclDebug.pas' , JclDebugSerialization in '..\..\source\windows\JclDebugSerialization.pas' , JclDebugXMLDeserializer in '..\..\source\windows\JclDebugXMLDeserializer.pas' , @@ -121,8 +122,7 @@ mscorlib_TLB in '..\..\source\windows\mscorlib_TLB.pas' , MSTask in '..\..\source\windows\MSTask.pas' , sevenzip in '..\..\source\windows\sevenzip.pas' , - Snmp in '..\..\source\windows\Snmp.pas' , - JclCppException in '..\..\source\windows\JclCppException.pas' + Snmp in '..\..\source\windows\Snmp.pas' ; end. Modified: trunk/jcl/packages/d14/Jcl.dproj =================================================================== --- trunk/jcl/packages/d14/Jcl.dproj 2011-06-16 09:26:18 UTC (rev 3541) +++ trunk/jcl/packages/d14/Jcl.dproj 2011-06-17 09:46:16 UTC (rev 3542) @@ -108,6 +108,7 @@ <DCCReference Include="..\..\source\windows\JclCLR.pas"/> <DCCReference Include="..\..\source\windows\JclCOM.pas"/> <DCCReference Include="..\..\source\windows\JclConsole.pas"/> + <DCCReference Include="..\..\source\windows\JclCppException.pas"/> <DCCReference Include="..\..\source\windows\JclDebug.pas"/> <DCCReference Include="..\..\source\windows\JclDebugSerialization.pas"/> <DCCReference Include="..\..\source\windows\JclDebugXMLDeserializer.pas"/> @@ -139,7 +140,6 @@ <DCCReference Include="..\..\source\windows\MSTask.pas"/> <DCCReference Include="..\..\source\windows\sevenzip.pas"/> <DCCReference Include="..\..\source\windows\Snmp.pas"/> - <DCCReference Include="..\..\source\windows\JclCppException.pas"/> <BuildConfiguration Include="Base"> <Key>Base</Key> </BuildConfiguration> Modified: trunk/jcl/packages/d15/Jcl.dpk =================================================================== --- trunk/jcl/packages/d15/Jcl.dpk 2011-06-16 09:26:18 UTC (rev 3541) +++ trunk/jcl/packages/d15/Jcl.dpk 2011-06-17 09:46:16 UTC (rev 3542) @@ -4,7 +4,7 @@ DO NOT EDIT THIS FILE, IT IS GENERATED BY THE PACKAGE GENERATOR ALWAYS EDIT THE RELATED XML FILE (Jcl-R.xml) - Last generated: 27-05-2011 01:09:19 UTC + Last generated: 17-06-2011 09:43:14 UTC ----------------------------------------------------------------------------- } @@ -90,6 +90,7 @@ JclCLR in '..\..\source\windows\JclCLR.pas' , JclCOM in '..\..\source\windows\JclCOM.pas' , JclConsole in '..\..\source\windows\JclConsole.pas' , + JclCppException in '..\..\source\windows\JclCppException.pas' , JclDebug in '..\..\source\windows\JclDebug.pas' , JclDebugSerialization in '..\..\source\windows\JclDebugSerialization.pas' , JclDebugXMLDeserializer in '..\..\source\windows\JclDebugXMLDeserializer.pas' , @@ -120,8 +121,7 @@ mscorlib_TLB in '..\..\source\windows\mscorlib_TLB.pas' , MSTask in '..\..\source\windows\MSTask.pas' , sevenzip in '..\..\source\windows\sevenzip.pas' , - Snmp in '..\..\source\windows\Snmp.pas' , - JclCppException in '..\..\source\windows\JclCppException.pas' + Snmp in '..\..\source\windows\Snmp.pas' ; end. Modified: trunk/jcl/packages/d15/Jcl.dproj =================================================================== --- trunk/jcl/packages/d15/Jcl.dproj 2011-06-16 09:26:18 UTC (rev 3541) +++ trunk/jcl/packages/d15/Jcl.dproj 2011-06-17 09:46:16 UTC (rev 3542) @@ -115,6 +115,7 @@ <DCCReference Include="..\..\source\windows\JclCLR.pas"/> <DCCReference Include="..\..\source\windows\JclCOM.pas"/> <DCCReference Include="..\..\source\windows\JclConsole.pas"/> + <DCCReference Include="..\..\source\windows\JclCppException.pas"/> <DCCReference Include="..\..\source\windows\JclDebug.pas"/> <DCCReference Include="..\..\source\windows\JclDebugSerialization.pas"/> <DCCReference Include="..\..\source\windows\JclDebugXMLDeserializer.pas"/> @@ -146,7 +147,6 @@ <DCCReference Include="..\..\source\windows\MSTask.pas"/> <DCCReference Include="..\..\source\windows\sevenzip.pas"/> <DCCReference Include="..\..\source\windows\Snmp.pas"/> - <DCCReference Include="..\..\source\windows\JclCppException.pas"/> <BuildConfiguration Include="Release"> <Key>Cfg_Release</Key> <CfgParent>Base</CfgParent> Modified: trunk/jcl/packages/d6/Jcl.dpk =================================================================== --- trunk/jcl/packages/d6/Jcl.dpk 2011-06-16 09:26:18 UTC (rev 3541) +++ trunk/jcl/packages/d6/Jcl.dpk 2011-06-17 09:46:16 UTC (rev 3542) @@ -4,7 +4,7 @@ DO NOT EDIT THIS FILE, IT IS GENERATED BY THE PACKAGE GENERATOR ALWAYS EDIT THE RELATED XML FILE (Jcl-R.xml) - Last generated: 27-05-2011 01:09:13 UTC + Last generated: 17-06-2011 09:43:09 UTC ----------------------------------------------------------------------------- } @@ -90,6 +90,7 @@ JclCLR in '..\..\source\windows\JclCLR.pas' , JclCOM in '..\..\source\windows\JclCOM.pas' , JclConsole in '..\..\source\windows\JclConsole.pas' , + JclCppException in '..\..\source\windows\JclCppException.pas' , JclDebug in '..\..\source\windows\JclDebug.pas' , JclDebugSerialization in '..\..\source\windows\JclDebugSerialization.pas' , JclDebugXMLDeserializer in '..\..\source\windows\JclDebugXMLDeserializer.pas' , @@ -120,8 +121,7 @@ mscorlib_TLB in '..\..\source\windows\mscorlib_TLB.pas' , MSTask in '..\..\source\windows\MSTask.pas' , sevenzip in '..\..\source\windows\sevenzip.pas' , - Snmp in '..\..\source\windows\Snmp.pas' , - JclCppException in '..\..\source\windows\JclCppException.pas' + Snmp in '..\..\source\windows\Snmp.pas' ; end. Modified: trunk/jcl/packages/d7/Jcl.dpk =================================================================== --- trunk/jcl/packages/d7/Jcl.dpk 2011-06-16 09:26:18 UTC (rev 3541) +++ trunk/jcl/packages/d7/Jcl.dpk 2011-06-17 09:46:16 UTC (rev 3542) @@ -4,7 +4,7 @@ DO NOT EDIT THIS FILE, IT IS GENERATED BY THE PACKAGE GENERATOR ALWAYS EDIT THE RELATED XML FILE (Jcl-R.xml) - Last generated: 27-05-2011 01:09:13 UTC + Last generated: 17-06-2011 09:43:10 UTC ----------------------------------------------------------------------------- } @@ -90,6 +90,7 @@ JclCLR in '..\..\source\windows\JclCLR.pas' , JclCOM in '..\..\source\windows\JclCOM.pas' , JclConsole in '..\..\source\windows\JclConsole.pas' , + JclCppException in '..\..\source\windows\JclCppException.pas' , JclDebug in '..\..\source\windows\JclDebug.pas' , JclDebugSerialization in '..\..\source\windows\JclDebugSerialization.pas' , JclDebugXMLDeserializer in '..\..\source\windows\JclDebugXMLDeserializer.pas' , @@ -120,8 +121,7 @@ mscorlib_TLB in '..\..\source\windows\mscorlib_TLB.pas' , MSTask in '..\..\source\windows\MSTask.pas' , sevenzip in '..\..\source\windows\sevenzip.pas' , - Snmp in '..\..\source\windows\Snmp.pas' , - JclCppException in '..\..\source\windows\JclCppException.pas' + Snmp in '..\..\source\windows\Snmp.pas' ; end. Modified: trunk/jcl/packages/d9/Jcl.dpk =================================================================== --- trunk/jcl/packages/d9/Jcl.dpk 2011-06-16 09:26:18 UTC (rev 3541) +++ trunk/jcl/packages/d9/Jcl.dpk 2011-06-17 09:46:16 UTC (rev 3542) @@ -4,7 +4,7 @@ DO NOT EDIT THIS FILE, IT IS GENERATED BY THE PACKAGE GENERATOR ALWAYS EDIT THE RELATED XML FILE (Jcl-R.xml) - Last generated: 27-05-2011 01:09:14 UTC + Last generated: 17-06-2011 09:43:11 UTC ----------------------------------------------------------------------------- } @@ -90,6 +90,7 @@ JclCLR in '..\..\source\windows\JclCLR.pas' , JclCOM in '..\..\source\windows\JclCOM.pas' , JclConsole in '..\..\source\windows\JclConsole.pas' , + JclCppException in '..\..\source\windows\JclCppException.pas' , JclDebug in '..\..\source\windows\JclDebug.pas' , JclDebugSerialization in '..\..\source\windows\JclDebugSerialization.pas' , JclDebugXMLDeserializer in '..\..\source\windows\JclDebugXMLDeserializer.pas' , @@ -120,8 +121,7 @@ mscorlib_TLB in '..\..\source\windows\mscorlib_TLB.pas' , MSTask in '..\..\source\windows\MSTask.pas' , sevenzip in '..\..\source\windows\sevenzip.pas' , - Snmp in '..\..\source\windows\Snmp.pas' , - JclCppException in '..\..\source\windows\JclCppException.pas' + Snmp in '..\..\source\windows\Snmp.pas' ; end. Modified: trunk/jcl/packages/fpc/Jcl.lpk =================================================================== --- trunk/jcl/packages/fpc/Jcl.lpk 2011-06-16 09:26:18 UTC (rev 3541) +++ trunk/jcl/packages/fpc/Jcl.lpk 2011-06-17 09:46:16 UTC (rev 3542) @@ -221,128 +221,128 @@ <UnitName Value="JclConsole"/> </Item45> <Item46> + <Filename Value="..\..\source\windows\JclCppException.pas"/> + <UnitName Value="JclCppException"/> + </Item46> + <Item47> <Filename Value="..\..\source\windows\JclDebug.pas"/> <UnitName Value="JclDebug"/> - </Item46> - <Item47> + </Item47> + <Item48> <Filename Value="..\..\source\windows\JclDebugSerialization.pas"/> <UnitName Value="JclDebugSerialization"/> - </Item47> - <Item48> + </Item48> + <Item49> <Filename Value="..\..\source\windows\JclDebugXMLDeserializer.pas"/> <UnitName Value="JclDebugXMLDeserializer"/> - </Item48> - <Item49> + </Item49> + <Item50> <Filename Value="..\..\source\windows\JclDebugXMLSerializer.pas"/> <UnitName Value="JclDebugXMLSerializer"/> - </Item49> - <Item50> + </Item50> + <Item51> <Filename Value="..\..\source\windows\JclDotNet.pas"/> <UnitName Value="JclDotNet"/> - </Item50> - <Item51> + </Item51> + <Item52> <Filename Value="..\..\source\windows\JclHookExcept.pas"/> <UnitName Value="JclHookExcept"/> - </Item51> - <Item52> + </Item52> + <Item53> <Filename Value="..\..\source\windows\JclLANMan.pas"/> <UnitName Value="JclLANMan"/> - </Item52> - <Item53> + </Item53> + <Item54> <Filename Value="..\..\source\windows\JclLocales.pas"/> <UnitName Value="JclLocales"/> - </Item53> - <Item54> + </Item54> + <Item55> <Filename Value="..\..\source\windows\JclMetadata.pas"/> <UnitName Value="JclMetadata"/> - </Item54> - <Item55> + </Item55> + <Item56> <Filename Value="..\..\source\windows\JclMiscel.pas"/> <UnitName Value="JclMiscel"/> - </Item55> - <Item56> + </Item56> + <Item57> <Filename Value="..\..\source\windows\JclMsdosSys.pas"/> <UnitName Value="JclMsdosSys"/> - </Item56> - <Item57> + </Item57> + <Item58> <Filename Value="..\..\source\windows\JclMultimedia.pas"/> <UnitName Value="JclMultimedia"/> - </Item57> - <Item58> + </Item58> + <Item59> <Filename Value="..\..\source\windows\JclNTFS.pas"/> <UnitName Value="JclNTFS"/> - </Item58> - <Item59> + </Item59> + <Item60> <Filename Value="..\..\source\windows\JclPeImage.pas"/> <UnitName Value="JclPeImage"/> - </Item59> - <Item60> + </Item60> + <Item61> <Filename Value="..\..\source\windows\JclRegistry.pas"/> <UnitName Value="JclRegistry"/> - </Item60> - <Item61> + </Item61> + <Item62> <Filename Value="..\..\source\windows\JclSecurity.pas"/> <UnitName Value="JclSecurity"/> - </Item61> - <Item62> + </Item62> + <Item63> <Filename Value="..\..\source\windows\JclShell.pas"/> <UnitName Value="JclShell"/> - </Item62> - <Item63> + </Item63> + <Item64> <Filename Value="..\..\source\windows\JclStructStorage.pas"/> <UnitName Value="JclStructStorage"/> - </Item63> - <Item64> + </Item64> + <Item65> <Filename Value="..\..\source\windows\JclSvcCtrl.pas"/> <UnitName Value="JclSvcCtrl"/> - </Item64> - <Item65> + </Item65> + <Item66> <Filename Value="..\..\source\windows\JclTask.pas"/> <UnitName Value="JclTask"/> - </Item65> - <Item66> + </Item66> + <Item67> <Filename Value="..\..\source\windows\JclTD32.pas"/> <UnitName Value="JclTD32"/> - </Item66> - <Item67> + </Item67> + <Item68> <Filename Value="..\..\source\windows\JclTimeZones.pas"/> <UnitName Value="JclTimeZones"/> - </Item67> - <Item68> + </Item68> + <Item69> <Filename Value="..\..\source\windows\JclWin32.pas"/> <UnitName Value="JclWin32"/> - </Item68> - <Item69> + </Item69> + <Item70> <Filename Value="..\..\source\windows\JclWin32Ex.pas"/> <UnitName Value="JclWin32Ex"/> - </Item69> - <Item70> + </Item70> + <Item71> <Filename Value="..\..\source\windows\JclWinMIDI.pas"/> <UnitName Value="JclWinMIDI"/> - </Item70> - <Item71> + </Item71> + <Item72> <Filename Value="..\..\source\windows\mscoree_TLB.pas"/> <UnitName Value="mscoree_TLB"/> - </Item71> - <Item72> + </Item72> + <Item73> <Filename Value="..\..\source\windows\mscorlib_TLB.pas"/> <UnitName Value="mscorlib_TLB"/> - </Item72> - <Item73> + </Item73> + <Item74> <Filename Value="..\..\source\windows\MSTask.pas"/> <UnitName Value="MSTask"/> - </Item73> - <Item74> + </Item74> + <Item75> <Filename Value="..\..\source\windows\sevenzip.pas"/> <UnitName Value="sevenzip"/> - </Item74> - <Item75> + </Item75> + <Item76> <Filename Value="..\..\source\windows\Snmp.pas"/> <UnitName Value="Snmp"/> - </Item75> - <Item76> - <Filename Value="..\..\source\windows\JclCppException.pas"/> - <UnitName Value="JclCppException"/> </Item76> </Files> <RequiredPkgs Count="1"> Modified: trunk/jcl/packages/fpc/Jcl.pas =================================================================== --- trunk/jcl/packages/fpc/Jcl.pas 2011-06-16 09:26:18 UTC (rev 3541) +++ trunk/jcl/packages/fpc/Jcl.pas 2011-06-17 09:46:16 UTC (rev 3542) @@ -3,7 +3,7 @@ DO NOT EDIT THIS FILE, IT IS GENERATED BY THE PACKAGE GENERATOR ALWAYS EDIT THE RELATED XML FILE (Jcl-R.xml) - Last generated: 27-05-2011 01:09:11 UTC + Last generated: 17-06-2011 09:43:08 UTC ----------------------------------------------------------------------------- } @@ -57,6 +57,7 @@ JclCLR, JclCOM, JclConsole, + JclCppException, JclDebug, JclDebugSerialization, JclDebugXMLDeserializer, @@ -86,8 +87,7 @@ mscorlib_TLB, MSTask, sevenzip, - Snmp, - JclCppException + Snmp ; implementation Modified: trunk/jcl/packages/help/Jcl.dox =================================================================== --- trunk/jcl/packages/help/Jcl.dox 2011-06-16 09:26:18 UTC (rev 3541) +++ trunk/jcl/packages/help/Jcl.dox 2011-06-17 09:46:16 UTC (rev 3542) @@ -108,82 +108,82 @@ File74=..\..\source\windows\JclCLR.pas File75=..\..\source\windows\JclCOM.pas File76=..\..\source\windows\JclConsole.pas -File77=..\..\source\windows\JclDebug.pas -File78=..\..\source\windows\JclDebugSerialization.pas -File79=..\..\source\windows\JclDebugXMLDeserializer.pas -File80=..\..\source\windows\JclDebugXMLSerializer.pas -File81=..\..\source\windows\JclHookExcept.pas -File82=..\..\source\windows\JclLANMan.pas -File83=..\..\source\windows\JclLocales.pas -File84=..\..\source\windows\JclMapi.pas -File85=..\..\source\windows\JclMetadata.pas -File86=..\..\source\windows\JclMiscel.pas -File87=..\..\source\windows\JclMsdosSys.pas -File88=..\..\source\windows\JclMultimedia.pas -File89=..\..\source\windows\JclNTFS.pas -File90=..\..\source\windows\JclPeImage.pas -File91=..\..\source\windows\JclRegistry.pas -File92=..\..\source\windows\JclSecurity.pas -File93=..\..\source\windows\JclShell.pas -File94=..\..\source\windows\JclStructStorage.pas -File95=..\..\source\windows\JclSvcCtrl.pas -File96=..\..\source\windows\JclTask.pas -File97=..\..\source\windows\JclTD32.pas -File98=..\..\source\windows\JclTimeZones.pas -File99=..\..\source\windows\JclWin32.pas -File100=..\..\source\windows\JclWin32Ex.pas -File101=..\..\source\windows\JclWinMIDI.pas -File102=..\..\source\windows\mscoree_TLB.pas -File103=..\..\source\windows\mscorlib_TLB.pas -File104=..\..\source\windows\MSTask.pas -File105=..\..\source\windows\sevenzip.pas -File106=..\..\source\windows\Snmp.pas -File107=..\..\..\help\8087.dtx -File108=..\..\..\help\AppInst.dtx -File109=..\..\..\help\Base.dtx -File110=..\..\..\help\Com.dtx -File111=..\..\..\help\Common.dtx -File112=..\..\..\help\Complex.dtx -File113=..\..\..\help\Counter.dtx -File114=..\..\..\help\DateTime.dtx -File115=..\..\..\help\Debug.dtx -File116=..\..\..\help\ExprEval.dtx -File117=..\..\..\help\FileUtils.dtx -File118=..\..\..\help\Hardlinks.dtx -File119=..\..\..\help\IncludedFiles.dtx -File120=..\..\..\help\IniFiles.dtx -File121=..\..\..\help\Jcl.dtx -File122=..\..\..\help\LANMan.dtx -File123=..\..\..\help\Locales.dtx -File124=..\..\..\help\Logic.dtx -File125=..\..\..\help\Mapi.dtx -File126=..\..\..\help\Math.dtx -File127=..\..\..\help\Midi.dtx -File128=..\..\..\help\Mime.dtx -File129=..\..\..\help\Miscel.dtx -File130=..\..\..\help\Multimedia.dtx -File131=..\..\..\help\Notify.dtx -File132=..\..\..\help\NTFS.dtx -File133=..\..\..\help\pcre.dtx -File134=..\..\..\help\PE.dtx -File135=..\..\..\help\Registry.dtx -File136=..\..\..\help\RTTI.dtx -File137=..\..\..\help\Schedule.dtx -File138=..\..\..\help\Security.dtx -File139=..\..\..\help\Shell.dtx -File140=..\..\..\help\Statistics.dtx -File141=..\..\..\help\Streams.dtx -File142=..\..\..\help\StrHashMap.dtx -File143=..\..\..\help\Strings.dtx -File144=..\..\..\help\SvcCtrl.dtx -File145=..\..\..\help\Synch.dtx -File146=..\..\..\help\SysInfo.dtx -File147=..\..\..\help\SysUtils.dtx -File148=..\..\..\help\Unicode.dtx -File149=..\..\..\help\UnitConv.dtx -File150=..\..\..\help\WideStrings.dtx -File151=..\..\..\help\Win32.dtx -File152=..\..\source\windows\JclCppException.pas +File77=..\..\source\windows\JclCppException.pas +File78=..\..\source\windows\JclDebug.pas +File79=..\..\source\windows\JclDebugSerialization.pas +File80=..\..\source\windows\JclDebugXMLDeserializer.pas +File81=..\..\source\windows\JclDebugXMLSerializer.pas +File82=..\..\source\windows\JclHookExcept.pas +File83=..\..\source\windows\JclLANMan.pas +File84=..\..\source\windows\JclLocales.pas +File85=..\..\source\windows\JclMapi.pas +File86=..\..\source\windows\JclMetadata.pas +File87=..\..\source\windows\JclMiscel.pas +File88=..\..\source\windows\JclMsdosSys.pas +File89=..\..\source\windows\JclMultimedia.pas +File90=..\..\source\windows\JclNTFS.pas +File91=..\..\source\windows\JclPeImage.pas +File92=..\..\source\windows\JclRegistry.pas +File93=..\..\source\windows\JclSecurity.pas +File94=..\..\source\windows\JclShell.pas +File95=..\..\source\windows\JclStructStorage.pas +File96=..\..\source\windows\JclSvcCtrl.pas +File97=..\..\source\windows\JclTask.pas +File98=..\..\source\windows\JclTD32.pas +File99=..\..\source\windows\JclTimeZones.pas +File100=..\..\source\windows\JclWin32.pas +File101=..\..\source\windows\JclWin32Ex.pas +File102=..\..\source\windows\JclWinMIDI.pas +File103=..\..\source\windows\mscoree_TLB.pas +File104=..\..\source\windows\mscorlib_TLB.pas +File105=..\..\source\windows\MSTask.pas +File106=..\..\source\windows\sevenzip.pas +File107=..\..\source\windows\Snmp.pas +File108=..\..\..\help\8087.dtx +File109=..\..\..\help\AppInst.dtx +File110=..\..\..\help\Base.dtx +File111=..\..\..\help\Com.dtx +File112=..\..\..\help\Common.dtx +File113=..\..\..\help\Complex.dtx +File114=..\..\..\help\Counter.dtx +File115=..\..\..\help\DateTime.dtx +File116=..\..\..\help\Debug.dtx +File117=..\..\..\help\ExprEval.dtx +File118=..\..\..\help\FileUtils.dtx +File119=..\..\..\help\Hardlinks.dtx +File120=..\..\..\help\IncludedFiles.dtx +File121=..\..\..\help\IniFiles.dtx +File122=..\..\..\help\Jcl.dtx +File123=..\..\..\help\LANMan.dtx +File124=..\..\..\help\Locales.dtx +File125=..\..\..\help\Logic.dtx +File126=..\..\..\help\Mapi.dtx +File127=..\..\..\help\Math.dtx +File128=..\..\..\help\Midi.dtx +File129=..\..\..\help\Mime.dtx +File130=..\..\..\help\Miscel.dtx +File131=..\..\..\help\Multimedia.dtx +File132=..\..\..\help\Notify.dtx +File133=..\..\..\help\NTFS.dtx +File134=..\..\..\help\pcre.dtx +File135=..\..\..\help\PE.dtx +File136=..\..\..\help\Registry.dtx +File137=..\..\..\help\RTTI.dtx +File138=..\..\..\help\Schedule.dtx +File139=..\..\..\help\Security.dtx +File140=..\..\..\help\Shell.dtx +File141=..\..\..\help\Statistics.dtx +File142=..\..\..\help\Streams.dtx +File143=..\..\..\help\StrHashMap.dtx +File144=..\..\..\help\Strings.dtx +File145=..\..\..\help\SvcCtrl.dtx +File146=..\..\..\help\Synch.dtx +File147=..\..\..\help\SysInfo.dtx +File148=..\..\..\help\SysUtils.dtx +File149=..\..\..\help\Unicode.dtx +File150=..\..\..\help\UnitConv.dtx +File151=..\..\..\help\WideStrings.dtx +File152=..\..\..\help\Win32.dtx [General] Copyright=Copyright (C) 1999, 2011 Project JEDI Modified: trunk/jcl/packages/xml/Jcl-R.xml =================================================================== --- trunk/jcl/packages/xml/Jcl-R.xml 2011-06-16 09:26:18 UTC (rev 3541) +++ trunk/jcl/packages/xml/Jcl-R.xml 2011-06-17 09:46:16 UTC (rev 3542) @@ -95,6 +95,7 @@ <File Name="..\..\source\windows\JclCLR.pas" Targets="Windows" Formname="" Condition=""/> <File Name="..\..\source\windows\JclCOM.pas" Targets="Windows" Formname="" Condition=""/> <File Name="..\..\source\windows\JclConsole.pas" Targets="Windows" Formname="" Condition=""/> + <File Name="..\..\source\windows\JclCppException.pas" Targets="Windows" Formname="" Condition=""/> <File Name="..\..\source\windows\JclDebug.pas" Targets="Windows" Formname="" Condition=""/> <File Name="..\..\source\windows\JclDebugSerialization.pas" Targets="Windows" Formname="" Condition=""/> <File Name="..\..\source\windows\JclDebugXMLDeserializer.pas" Targets="Windows" Formname="" Condition=""/> @@ -171,6 +172,5 @@ <File Name="..\..\..\help\UnitConv.dtx" Targets="help" Formname="" Condition=""/> <File Name="..\..\..\help\WideStrings.dtx" Targets="help" Formname="" Condition=""/> <File Name="..\..\..\help\Win32.dtx" Targets="help" Formname="" Condition=""/> - <File Name="..\..\source\windows\JclCppException.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: <ou...@us...> - 2011-06-16 09:26:24
|
Revision: 3541 http://jcl.svn.sourceforge.net/jcl/?rev=3541&view=rev Author: outchy Date: 2011-06-16 09:26:18 +0000 (Thu, 16 Jun 2011) Log Message: ----------- basic documentation for JCL packages/files/classes/interfaces/records/types/variables/constants. Modified Paths: -------------- trunk/jcl/packages/xml/Jcl-R.xml trunk/jcl/packages/xml/JclContainers-R.xml trunk/jcl/packages/xml/JclDeveloperTools-R.xml trunk/jcl/packages/xml/JclVcl-R.xml Modified: trunk/jcl/packages/xml/Jcl-R.xml =================================================================== --- trunk/jcl/packages/xml/Jcl-R.xml 2011-06-16 09:24:18 UTC (rev 3540) +++ trunk/jcl/packages/xml/Jcl-R.xml 2011-06-16 09:26:18 UTC (rev 3541) @@ -130,6 +130,7 @@ <File Name="..\..\..\help\AppInst.dtx" Targets="help" Formname="" Condition=""/> <File Name="..\..\..\help\Base.dtx" Targets="help" Formname="" Condition=""/> <File Name="..\..\..\help\Com.dtx" Targets="help" Formname="" Condition=""/> + <File Name="..\..\..\help\Common.dtx" Targets="help" Formname="" Condition=""/> <File Name="..\..\..\help\Complex.dtx" Targets="help" Formname="" Condition=""/> <File Name="..\..\..\help\Counter.dtx" Targets="help" Formname="" Condition=""/> <File Name="..\..\..\help\DateTime.dtx" Targets="help" Formname="" Condition=""/> Modified: trunk/jcl/packages/xml/JclContainers-R.xml =================================================================== --- trunk/jcl/packages/xml/JclContainers-R.xml 2011-06-16 09:24:18 UTC (rev 3540) +++ trunk/jcl/packages/xml/JclContainers-R.xml 2011-06-16 09:26:18 UTC (rev 3541) @@ -32,6 +32,7 @@ <File Name="..\..\source\common\JclStacks.pas" Targets="all" Formname="" Condition=""/> <File Name="..\..\source\common\JclTrees.pas" Targets="all" Formname="" Condition=""/> <File Name="..\..\source\common\JclVectors.pas" Targets="all" Formname="" Condition=""/> + <File Name="..\..\..\help\Common.dtx" Targets="help" Formname="" Condition=""/> <File Name="..\..\..\help\ContainerCopies.dtx" Targets="help" Formname="" Condition=""/> <File Name="..\..\..\help\Containers.dtx" Targets="help" Formname="" Condition=""/> <File Name="..\..\..\help\JclContainers.dtx" Targets="help" Formname="" Condition=""/> Modified: trunk/jcl/packages/xml/JclDeveloperTools-R.xml =================================================================== --- trunk/jcl/packages/xml/JclDeveloperTools-R.xml 2011-06-16 09:24:18 UTC (rev 3540) +++ trunk/jcl/packages/xml/JclDeveloperTools-R.xml 2011-06-16 09:26:18 UTC (rev 3541) @@ -47,6 +47,7 @@ <File Name="..\..\source\common\JclUsesUtils.pas" Targets="all" Formname="" Condition=""/> <File Name="..\..\source\windows\JclHelpUtils.pas" Targets="Windows" Formname="" Condition=""/> <File Name="..\..\source\windows\MSHelpServices_TLB.pas" Targets="Windows" Formname="" Condition=""/> + <File Name="..\..\..\help\Common.dtx" Targets="help" Formname="" Condition=""/> <File Name="..\..\..\help\JclDeveloperTools.dtx" Targets="help" Formname="" Condition=""/> </Contains> </Package> Modified: trunk/jcl/packages/xml/JclVcl-R.xml =================================================================== --- trunk/jcl/packages/xml/JclVcl-R.xml 2011-06-16 09:24:18 UTC (rev 3540) +++ trunk/jcl/packages/xml/JclVcl-R.xml 2011-06-16 09:26:18 UTC (rev 3541) @@ -28,6 +28,7 @@ <File Name="..\..\source\vcl\JclVersionCtrlGITImpl.pas" Targets="Vcl" Formname="" Condition=""/> <File Name="..\..\source\vcl\JclVersionCtrlSVNImpl.pas" Targets="Vcl" Formname="" Condition=""/> <File Name="..\..\..\help\Bitmap32.dtx" Targets="help" Formname="" Condition=""/> + <File Name="..\..\..\help\Common.dtx" Targets="help" Formname="" Condition=""/> <File Name="..\..\..\help\Font.dtx" Targets="help" Formname="" Condition=""/> <File Name="..\..\..\help\Graphics.dtx" Targets="help" Formname="" Condition=""/> <File Name="..\..\..\help\JclVcl.dtx" Targets="help" Formname="" Condition=""/> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ou...@us...> - 2011-06-16 09:24:25
|
Revision: 3540 http://jcl.svn.sourceforge.net/jcl/?rev=3540&view=rev Author: outchy Date: 2011-06-16 09:24:18 +0000 (Thu, 16 Jun 2011) Log Message: ----------- basic documentation for JCL packages/files/classes/interfaces/records/types/variables/constants. Modified Paths: -------------- trunk/jcl/packages/help/Jcl.dox trunk/jcl/packages/help/JclContainers.dox trunk/jcl/packages/help/JclDeveloperTools.dox trunk/jcl/packages/help/JclVcl.dox Added Paths: ----------- trunk/help/Common.dtx Added: trunk/help/Common.dtx =================================================================== --- trunk/help/Common.dtx (rev 0) +++ trunk/help/Common.dtx 2011-06-16 09:24:18 UTC (rev 3540) @@ -0,0 +1,60 @@ + +@@!!SYMREF +Summary +The list of packages in the JCL. +Description +The JCL is split into several packages, each one dedicated to +some feature family. + +@@!!CLASSES +Summary +The list of classes in the JCL. +Description +This list contains all the classes declared in the JCL. Each +class member is then documented in its own page. + +@@!!INTERFACES +Summary +The list of interfaces in the JCL. +Description +This list contains all the interfaces declared in the JCL. +Each interface member is then documented in its own page. + +@@!!FUNCTIONS +Summary +The list of functions in the JCL. +Description +This list contains all the functions declared in the JCL. + +@@!!RECORDS +Summary +The list of records and enumerations in the JCL. +Description +This list contains all the records and enumerations declared +in the JCL. + +@@!!TYPES +Summary +The list of types in the JCL. +Description +This list contains all the types declared in the JCL. + +@@!!VARIABLES +Summary +The list of global variables in the JCL. +Description +This list contains all the global variables declared in the +JCL. + +@@!!CONSTANTS +Summary +The list of constants in the JCL. +Description +This list contains all the constants declared in the JCL. + +@@!!FILES +Summary +The list of files in the JCL. +Description +This list contains all the files declared in the JCL. Each +file member is then documented in its own page. Property changes on: trunk/help/Common.dtx ___________________________________________________________________ Added: svn:eol-style + native Modified: trunk/jcl/packages/help/Jcl.dox =================================================================== --- trunk/jcl/packages/help/Jcl.dox 2011-06-14 05:49:00 UTC (rev 3539) +++ trunk/jcl/packages/help/Jcl.dox 2011-06-16 09:24:18 UTC (rev 3540) @@ -1,4 +1,4 @@ -; This is a Doc-O-Matic version 6.5.1.1382 project file. +; This is a Doc-O-Matic version 6.5.1.1382 project file. ; This file is maintained by Doc-O-Matic, do not edit manually. [*Control*] @@ -30,7 +30,7 @@ File1=..\..\..\help\JEDI.doxdb [Source Files] -Count=152 +Count=153 File0=..\..\source\include\crossplatform.inc File1=..\..\source\include\jcl.inc File2=..\..\source\include\jclc6.inc @@ -142,47 +142,48 @@ File108=..\..\..\help\AppInst.dtx File109=..\..\..\help\Base.dtx File110=..\..\..\help\Com.dtx -File111=..\..\..\help\Complex.dtx -File112=..\..\..\help\Counter.dtx -File113=..\..\..\help\DateTime.dtx -File114=..\..\..\help\Debug.dtx -File115=..\..\..\help\ExprEval.dtx -File116=..\..\..\help\FileUtils.dtx -File117=..\..\..\help\Hardlinks.dtx -File118=..\..\..\help\IncludedFiles.dtx -File119=..\..\..\help\IniFiles.dtx -File120=..\..\..\help\Jcl.dtx -File121=..\..\..\help\LANMan.dtx -File122=..\..\..\help\Locales.dtx -File123=..\..\..\help\Logic.dtx -File124=..\..\..\help\Mapi.dtx -File125=..\..\..\help\Math.dtx -File126=..\..\..\help\Midi.dtx -File127=..\..\..\help\Mime.dtx -File128=..\..\..\help\Miscel.dtx -File129=..\..\..\help\Multimedia.dtx -File130=..\..\..\help\Notify.dtx -File131=..\..\..\help\NTFS.dtx -File132=..\..\..\help\pcre.dtx -File133=..\..\..\help\PE.dtx -File134=..\..\..\help\Registry.dtx -File135=..\..\..\help\RTTI.dtx -File136=..\..\..\help\Schedule.dtx -File137=..\..\..\help\Security.dtx -File138=..\..\..\help\Shell.dtx -File139=..\..\..\help\Statistics.dtx -File140=..\..\..\help\Streams.dtx -File141=..\..\..\help\StrHashMap.dtx -File142=..\..\..\help\Strings.dtx -File143=..\..\..\help\SvcCtrl.dtx -File144=..\..\..\help\Synch.dtx -File145=..\..\..\help\SysInfo.dtx -File146=..\..\..\help\SysUtils.dtx -File147=..\..\..\help\Unicode.dtx -File148=..\..\..\help\UnitConv.dtx -File149=..\..\..\help\WideStrings.dtx -File150=..\..\..\help\Win32.dtx -File151=..\..\source\windows\JclCppException.pas +File111=..\..\..\help\Common.dtx +File112=..\..\..\help\Complex.dtx +File113=..\..\..\help\Counter.dtx +File114=..\..\..\help\DateTime.dtx +File115=..\..\..\help\Debug.dtx +File116=..\..\..\help\ExprEval.dtx +File117=..\..\..\help\FileUtils.dtx +File118=..\..\..\help\Hardlinks.dtx +File119=..\..\..\help\IncludedFiles.dtx +File120=..\..\..\help\IniFiles.dtx +File121=..\..\..\help\Jcl.dtx +File122=..\..\..\help\LANMan.dtx +File123=..\..\..\help\Locales.dtx +File124=..\..\..\help\Logic.dtx +File125=..\..\..\help\Mapi.dtx +File126=..\..\..\help\Math.dtx +File127=..\..\..\help\Midi.dtx +File128=..\..\..\help\Mime.dtx +File129=..\..\..\help\Miscel.dtx +File130=..\..\..\help\Multimedia.dtx +File131=..\..\..\help\Notify.dtx +File132=..\..\..\help\NTFS.dtx +File133=..\..\..\help\pcre.dtx +File134=..\..\..\help\PE.dtx +File135=..\..\..\help\Registry.dtx +File136=..\..\..\help\RTTI.dtx +File137=..\..\..\help\Schedule.dtx +File138=..\..\..\help\Security.dtx +File139=..\..\..\help\Shell.dtx +File140=..\..\..\help\Statistics.dtx +File141=..\..\..\help\Streams.dtx +File142=..\..\..\help\StrHashMap.dtx +File143=..\..\..\help\Strings.dtx +File144=..\..\..\help\SvcCtrl.dtx +File145=..\..\..\help\Synch.dtx +File146=..\..\..\help\SysInfo.dtx +File147=..\..\..\help\SysUtils.dtx +File148=..\..\..\help\Unicode.dtx +File149=..\..\..\help\UnitConv.dtx +File150=..\..\..\help\WideStrings.dtx +File151=..\..\..\help\Win32.dtx +File152=..\..\source\windows\JclCppException.pas [General] Copyright=Copyright (C) 1999, 2011 Project JEDI Modified: trunk/jcl/packages/help/JclContainers.dox =================================================================== --- trunk/jcl/packages/help/JclContainers.dox 2011-06-14 05:49:00 UTC (rev 3539) +++ trunk/jcl/packages/help/JclContainers.dox 2011-06-16 09:24:18 UTC (rev 3540) @@ -31,7 +31,7 @@ File2=Jcl.doxdb [Source Files] -Count=17 +Count=18 File0=..\..\source\common\JclAbstractContainers.pas File1=..\..\source\common\JclAlgorithms.pas File2=..\..\source\common\JclArrayLists.pas @@ -46,9 +46,10 @@ File11=..\..\source\common\JclStacks.pas File12=..\..\source\common\JclTrees.pas File13=..\..\source\common\JclVectors.pas -File14=..\..\..\help\ContainerCopies.dtx -File15=..\..\..\help\Containers.dtx -File16=..\..\..\help\JclContainers.dtx +File14=..\..\..\help\Common.dtx +File15=..\..\..\help\ContainerCopies.dtx +File16=..\..\..\help\Containers.dtx +File17=..\..\..\help\JclContainers.dtx [General] Copyright=Copyright (C) 1999, 2011 Project JEDI Modified: trunk/jcl/packages/help/JclDeveloperTools.dox =================================================================== --- trunk/jcl/packages/help/JclDeveloperTools.dox 2011-06-14 05:49:00 UTC (rev 3539) +++ trunk/jcl/packages/help/JclDeveloperTools.dox 2011-06-16 09:24:18 UTC (rev 3540) @@ -32,7 +32,7 @@ File3=JclContainers.doxdb [Source Files] -Count=30 +Count=31 File0=..\..\source\common\JclCompilerUtils.pas File1=..\..\source\common\JclDevToolsResources.pas File2=..\..\source\common\JclIDEUtils.pas @@ -62,7 +62,8 @@ File26=..\..\source\common\JclUsesUtils.pas File27=..\..\source\windows\JclHelpUtils.pas File28=..\..\source\windows\MSHelpServices_TLB.pas -File29=..\..\..\help\JclDeveloperTools.dtx +File29=..\..\..\help\Common.dtx +File30=..\..\..\help\JclDeveloperTools.dtx [General] Copyright=Copyright (C) 1999, 2011 Project JEDI Modified: trunk/jcl/packages/help/JclVcl.dox =================================================================== --- trunk/jcl/packages/help/JclVcl.dox 2011-06-14 05:49:00 UTC (rev 3539) +++ trunk/jcl/packages/help/JclVcl.dox 2011-06-16 09:24:18 UTC (rev 3540) @@ -31,7 +31,7 @@ File2=Jcl.doxdb [Source Files] -Count=16 +Count=17 File0=..\..\source\vcl\JclPrint.pas File1=..\..\source\vcl\JclGraphUtils.pas File2=..\..\source\vcl\JclGraphics.pas @@ -44,10 +44,11 @@ File9=..\..\source\vcl\JclVersionCtrlGITImpl.pas File10=..\..\source\vcl\JclVersionCtrlSVNImpl.pas File11=..\..\..\help\Bitmap32.dtx -File12=..\..\..\help\Font.dtx -File13=..\..\..\help\Graphics.dtx -File14=..\..\..\help\JclVcl.dtx -File15=..\..\..\help\Regions.dtx +File12=..\..\..\help\Common.dtx +File13=..\..\..\help\Font.dtx +File14=..\..\..\help\Graphics.dtx +File15=..\..\..\help\JclVcl.dtx +File16=..\..\..\help\Regions.dtx [General] Copyright=Copyright (C) 1999, 2011 Project JEDI This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ou...@us...> - 2011-06-14 05:49:07
|
Revision: 3539 http://jcl.svn.sourceforge.net/jcl/?rev=3539&view=rev Author: outchy Date: 2011-06-14 05:49:00 +0000 (Tue, 14 Jun 2011) Log Message: ----------- add JclVersionCtrlGITImpl.pas from revision 3538. Revision Links: -------------- http://jcl.svn.sourceforge.net/jcl/?rev=3538&view=rev Modified Paths: -------------- trunk/jcl/packages/c6/JclVcl.bpk trunk/jcl/packages/c6/JclVcl.dpk trunk/jcl/packages/d10/JclVcl.dpk trunk/jcl/packages/d11/JclVcl.dpk trunk/jcl/packages/d11/JclVcl.dproj trunk/jcl/packages/d12/JclVcl.dpk trunk/jcl/packages/d12/JclVcl.dproj trunk/jcl/packages/d14/JclVcl.dpk trunk/jcl/packages/d14/JclVcl.dproj trunk/jcl/packages/d15/JclVcl.dpk trunk/jcl/packages/d15/JclVcl.dproj trunk/jcl/packages/d6/JclVcl.dpk trunk/jcl/packages/d7/JclVcl.dpk trunk/jcl/packages/d9/JclVcl.dpk trunk/jcl/packages/help/JclVcl.dox trunk/jcl/packages/xml/JclVcl-R.xml Modified: trunk/jcl/packages/c6/JclVcl.bpk =================================================================== --- trunk/jcl/packages/c6/JclVcl.bpk 2011-06-13 21:52:33 UTC (rev 3538) +++ trunk/jcl/packages/c6/JclVcl.bpk 2011-06-14 05:49:00 UTC (rev 3539) @@ -5,7 +5,7 @@ DO NOT EDIT THIS FILE, IT IS GENERATED BY THE PACKAGE GENERATOR ALWAYS EDIT THE RELATED XML FILE (JclVcl-R.xml) - Last generated: 27-03-2011 20:45:41 UTC + Last generated: 14-06-2011 05:46:15 UTC ***************************************************************************** --> <PROJECT> @@ -23,6 +23,7 @@ ..\..\lib\c6\JclVclResources.obj ..\..\lib\c6\JclVersionControl.obj ..\..\lib\c6\JclVersionCtrlCVSImpl.obj + ..\..\lib\c6\JclVersionCtrlGITImpl.obj ..\..\lib\c6\JclVersionCtrlSVNImpl.obj "/> <RESFILES value="JclVcl.res"/> @@ -89,6 +90,7 @@ <FILE FILENAME="..\..\source\vcl\JclVclResources.pas" FORMNAME="" UNITNAME="JclVclResources" CONTAINERID="PascalCompiler" DESIGNCLASS="" LOCALCOMMAND=""/> <FILE FILENAME="..\..\source\vcl\JclVersionControl.pas" FORMNAME="" UNITNAME="JclVersionControl" CONTAINERID="PascalCompiler" DESIGNCLASS="" LOCALCOMMAND=""/> <FILE FILENAME="..\..\source\vcl\JclVersionCtrlCVSImpl.pas" FORMNAME="" UNITNAME="JclVersionCtrlCVSImpl" CONTAINERID="PascalCompiler" DESIGNCLASS="" LOCALCOMMAND=""/> + <FILE FILENAME="..\..\source\vcl\JclVersionCtrlGITImpl.pas" FORMNAME="" UNITNAME="JclVersionCtrlGITImpl" CONTAINERID="PascalCompiler" DESIGNCLASS="" LOCALCOMMAND=""/> <FILE FILENAME="..\..\source\vcl\JclVersionCtrlSVNImpl.pas" FORMNAME="" UNITNAME="JclVersionCtrlSVNImpl" CONTAINERID="PascalCompiler" DESIGNCLASS="" LOCALCOMMAND=""/> </FILELIST> <BUILDTOOLS> Modified: trunk/jcl/packages/c6/JclVcl.dpk =================================================================== --- trunk/jcl/packages/c6/JclVcl.dpk 2011-06-13 21:52:33 UTC (rev 3538) +++ trunk/jcl/packages/c6/JclVcl.dpk 2011-06-14 05:49:00 UTC (rev 3539) @@ -4,7 +4,7 @@ DO NOT EDIT THIS FILE, IT IS GENERATED BY THE PACKAGE GENERATOR ALWAYS EDIT THE RELATED XML FILE (JclVcl-R.xml) - Last generated: 27-03-2011 20:45:44 UTC + Last generated: 14-06-2011 05:46:16 UTC ----------------------------------------------------------------------------- } @@ -57,6 +57,7 @@ JclVclResources in '..\..\source\vcl\JclVclResources.pas' , JclVersionControl in '..\..\source\vcl\JclVersionControl.pas' , JclVersionCtrlCVSImpl in '..\..\source\vcl\JclVersionCtrlCVSImpl.pas' , + JclVersionCtrlGITImpl in '..\..\source\vcl\JclVersionCtrlGITImpl.pas' , JclVersionCtrlSVNImpl in '..\..\source\vcl\JclVersionCtrlSVNImpl.pas' ; end. Modified: trunk/jcl/packages/d10/JclVcl.dpk =================================================================== --- trunk/jcl/packages/d10/JclVcl.dpk 2011-06-13 21:52:33 UTC (rev 3538) +++ trunk/jcl/packages/d10/JclVcl.dpk 2011-06-14 05:49:00 UTC (rev 3539) @@ -4,7 +4,7 @@ DO NOT EDIT THIS FILE, IT IS GENERATED BY THE PACKAGE GENERATOR ALWAYS EDIT THE RELATED XML FILE (JclVcl-R.xml) - Last generated: 27-03-2011 20:46:00 UTC + Last generated: 14-06-2011 05:46:18 UTC ----------------------------------------------------------------------------- } @@ -58,6 +58,7 @@ JclVclResources in '..\..\source\vcl\JclVclResources.pas' , JclVersionControl in '..\..\source\vcl\JclVersionControl.pas' , JclVersionCtrlCVSImpl in '..\..\source\vcl\JclVersionCtrlCVSImpl.pas' , + JclVersionCtrlGITImpl in '..\..\source\vcl\JclVersionCtrlGITImpl.pas' , JclVersionCtrlSVNImpl in '..\..\source\vcl\JclVersionCtrlSVNImpl.pas' ; Modified: trunk/jcl/packages/d11/JclVcl.dpk =================================================================== --- trunk/jcl/packages/d11/JclVcl.dpk 2011-06-13 21:52:33 UTC (rev 3538) +++ trunk/jcl/packages/d11/JclVcl.dpk 2011-06-14 05:49:00 UTC (rev 3539) @@ -4,7 +4,7 @@ DO NOT EDIT THIS FILE, IT IS GENERATED BY THE PACKAGE GENERATOR ALWAYS EDIT THE RELATED XML FILE (JclVcl-R.xml) - Last generated: 27-03-2011 20:46:02 UTC + Last generated: 14-06-2011 05:46:18 UTC ----------------------------------------------------------------------------- } @@ -60,6 +60,7 @@ JclVclResources in '..\..\source\vcl\JclVclResources.pas' , JclVersionControl in '..\..\source\vcl\JclVersionControl.pas' , JclVersionCtrlCVSImpl in '..\..\source\vcl\JclVersionCtrlCVSImpl.pas' , + JclVersionCtrlGITImpl in '..\..\source\vcl\JclVersionCtrlGITImpl.pas' , JclVersionCtrlSVNImpl in '..\..\source\vcl\JclVersionCtrlSVNImpl.pas' ; Modified: trunk/jcl/packages/d11/JclVcl.dproj =================================================================== --- trunk/jcl/packages/d11/JclVcl.dproj 2011-06-13 21:52:33 UTC (rev 3538) +++ trunk/jcl/packages/d11/JclVcl.dproj 2011-06-14 05:49:00 UTC (rev 3539) @@ -99,6 +99,7 @@ <DCCReference Include="..\..\source\vcl\JclVclResources.pas"/> <DCCReference Include="..\..\source\vcl\JclVersionControl.pas"/> <DCCReference Include="..\..\source\vcl\JclVersionCtrlCVSImpl.pas"/> + <DCCReference Include="..\..\source\vcl\JclVersionCtrlGITImpl.pas"/> <DCCReference Include="..\..\source\vcl\JclVersionCtrlSVNImpl.pas"/> </ItemGroup> </Project> Modified: trunk/jcl/packages/d12/JclVcl.dpk =================================================================== --- trunk/jcl/packages/d12/JclVcl.dpk 2011-06-13 21:52:33 UTC (rev 3538) +++ trunk/jcl/packages/d12/JclVcl.dpk 2011-06-14 05:49:00 UTC (rev 3539) @@ -4,7 +4,7 @@ DO NOT EDIT THIS FILE, IT IS GENERATED BY THE PACKAGE GENERATOR ALWAYS EDIT THE RELATED XML FILE (JclVcl-R.xml) - Last generated: 27-03-2011 20:46:05 UTC + Last generated: 14-06-2011 05:46:18 UTC ----------------------------------------------------------------------------- } @@ -58,6 +58,7 @@ JclVclResources in '..\..\source\vcl\JclVclResources.pas' , JclVersionControl in '..\..\source\vcl\JclVersionControl.pas' , JclVersionCtrlCVSImpl in '..\..\source\vcl\JclVersionCtrlCVSImpl.pas' , + JclVersionCtrlGITImpl in '..\..\source\vcl\JclVersionCtrlGITImpl.pas' , JclVersionCtrlSVNImpl in '..\..\source\vcl\JclVersionCtrlSVNImpl.pas' ; Modified: trunk/jcl/packages/d12/JclVcl.dproj =================================================================== --- trunk/jcl/packages/d12/JclVcl.dproj 2011-06-13 21:52:33 UTC (rev 3538) +++ trunk/jcl/packages/d12/JclVcl.dproj 2011-06-14 05:49:00 UTC (rev 3539) @@ -73,6 +73,7 @@ <DCCReference Include="..\..\source\vcl\JclVclResources.pas"/> <DCCReference Include="..\..\source\vcl\JclVersionControl.pas"/> <DCCReference Include="..\..\source\vcl\JclVersionCtrlCVSImpl.pas"/> + <DCCReference Include="..\..\source\vcl\JclVersionCtrlGITImpl.pas"/> <DCCReference Include="..\..\source\vcl\JclVersionCtrlSVNImpl.pas"/> <BuildConfiguration Include="Base"> <Key>Base</Key> Modified: trunk/jcl/packages/d14/JclVcl.dpk =================================================================== --- trunk/jcl/packages/d14/JclVcl.dpk 2011-06-13 21:52:33 UTC (rev 3538) +++ trunk/jcl/packages/d14/JclVcl.dpk 2011-06-14 05:49:00 UTC (rev 3539) @@ -4,7 +4,7 @@ DO NOT EDIT THIS FILE, IT IS GENERATED BY THE PACKAGE GENERATOR ALWAYS EDIT THE RELATED XML FILE (JclVcl-R.xml) - Last generated: 27-03-2011 20:46:11 UTC + Last generated: 14-06-2011 05:46:18 UTC ----------------------------------------------------------------------------- } @@ -58,6 +58,7 @@ JclVclResources in '..\..\source\vcl\JclVclResources.pas' , JclVersionControl in '..\..\source\vcl\JclVersionControl.pas' , JclVersionCtrlCVSImpl in '..\..\source\vcl\JclVersionCtrlCVSImpl.pas' , + JclVersionCtrlGITImpl in '..\..\source\vcl\JclVersionCtrlGITImpl.pas' , JclVersionCtrlSVNImpl in '..\..\source\vcl\JclVersionCtrlSVNImpl.pas' ; Modified: trunk/jcl/packages/d14/JclVcl.dproj =================================================================== --- trunk/jcl/packages/d14/JclVcl.dproj 2011-06-13 21:52:33 UTC (rev 3538) +++ trunk/jcl/packages/d14/JclVcl.dproj 2011-06-14 05:49:00 UTC (rev 3539) @@ -75,6 +75,7 @@ <DCCReference Include="..\..\source\vcl\JclVclResources.pas"/> <DCCReference Include="..\..\source\vcl\JclVersionControl.pas"/> <DCCReference Include="..\..\source\vcl\JclVersionCtrlCVSImpl.pas"/> + <DCCReference Include="..\..\source\vcl\JclVersionCtrlGITImpl.pas"/> <DCCReference Include="..\..\source\vcl\JclVersionCtrlSVNImpl.pas"/> <BuildConfiguration Include="Base"> <Key>Base</Key> Modified: trunk/jcl/packages/d15/JclVcl.dpk =================================================================== --- trunk/jcl/packages/d15/JclVcl.dpk 2011-06-13 21:52:33 UTC (rev 3538) +++ trunk/jcl/packages/d15/JclVcl.dpk 2011-06-14 05:49:00 UTC (rev 3539) @@ -4,7 +4,7 @@ DO NOT EDIT THIS FILE, IT IS GENERATED BY THE PACKAGE GENERATOR ALWAYS EDIT THE RELATED XML FILE (JclVcl-R.xml) - Last generated: 27-03-2011 20:46:16 UTC + Last generated: 14-06-2011 05:46:19 UTC ----------------------------------------------------------------------------- } @@ -57,6 +57,7 @@ JclVclResources in '..\..\source\vcl\JclVclResources.pas' , JclVersionControl in '..\..\source\vcl\JclVersionControl.pas' , JclVersionCtrlCVSImpl in '..\..\source\vcl\JclVersionCtrlCVSImpl.pas' , + JclVersionCtrlGITImpl in '..\..\source\vcl\JclVersionCtrlGITImpl.pas' , JclVersionCtrlSVNImpl in '..\..\source\vcl\JclVersionCtrlSVNImpl.pas' ; Modified: trunk/jcl/packages/d15/JclVcl.dproj =================================================================== --- trunk/jcl/packages/d15/JclVcl.dproj 2011-06-13 21:52:33 UTC (rev 3538) +++ trunk/jcl/packages/d15/JclVcl.dproj 2011-06-14 05:49:00 UTC (rev 3539) @@ -82,6 +82,7 @@ <DCCReference Include="..\..\source\vcl\JclVclResources.pas"/> <DCCReference Include="..\..\source\vcl\JclVersionControl.pas"/> <DCCReference Include="..\..\source\vcl\JclVersionCtrlCVSImpl.pas"/> + <DCCReference Include="..\..\source\vcl\JclVersionCtrlGITImpl.pas"/> <DCCReference Include="..\..\source\vcl\JclVersionCtrlSVNImpl.pas"/> <BuildConfiguration Include="Release"> <Key>Cfg_Release</Key> Modified: trunk/jcl/packages/d6/JclVcl.dpk =================================================================== --- trunk/jcl/packages/d6/JclVcl.dpk 2011-06-13 21:52:33 UTC (rev 3538) +++ trunk/jcl/packages/d6/JclVcl.dpk 2011-06-14 05:49:00 UTC (rev 3539) @@ -4,7 +4,7 @@ DO NOT EDIT THIS FILE, IT IS GENERATED BY THE PACKAGE GENERATOR ALWAYS EDIT THE RELATED XML FILE (JclVcl-R.xml) - Last generated: 27-03-2011 20:45:47 UTC + Last generated: 14-06-2011 05:46:16 UTC ----------------------------------------------------------------------------- } @@ -57,6 +57,7 @@ JclVclResources in '..\..\source\vcl\JclVclResources.pas' , JclVersionControl in '..\..\source\vcl\JclVersionControl.pas' , JclVersionCtrlCVSImpl in '..\..\source\vcl\JclVersionCtrlCVSImpl.pas' , + JclVersionCtrlGITImpl in '..\..\source\vcl\JclVersionCtrlGITImpl.pas' , JclVersionCtrlSVNImpl in '..\..\source\vcl\JclVersionCtrlSVNImpl.pas' ; Modified: trunk/jcl/packages/d7/JclVcl.dpk =================================================================== --- trunk/jcl/packages/d7/JclVcl.dpk 2011-06-13 21:52:33 UTC (rev 3538) +++ trunk/jcl/packages/d7/JclVcl.dpk 2011-06-14 05:49:00 UTC (rev 3539) @@ -4,7 +4,7 @@ DO NOT EDIT THIS FILE, IT IS GENERATED BY THE PACKAGE GENERATOR ALWAYS EDIT THE RELATED XML FILE (JclVcl-R.xml) - Last generated: 27-03-2011 20:45:50 UTC + Last generated: 14-06-2011 05:46:16 UTC ----------------------------------------------------------------------------- } @@ -57,6 +57,7 @@ JclVclResources in '..\..\source\vcl\JclVclResources.pas' , JclVersionControl in '..\..\source\vcl\JclVersionControl.pas' , JclVersionCtrlCVSImpl in '..\..\source\vcl\JclVersionCtrlCVSImpl.pas' , + JclVersionCtrlGITImpl in '..\..\source\vcl\JclVersionCtrlGITImpl.pas' , JclVersionCtrlSVNImpl in '..\..\source\vcl\JclVersionCtrlSVNImpl.pas' ; Modified: trunk/jcl/packages/d9/JclVcl.dpk =================================================================== --- trunk/jcl/packages/d9/JclVcl.dpk 2011-06-13 21:52:33 UTC (rev 3538) +++ trunk/jcl/packages/d9/JclVcl.dpk 2011-06-14 05:49:00 UTC (rev 3539) @@ -4,7 +4,7 @@ DO NOT EDIT THIS FILE, IT IS GENERATED BY THE PACKAGE GENERATOR ALWAYS EDIT THE RELATED XML FILE (JclVcl-R.xml) - Last generated: 27-03-2011 20:45:56 UTC + Last generated: 14-06-2011 05:46:17 UTC ----------------------------------------------------------------------------- } @@ -57,6 +57,7 @@ JclVclResources in '..\..\source\vcl\JclVclResources.pas' , JclVersionControl in '..\..\source\vcl\JclVersionControl.pas' , JclVersionCtrlCVSImpl in '..\..\source\vcl\JclVersionCtrlCVSImpl.pas' , + JclVersionCtrlGITImpl in '..\..\source\vcl\JclVersionCtrlGITImpl.pas' , JclVersionCtrlSVNImpl in '..\..\source\vcl\JclVersionCtrlSVNImpl.pas' ; Modified: trunk/jcl/packages/help/JclVcl.dox =================================================================== --- trunk/jcl/packages/help/JclVcl.dox 2011-06-13 21:52:33 UTC (rev 3538) +++ trunk/jcl/packages/help/JclVcl.dox 2011-06-14 05:49:00 UTC (rev 3539) @@ -31,7 +31,7 @@ File2=Jcl.doxdb [Source Files] -Count=15 +Count=16 File0=..\..\source\vcl\JclPrint.pas File1=..\..\source\vcl\JclGraphUtils.pas File2=..\..\source\vcl\JclGraphics.pas @@ -41,12 +41,13 @@ File6=..\..\source\vcl\JclVclResources.pas File7=..\..\source\vcl\JclVersionControl.pas File8=..\..\source\vcl\JclVersionCtrlCVSImpl.pas -File9=..\..\source\vcl\JclVersionCtrlSVNImpl.pas -File10=..\..\..\help\Bitmap32.dtx -File11=..\..\..\help\Font.dtx -File12=..\..\..\help\Graphics.dtx -File13=..\..\..\help\JclVcl.dtx -File14=..\..\..\help\Regions.dtx +File9=..\..\source\vcl\JclVersionCtrlGITImpl.pas +File10=..\..\source\vcl\JclVersionCtrlSVNImpl.pas +File11=..\..\..\help\Bitmap32.dtx +File12=..\..\..\help\Font.dtx +File13=..\..\..\help\Graphics.dtx +File14=..\..\..\help\JclVcl.dtx +File15=..\..\..\help\Regions.dtx [General] Copyright=Copyright (C) 1999, 2011 Project JEDI Modified: trunk/jcl/packages/xml/JclVcl-R.xml =================================================================== --- trunk/jcl/packages/xml/JclVcl-R.xml 2011-06-13 21:52:33 UTC (rev 3538) +++ trunk/jcl/packages/xml/JclVcl-R.xml 2011-06-14 05:49:00 UTC (rev 3539) @@ -25,6 +25,7 @@ <File Name="..\..\source\vcl\JclVclResources.pas" Targets="Vcl" Formname="" Condition=""/> <File Name="..\..\source\vcl\JclVersionControl.pas" Targets="Vcl" Formname="" Condition=""/> <File Name="..\..\source\vcl\JclVersionCtrlCVSImpl.pas" Targets="Vcl" Formname="" Condition=""/> + <File Name="..\..\source\vcl\JclVersionCtrlGITImpl.pas" Targets="Vcl" Formname="" Condition=""/> <File Name="..\..\source\vcl\JclVersionCtrlSVNImpl.pas" Targets="Vcl" Formname="" Condition=""/> <File Name="..\..\..\help\Bitmap32.dtx" Targets="help" Formname="" Condition=""/> <File Name="..\..\..\help\Font.dtx" Targets="help" Formname="" Condition=""/> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jfu...@us...> - 2011-06-13 21:52:39
|
Revision: 3538 http://jcl.svn.sourceforge.net/jcl/?rev=3538&view=rev Author: jfudickar Date: 2011-06-13 21:52:33 +0000 (Mon, 13 Jun 2011) Log Message: ----------- First base version of TortoiseGIT support Modified Paths: -------------- trunk/jcl/experts/versioncontrol/JclVersionControlImpl.pas trunk/jcl/source/vcl/JclVclResources.pas trunk/jcl/source/vcl/JclVersionControl.pas Added Paths: ----------- trunk/jcl/source/vcl/JclVersionCtrlGITImpl.pas Modified: trunk/jcl/experts/versioncontrol/JclVersionControlImpl.pas =================================================================== --- trunk/jcl/experts/versioncontrol/JclVersionControlImpl.pas 2011-06-13 20:29:42 UTC (rev 3537) +++ trunk/jcl/experts/versioncontrol/JclVersionControlImpl.pas 2011-06-13 21:52:33 UTC (rev 3538) @@ -160,6 +160,7 @@ {$ENDIF BDS8_UP} JclDebug, JclFileUtils, JclRegistry, JclShell, JclStrings, JclOtaConsts, JclOtaResources, + JclVersionCtrlGITImpl, JclVersionCtrlSVNImpl, JclVersionCtrlCVSImpl; Modified: trunk/jcl/source/vcl/JclVclResources.pas =================================================================== --- trunk/jcl/source/vcl/JclVclResources.pas 2011-06-13 20:29:42 UTC (rev 3537) +++ trunk/jcl/source/vcl/JclVclResources.pas 2011-06-13 21:52:33 UTC (rev 3538) @@ -195,6 +195,11 @@ RsVersionCtrlSVNName = 'subversion'; RSENoTortoiseSVN = 'TortoiseSVN is not detected on the system'; + //=== JclVersionCtrlGITImpl ================================================== +resourcestring + RsVersionCtrlGITName = 'git'; + RSENoTortoiseGIT = 'TortoiseGIT is not detected on the system'; + {$IFDEF UNITVERSIONING} const UnitVersioning: TUnitVersionInfo = ( Modified: trunk/jcl/source/vcl/JclVersionControl.pas =================================================================== --- trunk/jcl/source/vcl/JclVersionControl.pas 2011-06-13 20:29:42 UTC (rev 3537) +++ trunk/jcl/source/vcl/JclVersionControl.pas 2011-06-13 21:52:33 UTC (rev 3538) @@ -117,10 +117,8 @@ // returns false and all parent directories names if no sandbox is present function GetSandboxNames(const FileName: TFileName; SdBxNames: TStrings): Boolean; virtual; // execute the action of a file or on a sandbox - function ExecuteAction(const FileName: TFileName; - const Action: TJclVersionControlActionType): Boolean; virtual; - property SupportedActionTypes: TJclVersionControlActionTypes read - GetSupportedActionTypes; + function ExecuteAction(const FileName: TFileName; const Action: TJclVersionControlActionType): Boolean; virtual; + property SupportedActionTypes: TJclVersionControlActionTypes read GetSupportedActionTypes; property FileActions[const FileName: TFileName]: TJclVersionControlActionTypes read GetFileActions; property SandboxActions[const SdBxName: TFileName]: TJclVersionControlActionTypes read GetSandboxActions; property Enabled: Boolean read GetEnabled; @@ -163,8 +161,7 @@ function GetName: string; override; public function GetSandboxNames(const FileName: TFileName; SdBxNames: TStrings): Boolean; override; - function ExecuteAction(const FileName: TFileName; - const Action: TJclVersionControlActionType): Boolean; override; + function ExecuteAction(const FileName: TFileName; const Action: TJclVersionControlActionType): Boolean; override; end; TJclVersionControlPluginList = class (TObject) @@ -177,8 +174,7 @@ constructor Create; destructor Destroy; override; function Count: Integer; - function GetFileCache(const FileName: TFileName; - const Plugin: TJclVersionControlPlugin): TJclVersionControlCache; + function GetFileCache(const FileName: TFileName; const Plugin: TJclVersionControlPlugin): TJclVersionControlCache; //1 Returns the number of enabled plugin classes, which implicit shows if there is any versioncontrol system installed function NumberOfEnabledPlugins: Integer; procedure RegisterPluginClass(const APluginClass: TJclVersionControlPluginClass); @@ -191,18 +187,15 @@ FSandbox: string; FActionTypes: TJclVersionControlActionTypes; public - constructor Create(ASandbox: string; AActionTypes: - TJclVersionControlActionTypes); + constructor Create(ASandbox: string; AActionTypes: TJclVersionControlActionTypes); property Sandbox: string read FSandbox; property ActionTypes: TJclVersionControlActionTypes read FActionTypes; end; function VersionControlPluginList: TJclVersionControlPluginList; procedure RegisterVersionControlPluginClass(const APluginClass: TJclVersionControlPluginClass); -procedure UnRegisterVersionControlPluginClass(const APluginClass: - TJclVersionControlPluginClass); -function VersionControlActionInfo(ActionType : TJclVersionControlActionType): - TJclVersionControlActionInfo; +procedure UnRegisterVersionControlPluginClass(const APluginClass: TJclVersionControlPluginClass); +function VersionControlActionInfo(ActionType : TJclVersionControlActionType): TJclVersionControlActionInfo; {$IFDEF UNITVERSIONING} const @@ -508,14 +501,12 @@ VersionControlPluginList.RegisterPluginClass(APluginClass); end; -procedure UnRegisterVersionControlPluginClass(const - APluginClass: TJclVersionControlPluginClass); +procedure UnRegisterVersionControlPluginClass(const APluginClass: TJclVersionControlPluginClass); begin VersionControlPluginList.UnregisterPluginClass(APluginClass); end; -function VersionControlActionInfo( - ActionType: TJclVersionControlActionType): TJclVersionControlActionInfo; +function VersionControlActionInfo(ActionType : TJclVersionControlActionType): TJclVersionControlActionInfo; begin Result := VersionControlActionInfos[ActionType]; end; @@ -532,8 +523,8 @@ inherited Destroy; end; -function TJclVersionControlPlugin.ExecuteAction(const FileName: TFileName; - const Action: TJclVersionControlActionType): Boolean; +function TJclVersionControlPlugin.ExecuteAction(const FileName: TFileName; const Action: TJclVersionControlActionType): + Boolean; begin Result := False; end; @@ -549,8 +540,7 @@ Result := []; end; -function TJclVersionControlPlugin.GetSupportedActionTypes: - TJclVersionControlActionTypes; +function TJclVersionControlPlugin.GetSupportedActionTypes: TJclVersionControlActionTypes; begin Result := []; end; @@ -648,8 +638,8 @@ //=== TJclVersionControlSystemPlugin ========================================= -function TJclVersionControlSystemPlugin.ExecuteAction(const FileName: TFileName; - const Action: TJclVersionControlActionType): Boolean; +function TJclVersionControlSystemPlugin.ExecuteAction(const FileName: TFileName; const Action: + TJclVersionControlActionType): Boolean; begin case Action of vcaContextMenu: @@ -699,8 +689,7 @@ Result := [vcaContextMenu, vcaExplore, vcaExploreSandbox, vcaProperties, vcaPropertiesSandbox]; end; -constructor TJclVersionControlActionsCache.Create(ASandbox: string; - AActionTypes: TJclVersionControlActionTypes); +constructor TJclVersionControlActionsCache.Create(ASandbox: string; AActionTypes: TJclVersionControlActionTypes); begin inherited Create; FSandbox := ASandbox; @@ -736,8 +725,8 @@ Result := FPluginList.Count; end; -function TJclVersionControlPluginList.GetFileCache(const FileName: TFileName; - const Plugin: TJclVersionControlPlugin): TJclVersionControlCache; +function TJclVersionControlPluginList.GetFileCache(const FileName: TFileName; const Plugin: TJclVersionControlPlugin): + TJclVersionControlCache; var Index: Integer; AFileCache: TJclVersionControlCache; Added: trunk/jcl/source/vcl/JclVersionCtrlGITImpl.pas =================================================================== --- trunk/jcl/source/vcl/JclVersionCtrlGITImpl.pas (rev 0) +++ trunk/jcl/source/vcl/JclVersionCtrlGITImpl.pas 2011-06-13 21:52:33 UTC (rev 3538) @@ -0,0 +1,284 @@ +{**************************************************************************************************} +{ } +{ 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 JclVersionCtrlGITImpl.pas } +{ } +{ The Initial Developer of the Original Code is Florent Ouchet. } +{ Portions created by Florent Ouchet are Copyright (C) of Florent Ouchet. } +{ Portions created by Elahn Ientile are Copyright (C) of Elahn Ientile. } +{ } +{ } +{**************************************************************************************************} +{ } +{ Last modified: $Date:: 2011-06-13 22:29:42 +0200 (Mo, 13 Jun 2011) $ } +{ Revision: $Rev:: 3537 $ } +{ Author: $Author:: jfudickar $ } +{ } +{**************************************************************************************************} + +unit JclVersionCtrlGITImpl; + +{$I jcl.inc} + +interface + +uses + {$IFDEF UNITVERSIONING} + JclUnitVersioning, + {$ENDIF UNITVERSIONING} + SysUtils, Classes, Windows, Graphics, + JclVersionControl; + +type + TJclVersionControlGIT = class(TJclVersionControlPlugin) + private + FTortoiseGITProc: string; + protected + function GetSupportedActionTypes: TJclVersionControlActionTypes; override; + function GetFileActions(const FileName: TFileName): TJclVersionControlActionTypes; override; + function GetEnabled: Boolean; override; + function GetName: string; override; + public + constructor Create; override; + destructor Destroy; override; + function ExecuteAction(const FileName: TFileName; + const Action: TJclVersionControlActionType): Boolean; override; + end; + +{$IFDEF UNITVERSIONING} +const + UnitVersioning: TUnitVersionInfo = ( + RCSfile: '$URL: https://jcl.svn.sourceforge.net:443/svnroot/jcl/trunk/jcl/source/vcl/JclVersionCtrlGITImpl.pas $'; + Revision: '$Revision: 3537 $'; + Date: '$Date: 2011-06-13 22:29:42 +0200 (Mo, 13 Jun 2011) $'; + LogPath: 'JCL\source\vcl'; + Extra: ''; + Data: nil + ); +{$ENDIF UNITVERSIONING} + +implementation + +uses + JclVclResources, + JclFileUtils, JclSysInfo, JclSysUtils, JclRegistry, JclStrings; + +const + JclVersionCtrlRegKeyName = 'SOFTWARE\TortoiseGIT'; + JclVersionCtrlRegValueName = 'ProcPath'; + JclVersionCtrlGITAddVerb = 'add'; + JclVersionCtrlGITBlameVerb = 'blame'; + //JclVersionCtrlGITBranchVerb = 'copy'; + JclVersionCtrlGITCheckOutVerb = 'checkout'; + JclVersionCtrlGITCommitVerb = 'commit'; + JclVersionCtrlGITDiffVerb = 'diff'; +// JclVersionCtrlGITGraphVerb = 'revisiongraph'; + JclVersionCtrlGITLogVerb = 'log'; + //JclVersionCtrlGITLockVerb = 'lock'; + JclVersionCtrlGITMergeVerb = 'merge'; + JclVersionCtrlGITRenameVerb = 'rename'; + JclVersionCtrlGITRepoBrowserVerb = 'repobrowser'; + JclVersionCtrlGITRevertVerb = 'revert'; + JclVersionCtrlGITStatusVerb = 'repostatus'; +// JclVersionCtrlGITTagVerb = 'copy'; + JclVersionCtrlGITUpdateVerb = 'sync'; +// JclVersionCtrlGITUpdateToParam = '/rev'; + //JclVersionCtrlGITUnlockVerb = 'unlock'; + JclVersionCtrlGITDirectory1 = '.git\'; + JclVersionCtrlGITEntryFile = 'tortoisegit.data'; + + JclVersionCtrlGITDirectories: array [0..0] of string = + ( JclVersionCtrlGITDirectory1); + +//=== TJclVersionControlGIT ================================================== + +constructor TJclVersionControlGIT.Create; +var + SaveAcc: TJclRegWOW64Access; +begin + inherited Create; + + if IsWindows64 then + begin + // on 64 bit machines look in the 64bit section of registy for tortoise GIT (64bit) registry stuff + SaveAcc := RegGetWOW64AccessMode; + try + RegSetWOW64AccessMode(ra64Key); + FTortoiseGITProc := RegReadStringDef(HKLM, JclVersionCtrlRegKeyName, JclVersionCtrlRegValueName, ''); + finally + RegSetWOW64AccessMode(SaveAcc); + end; + if FTortoiseGITProc = '' then // when the 64bit Version is not found try to find the 32bit version + FTortoiseGITProc := RegReadStringDef(HKLM, JclVersionCtrlRegKeyName, JclVersionCtrlRegValueName, ''); + end + else + FTortoiseGITProc := RegReadStringDef(HKLM, JclVersionCtrlRegKeyName, JclVersionCtrlRegValueName, ''); +end; + +destructor TJclVersionControlGIT.Destroy; +begin + inherited Destroy; +end; + +function TJclVersionControlGIT.ExecuteAction(const FileName: TFileName; + const Action: TJclVersionControlActionType): Boolean; + + function CallTortoiseGITProc(const ActionName: string; + const Param: string = ''): Boolean; + var + StartupInfo: TStartupInfo; + ProcessInfo: TProcessInformation; + CurrentDir, CommandLine: string; + begin + ResetMemory(StartupInfo, SizeOf(TStartupInfo)); + ResetMemory(ProcessInfo, SizeOf(TProcessInformation)); + startupInfo.cb := SizeOf(TStartupInfo); + startupInfo.dwFlags := STARTF_USESHOWWINDOW; + startupInfo.wShowWindow := SW_SHOW; + + if FileName = '' then + raise EJclVersionControlError.Create(RsEEmptyFileName); + if not Enabled then + raise EJclVersionControlError.Create(RsENoTortoiseGIT); + + if FileName[Length(FileName)] = DirDelimiter then + CurrentDir := FileName + else + CurrentDir := ExtractFilePath(FileName); + CommandLine := Format('%s /command:%s /path:"%s" %s /notempfile', [FTortoiseGITProc, ActionName, FileName, Param]); + + Result := CreateProcess(nil, PChar(CommandLine), nil, + nil, False, 0, nil, PChar(CurrentDir), StartupInfo, ProcessInfo); + + if Result then + begin + CloseHandle(ProcessInfo.hProcess); + CloseHandle(ProcessInfo.hThread); + end; + end; + +begin + case Action of + vcaAdd, + vcaAddSandbox: + Result := CallTortoiseGITProc(JclVersionCtrlGITAddVerb); + vcaBlame : + Result := CallTortoiseGITProc(JclVersionCtrlGITBlameVerb); +// vcaBranch, +// vcaBranchSandbox: +// Result := CallTortoiseGITProc(JclVersionCtrlGITBranchVerb); + vcaCheckOutSandbox: + Result := CallTortoiseGITProc(JclVersionCtrlGITCheckOutVerb); + vcaCommit, + vcaCommitSandbox: + Result := CallTortoiseGITProc(JclVersionCtrlGITCommitVerb); + vcaDiff: + Result := CallTortoiseGITProc(JclVersionCtrlGITDiffVerb); +// vcaGraph: +// Result := CallTortoiseGITProc(JclVersionCtrlGITGraphVerb); + vcaLog, + vcaLogSandbox: + Result := CallTortoiseGITProc(JclVersionCtrlGITLogVerb); +// vcaLock, +// vcaLockSandbox: +// Result := CallTortoiseGITProc(JclVersionCtrlGITLockVerb); + vcaMerge, + vcaMergeSandbox: + Result := CallTortoiseGITProc(JclVersionCtrlGITMergeVerb); + vcaRename: + Result := CallTortoiseGITProc(JclVersionCtrlGITRenameVerb); + vcaRepoBrowser: + Result := CallTortoiseGITProc(JclVersionCtrlGITRepoBrowserVerb); + vcaRevert, + vcaRevertSandbox: + Result := CallTortoiseGITProc(JclVersionCtrlGITRevertVerb); + vcaStatus, + vcaStatusSandbox: + Result := CallTortoiseGITProc(JclVersionCtrlGITStatusVerb); +// vcaTag, +// vcaTagSandBox: +// Result := CallTortoiseGITProc(JclVersionCtrlGITTagVerb); + vcaUpdate, + vcaUpdateSandbox: + Result := CallTortoiseGITProc(JclVersionCtrlGITUpdateVerb); +// vcaUpdateTo, +// vcaUpdateSandboxTo: +// Result := CallTortoiseGITProc(JclVersionCtrlGITUpdateVerb, JclVersionCtrlGITUpdateToParam); +// vcaUnlock, +// vcaUnlockSandbox: +// Result := CallTortoiseGITProc(JclVersionCtrlGITUnlockVerb); + else + Result := inherited ExecuteAction(FileName, Action); + end; +end; + +function TJclVersionControlGIT.GetEnabled: Boolean; +begin + Result := FTortoiseGITProc <> ''; +end; + +function TJclVersionControlGIT.GetFileActions( + const FileName: TFileName): TJclVersionControlActionTypes; +var + EntryFileName: TFileName; + IndexDir: Integer; +begin + Result := inherited GetFileActions(FileName); + + if Enabled then + begin + + for IndexDir := Low(JclVersionCtrlGITDirectories) to High(JclVersionCtrlGITDirectories) do + begin + EntryFileName := PathAddSeparator(ExtractFilePath(FileName)) + + JclVersionCtrlGITDirectories[IndexDir] + JclVersionCtrlGITEntryFile; + if FileExists(EntryFileName) then + begin + Result := GetSupportedActionTypes; + end; + end; + Result := Result + [vcaAdd]; + end; +end; + +function TJclVersionControlGIT.GetSupportedActionTypes: TJclVersionControlActionTypes; +begin + Result := inherited GetSupportedActionTypes; + if Enabled then + Result := Result + [vcaAdd, {vcaAddSandbox, }vcaBlame, {vcaBranch, + vcaBranchSandbox, vcaCheckOutSandbox, }vcaCommit, {vcaCommitSandbox, }vcaDiff, + {vcaGraph, }vcaLog, {vcaLogSandbox, vcaLock, vcaLockSandbox, }vcaMerge, + {vcaMergeSandbox, }vcaRename, vcaRepoBrowser, vcaRevert, {vcaRevertSandbox,} + vcaStatus, {vcaStatusSandbox, vcaTag, vcaTagSandBox, }vcaUpdate{, + vcaUpdateSandbox, vcaUpdateTo, vcaUpdateSandboxTo, vcaUnlock, vcaUnlockSandbox}]; +end; + +function TJclVersionControlGIT.GetName: string; +begin + Result := LoadResString(@RsVersionCtrlGITName); +end; + +initialization + + {$IFDEF UNITVERSIONING} + RegisterUnitVersion(HInstance, UnitVersioning); + {$ENDIF UNITVERSIONING} + RegisterVersionControlPluginClass(TJclVersionControlGIT); + +finalization + + UnregisterVersionControlPluginClass(TJclVersionControlGIT); + {$IFDEF UNITVERSIONING} + UnregisterUnitVersion(HInstance); + {$ENDIF UNITVERSIONING} + +end. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jfu...@us...> - 2011-06-13 20:29:49
|
Revision: 3537 http://jcl.svn.sourceforge.net/jcl/?rev=3537&view=rev Author: jfudickar Date: 2011-06-13 20:29:42 +0000 (Mon, 13 Jun 2011) Log Message: ----------- Now under Win64 the 32bit client is searched when the 64bit client is not found Modified Paths: -------------- trunk/jcl/source/vcl/JclVersionCtrlSVNImpl.pas Modified: trunk/jcl/source/vcl/JclVersionCtrlSVNImpl.pas =================================================================== --- trunk/jcl/source/vcl/JclVersionCtrlSVNImpl.pas 2011-06-13 15:11:39 UTC (rev 3536) +++ trunk/jcl/source/vcl/JclVersionCtrlSVNImpl.pas 2011-06-13 20:29:42 UTC (rev 3537) @@ -121,6 +121,8 @@ finally RegSetWOW64AccessMode(SaveAcc); end; + if FTortoiseSVNProc = '' then // when the 64bit Version is not found try to find the 32bit version + FTortoiseSVNProc := RegReadStringDef(HKLM, JclVersionCtrlRegKeyName, JclVersionCtrlRegValueName, ''); end else FTortoiseSVNProc := RegReadStringDef(HKLM, JclVersionCtrlRegKeyName, JclVersionCtrlRegValueName, ''); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ou...@us...> - 2011-06-13 15:11:46
|
Revision: 3536 http://jcl.svn.sourceforge.net/jcl/?rev=3536&view=rev Author: outchy Date: 2011-06-13 15:11:39 +0000 (Mon, 13 Jun 2011) Log Message: ----------- Mantis 5576: TJCLDebugThread is always started with Delphi 2010 Modified Paths: -------------- trunk/jcl/source/windows/JclDebug.pas Modified: trunk/jcl/source/windows/JclDebug.pas =================================================================== --- trunk/jcl/source/windows/JclDebug.pas 2011-06-12 01:48:54 UTC (rev 3535) +++ trunk/jcl/source/windows/JclDebug.pas 2011-06-13 15:11:39 UTC (rev 3536) @@ -34,7 +34,7 @@ { } {**************************************************************************************************} { } -{ Last modified: $Date:: $ } +{ Last modified: $Date:: $ } { Revision: $Rev:: $ } { Author: $Author:: $ } { } @@ -5743,12 +5743,12 @@ FThreadName := AThreadName; inherited Create(True); JclDebugThreadList.RegisterThread(Self, AThreadName); - {$IFDEF RTL210_UP} - Suspended := False; - {$ELSE ~RTL210_UP} if not ASuspended then + {$IFDEF RTL210_UP} + Suspended := False; + {$ELSE ~RTL210_UP} Resume; - {$ENDIF ~RTL210_UP} + {$ENDIF ~RTL210_UP} end; destructor TJclDebugThread.Destroy; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mb...@us...> - 2011-06-12 01:49:00
|
Revision: 3535 http://jcl.svn.sourceforge.net/jcl/?rev=3535&view=rev Author: mbeutel Date: 2011-06-12 01:48:54 +0000 (Sun, 12 Jun 2011) Log Message: ----------- Changed GetCppRtlBase() to something that should work correctly for all versions of Delphi and C++Builder. Modified Paths: -------------- trunk/jcl/source/windows/JclHookExcept.pas Modified: trunk/jcl/source/windows/JclHookExcept.pas =================================================================== --- trunk/jcl/source/windows/JclHookExcept.pas 2011-06-11 18:55:56 UTC (rev 3534) +++ trunk/jcl/source/windows/JclHookExcept.pas 2011-06-12 01:48:54 UTC (rev 3535) @@ -566,12 +566,25 @@ end; function GetCppRtlBase: Pointer; +const + {$IFDEF COMPILER6} { Delphi/C++Builder 6 } + CppRtlVersion = 60; + {$ELSE ~COMPILER6} + {$IF (RtlVersion > 18.0) and (RtlVersion < 19.0)} { Delphi/C++Builder 2007 were aiming for + binary compatibility with BDS2006, which + complicates things a bit } + CppRtlVersion = 80; + {$ELSE} + { Successive RTLDLL version numbers in the remaining cases: CB2006 has cc3270mt.dll, + CB2009 (= CB2006 + 2 releases) has cc3290mt.dll, CB2010 has cc32100mt.dll etc. } + CppRtlVersion = 70 + Trunc(RtlVersion - 18.0) * 10; + {$IFEND} + {$ENDIF ~COMPILER6} begin - {$IFDEF SUPPORTS_DELAYED_LOADING} - Result := Pointer (FindHInstance (System.pfnDliNotifyHook)); { hooked by C++ RTL upon startup } - {$ELSE} - Result := nil; // not supported - {$ENDIF SUPPORTS_DELAYED_LOADING} + Result := Pointer(GetModuleHandle(PChar(Format('cc32%dmt.dll', [CppRtlVersion])))); + { 'Result = nil' means that the C++ RTL has been linked statically or is not available at all; + in this case TJclPeMapImgHooks.ReplaceImport() is a no-op. The base module is also being + hooked separately, so we're covered. } end; function HasCppRtl: Boolean; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ou...@us...> - 2011-06-11 18:56:02
|
Revision: 3534 http://jcl.svn.sourceforge.net/jcl/?rev=3534&view=rev Author: outchy Date: 2011-06-11 18:55:56 +0000 (Sat, 11 Jun 2011) Log Message: ----------- Mantis 5557: Erroneous 'line too long' exceptions before and after compile. Modified Paths: -------------- trunk/jcl/experts/common/JclOtaUtils.pas Modified: trunk/jcl/experts/common/JclOtaUtils.pas =================================================================== --- trunk/jcl/experts/common/JclOtaUtils.pas 2011-06-11 18:11:59 UTC (rev 3533) +++ trunk/jcl/experts/common/JclOtaUtils.pas 2011-06-11 18:55:56 UTC (rev 3534) @@ -406,11 +406,14 @@ InsideLineComment, InsideComment, InsideBrace: Boolean; procedure LoadNextBuffer; begin + Line := Line + Copy(Buffer, LineStart - BufferStart + 1, Position - LineStart); BufferStart := Position; + LineStart := BufferStart; BufferCount := AReader.GetText(BufferStart, PAnsiChar(Buffer), BufferSize); BufferPosition := Position - BufferStart; end; begin + Line := ''; BufferStart := 0; BufferCount := 0; LineStart := 0; @@ -441,13 +444,14 @@ InsideLineComment := False; if (LineStart - BufferStart) < 0 then raise EJclExpertException.CreateRes(@RsELineTooLong); - Line := Copy(Buffer, LineStart - BufferStart + 1, Position - LineStart); + Line := Line + Copy(Buffer, LineStart - BufferStart + 1, Position - LineStart); for PropIndex := 0 to PropCount - 1 do if Pos(PropIDs[PropIndex], Line) = 4 then begin Result[PropIndex] := LineStart + Length(PropIDs[PropIndex]) + 4; Inc(PropMatches); end; + Line := ''; end; LineStart := Position + 1; end; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ou...@us...> - 2011-06-11 18:12:05
|
Revision: 3533 http://jcl.svn.sourceforge.net/jcl/?rev=3533&view=rev Author: outchy Date: 2011-06-11 18:11:59 +0000 (Sat, 11 Jun 2011) Log Message: ----------- Mantis 5541: New function IsLibreOfficeInstalled. Modified Paths: -------------- trunk/jcl/source/common/JclSysInfo.pas Modified: trunk/jcl/source/common/JclSysInfo.pas =================================================================== --- trunk/jcl/source/common/JclSysInfo.pas 2011-06-11 18:07:39 UTC (rev 3532) +++ trunk/jcl/source/common/JclSysInfo.pas 2011-06-11 18:11:59 UTC (rev 3533) @@ -1359,6 +1359,7 @@ function IsInternetExplorerInstalled: Boolean; function IsMSProjectInstalled: Boolean; function IsOpenOfficeInstalled: Boolean; +function IsLibreOfficeInstalled: Boolean; {$ENDIF MSWINDOWS} @@ -5546,6 +5547,11 @@ Result := ProgIDExists('com.sun.star.ServiceManager'); end; +function IsLibreOfficeInstalled: Boolean; +begin + Result := ProgIDExists('com.sun.star.ServiceManager.1'); +end; + //=== Initialization/Finalization ============================================ procedure InitSysInfo; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ou...@us...> - 2011-06-11 18:07:45
|
Revision: 3532 http://jcl.svn.sourceforge.net/jcl/?rev=3532&view=rev Author: outchy Date: 2011-06-11 18:07:39 +0000 (Sat, 11 Jun 2011) Log Message: ----------- Mantis 5550: ERangeError from SHEnumFolderNext. Modified Paths: -------------- trunk/jcl/source/windows/JclShell.pas Modified: trunk/jcl/source/windows/JclShell.pas =================================================================== --- trunk/jcl/source/windows/JclShell.pas 2011-06-11 17:49:38 UTC (rev 3531) +++ trunk/jcl/source/windows/JclShell.pas 2011-06-11 18:07:39 UTC (rev 3532) @@ -436,7 +436,7 @@ begin IconIndex := 0; ExtractIcon.GetIconLocation(0, @IconFile, MAX_PATH, IconIndex, Flags); - if (IconIndex < 0) and ((Flags and GIL_NOTFILENAME) = GIL_NOTFILENAME) then + if (IconIndex < 0) or ((Flags and GIL_NOTFILENAME) = 0) then ExtractIconEx(@IconFile, IconIndex, F.IconLarge, F.IconSmall, 1) else ExtractIcon.Extract(@IconFile, IconIndex, F.IconLarge, F.IconSmall, This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ou...@us...> - 2011-06-11 17:49:44
|
Revision: 3531 http://jcl.svn.sourceforge.net/jcl/?rev=3531&view=rev Author: outchy Date: 2011-06-11 17:49:38 +0000 (Sat, 11 Jun 2011) Log Message: ----------- Mantis 5585: Fix for TD32 name extraction. Modified Paths: -------------- trunk/jcl/source/windows/JclTD32.pas Modified: trunk/jcl/source/windows/JclTD32.pas =================================================================== --- trunk/jcl/source/windows/JclTD32.pas 2011-06-10 22:28:21 UTC (rev 3530) +++ trunk/jcl/source/windows/JclTD32.pas 2011-06-11 17:49:38 UTC (rev 3531) @@ -1182,8 +1182,14 @@ Inc(pszName); // Get the name FNames.Add(pszName); - // skip the length of name and a NULL at the end - Inc(pszName, Len + 1); + // first, skip the length of name + Inc(pszName, Len); + // the length is only correct modulo 256 because it is stored on a single byte, + // so we have to iterate until we find the real end of the string + while PszName^ <> #0 do + Inc(pszName, 256); + // then, skip a NULL at the end + Inc(pszName, 1); end; end; end; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ah...@us...> - 2011-06-10 22:28:28
|
Revision: 3530 http://jcl.svn.sourceforge.net/jcl/?rev=3530&view=rev Author: ahuser Date: 2011-06-10 22:28:21 +0000 (Fri, 10 Jun 2011) Log Message: ----------- Delphi 2009 and older do not have "System.pfnDliNotifyHook" because they have no delayed-loading Modified Paths: -------------- trunk/jcl/source/windows/JclHookExcept.pas Modified: trunk/jcl/source/windows/JclHookExcept.pas =================================================================== --- trunk/jcl/source/windows/JclHookExcept.pas 2011-06-10 19:12:56 UTC (rev 3529) +++ trunk/jcl/source/windows/JclHookExcept.pas 2011-06-10 22:28:21 UTC (rev 3530) @@ -567,7 +567,11 @@ function GetCppRtlBase: Pointer; begin + {$IFDEF SUPPORTS_DELAYED_LOADING} Result := Pointer (FindHInstance (System.pfnDliNotifyHook)); { hooked by C++ RTL upon startup } + {$ELSE} + Result := nil; // not supported + {$ENDIF SUPPORTS_DELAYED_LOADING} end; function HasCppRtl: Boolean; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ou...@us...> - 2011-06-10 19:13:02
|
Revision: 3529 http://jcl.svn.sourceforge.net/jcl/?rev=3529&view=rev Author: outchy Date: 2011-06-10 19:12:56 +0000 (Fri, 10 Jun 2011) Log Message: ----------- force the codepage when the encoding is forced to either UTF8 or UTF16. Modified Paths: -------------- trunk/jcl/source/common/JclSimpleXml.pas Modified: trunk/jcl/source/common/JclSimpleXml.pas =================================================================== --- trunk/jcl/source/common/JclSimpleXml.pas 2011-06-10 19:05:26 UTC (rev 3528) +++ trunk/jcl/source/common/JclSimpleXml.pas 2011-06-10 19:12:56 UTC (rev 3529) @@ -1279,9 +1279,15 @@ case Encoding of seUTF8: - AStringStream := TJclUTF8Stream.Create(AOutStream, False); + begin + AStringStream := TJclUTF8Stream.Create(AOutStream, False); + FCodePage := CP_UTF8; + end; seUTF16: - AStringStream := TJclUTF16Stream.Create(AOutStream, False); + begin + AStringStream := TJclUTF16Stream.Create(AOutStream, False); + FCodePage := CP_UTF16LE; + end else AStringStream := TJclAnsiStream.Create(AOutStream); TJclAnsiStream(AStringStream).CodePage := CodePage; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ou...@us...> - 2011-06-10 19:05:32
|
Revision: 3528 http://jcl.svn.sourceforge.net/jcl/?rev=3528&view=rev Author: outchy Date: 2011-06-10 19:05:26 +0000 (Fri, 10 Jun 2011) Log Message: ----------- Fixed brocken TJclSimpleXml.SaveToFile: CP_ACP is not an absolute codepage stored in JclCharsets. Modified Paths: -------------- trunk/jcl/source/common/JclSimpleXml.pas Modified: trunk/jcl/source/common/JclSimpleXml.pas =================================================================== --- trunk/jcl/source/common/JclSimpleXml.pas 2011-06-09 20:56:20 UTC (rev 3527) +++ trunk/jcl/source/common/JclSimpleXml.pas 2011-06-10 19:05:26 UTC (rev 3528) @@ -3425,7 +3425,13 @@ begin ASimpleXml := SimpleXml; if Assigned(ASimpleXml) then - DefaultCodePage := ASimpleXml.FCodePage + begin + DefaultCodePage := ASimpleXml.FCodePage; + {$IFDEF MSWINDOWS} + if DefaultCodePage = CP_ACP then + DefaultCodePage := GetAcp; + {$ENDIF MSWINDOWS} + end else {$IFDEF UNICODE} DefaultCodePage := CP_UTF16LE; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ou...@us...> - 2011-06-09 21:24:01
|
Revision: 3526 http://jcl.svn.sourceforge.net/jcl/?rev=3526&view=rev Author: outchy Date: 2011-06-09 20:54:52 +0000 (Thu, 09 Jun 2011) Log Message: ----------- codepage "UTF-16" is more well-known than "unicode". Modified Paths: -------------- trunk/jcl/source/common/JclCharsets.pas Modified: trunk/jcl/source/common/JclCharsets.pas =================================================================== --- trunk/jcl/source/common/JclCharsets.pas 2011-06-09 20:15:10 UTC (rev 3525) +++ trunk/jcl/source/common/JclCharsets.pas 2011-06-09 20:54:52 UTC (rev 3526) @@ -413,8 +413,8 @@ (Name: 'iso-ir-148'; CodePage: 1254; FamilyCodePage: 1254), (Name: 'latin5'; CodePage: 1254; FamilyCodePage: 1254), (* Unicode unicode utf-16 1200 1200 *) + (Name: 'utf-16'; CodePage: 1200; FamilyCodePage: 1200), (Name: 'unicode'; CodePage: 1200; FamilyCodePage: 1200), - (Name: 'utf-16'; CodePage: 1200; FamilyCodePage: 1200), (* Unicode (Big-Endian) unicodeFFFE 1201 1200 *) (Name: 'unicodeFFFE'; CodePage: 1201; FamilyCodePage: 1200), (* Unicode (UTF-7) utf-7 csUnicode11UTF7, unicode-1-1-utf-7, x-unicode-2-0-utf-7 65000 1200 *) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ou...@us...> - 2011-06-09 20:56:26
|
Revision: 3527 http://jcl.svn.sourceforge.net/jcl/?rev=3527&view=rev Author: outchy Date: 2011-06-09 20:56:20 +0000 (Thu, 09 Jun 2011) Log Message: ----------- set the default encoding according to document encoding. Modified Paths: -------------- trunk/jcl/source/common/JclSimpleXml.pas Modified: trunk/jcl/source/common/JclSimpleXml.pas =================================================================== --- trunk/jcl/source/common/JclSimpleXml.pas 2011-06-09 20:54:52 UTC (rev 3526) +++ trunk/jcl/source/common/JclSimpleXml.pas 2011-06-09 20:56:20 UTC (rev 3527) @@ -214,6 +214,7 @@ TJclSimpleXMLElemsProlog = class(TObject) private FElems: THashedStringList; + FSimpleXml: TJclSimpleXml; function GetCount: Integer; function GetItem(const Index: Integer): TJclSimpleXMLElem; function GetEncoding: string; @@ -242,6 +243,7 @@ property Item[const Index: Integer]: TJclSimpleXMLElem read GetItem; default; property Count: Integer read GetCount; property Encoding: string read GetEncoding write SetEncoding; + property SimpleXML: TJclSimpleXML read FSimpleXML; property StandAlone: Boolean read GetStandAlone write SetStandAlone; property Version: string read GetVersion write SetVersion; end; @@ -1025,6 +1027,7 @@ FRoot := TJclSimpleXMLElemClassic.Create(nil); FRoot.FSimpleXML := Self; FProlog := TJclSimpleXMLElemsProlog.Create; + FProlog.FSimpleXML := Self; FOptions := [sxoAutoIndent, sxoAutoEncodeValue, sxoAutoEncodeEntity]; FIndentString := ' '; end; @@ -3416,8 +3419,24 @@ //=== { TJclSimpleXMLElemHeader } ============================================ function TJclSimpleXMLElemHeader.GetEncoding: string; +var + ASimpleXml: TJclSimpleXml; + DefaultCodePage: Word; begin - Result := Properties.Value('encoding', 'iso-8859-1'); + ASimpleXml := SimpleXml; + if Assigned(ASimpleXml) then + DefaultCodePage := ASimpleXml.FCodePage + else + {$IFDEF UNICODE} + DefaultCodePage := CP_UTF16LE; + {$ELSE ~UNICODE} + {$IFDEF MSWINDOWS} + DefaultCodePage := GetACP; + {$ELSE ~MSWINDOWS} + DefaultCodePage := 1252; + {$ENDIF ~MSWINDOWS} + {$ENDIF ~UNICODE} + Result := Properties.Value('encoding', CharsetNameFromCodePage(DefaultCodePage)); end; function TJclSimpleXMLElemHeader.GetStandalone: Boolean; @@ -4080,6 +4099,7 @@ // (p3) if we get here, an xml header was not found Result := TJclSimpleXMLElemHeader.Create(nil); Result.Name := 'xml'; + Result.FSimpleXml := FSimpleXml; FElems.AddObject('', Result); end; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ou...@us...> - 2011-06-09 20:15:16
|
Revision: 3525 http://jcl.svn.sourceforge.net/jcl/?rev=3525&view=rev Author: outchy Date: 2011-06-09 20:15:10 +0000 (Thu, 09 Jun 2011) Log Message: ----------- fix for TJclSimpleXml.LoadFromString and TJclSimpleXml.SaveToString for Unicode-enabled Delphi. Modified Paths: -------------- trunk/jcl/source/common/JclSimpleXml.pas Modified: trunk/jcl/source/common/JclSimpleXml.pas =================================================================== --- trunk/jcl/source/common/JclSimpleXml.pas 2011-06-09 11:44:44 UTC (rev 3524) +++ trunk/jcl/source/common/JclSimpleXml.pas 2011-06-09 20:15:10 UTC (rev 3525) @@ -1200,7 +1200,7 @@ var Stream: TStringStream; begin - Stream := TStringStream.Create(Value {$IFDEF SUPPORTS_UNICODE}, CP_UTF16LE{$ENDIF}); + Stream := TStringStream.Create(Value {$IFDEF SUPPORTS_UNICODE}, TEncoding.Unicode{$ENDIF}); try LoadFromStream(Stream {$IFDEF SUPPORTS_UNICODE}, seUTF16, CP_UTF16LE{$ENDIF}); finally @@ -1325,7 +1325,7 @@ var Stream: TStringStream; begin - Stream := TStringStream.Create('' {$IFDEF SUPPORTS_UNICODE}, CP_UTF16LE{$ENDIF}); + Stream := TStringStream.Create('' {$IFDEF SUPPORTS_UNICODE}, TEncoding.Unicode{$ENDIF}); try SaveToStream(Stream); Result := Stream.DataString; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ou...@us...> - 2011-06-09 11:44:50
|
Revision: 3524 http://jcl.svn.sourceforge.net/jcl/?rev=3524&view=rev Author: outchy Date: 2011-06-09 11:44:44 +0000 (Thu, 09 Jun 2011) Log Message: ----------- add dependency on JEDI help files. Modified Paths: -------------- trunk/thirdparty/makedist/JclHelp.xml trunk/thirdparty/makedist/JclTesting.xml trunk/thirdparty/makedist/howto-daily-weekly.txt trunk/thirdparty/makedist/howto-release.txt Modified: trunk/thirdparty/makedist/JclHelp.xml =================================================================== --- trunk/thirdparty/makedist/JclHelp.xml 2011-05-27 20:35:51 UTC (rev 3523) +++ trunk/thirdparty/makedist/JclHelp.xml 2011-06-09 11:44:44 UTC (rev 3524) @@ -44,6 +44,11 @@ <configuration index="0" caption="File name" value="%PREFIX%%SUFFIX%.log"/> <configuration index="1" caption="Append" value="no"/> </action> + <action classname="TFileCopier"> + <configuration index="0" caption="From directory" value="%JEDIHELP%"/> + <configuration index="1" caption="Filter" value="*.doxdb"/> + <configuration index="2" caption="To directory" value="..\..\help\"/> + </action> </task> <task name="jcl-html.zip" selected="-1"> <action classname="TVariableSetter"> Modified: trunk/thirdparty/makedist/JclTesting.xml =================================================================== --- trunk/thirdparty/makedist/JclTesting.xml 2011-05-27 20:35:51 UTC (rev 3523) +++ trunk/thirdparty/makedist/JclTesting.xml 2011-06-09 11:44:44 UTC (rev 3524) @@ -81,6 +81,11 @@ <configuration index="0" caption="File name" value="%PREFIX%%SUFFIX%.log"/> <configuration index="1" caption="Append" value="no"/> </action> + <action classname="TFileCopier"> + <configuration index="0" caption="From directory" value="%JEDIHELP%"/> + <configuration index="1" caption="Filter" value="*.doxdb"/> + <configuration index="2" caption="To directory" value="sandbox\help\"/> + </action> </task> <task name="jcl-daily-source" selected="0"> <action classname="TVariableSetter"> Modified: trunk/thirdparty/makedist/howto-daily-weekly.txt =================================================================== --- trunk/thirdparty/makedist/howto-daily-weekly.txt 2011-05-27 20:35:51 UTC (rev 3523) +++ trunk/thirdparty/makedist/howto-daily-weekly.txt 2011-06-09 11:44:44 UTC (rev 3524) @@ -1,12 +1,13 @@ -1/ In WinSCP: create a session that connects to host web.sourceforge.net with login "username,jcl"; -2/ Save this session as "jcl.web.sourceforge.net"; -3/ Set environment variable "DCC2006" to the compilator of Delphi 2006 or RAD Studio 2007; -4/ Set environment variable "DMCC" to Doc-o-matic command line compiler; -5/ Set environment variable "SVN" to up-to-date subversion executable; -6/ Set environment variable "WINSCP" to WinSCP executable; -7/ Copy 7z.dll from sevenzip distribution to trunk/thirdparty/makedist/ -8/ Compile makedist.exe -9/ Execute the following commands in planified tasks: +1/ In WinSCP: create a session that connects to host web.sourceforge.net with login "username,jcl"; +2/ Save this session as "jcl.web.sourceforge.net"; +3/ Set environment variable "DCC2006" to the compilator of Delphi 2006 or RAD Studio 2007; +4/ Set environment variable "DMCC" to Doc-o-matic command line compiler; +5/ Set environment variable "SVN" to up-to-date subversion executable; +6/ Set environment variable "WINSCP" to WinSCP executable; +7/ Set environment variable "JEDIHELP" to the directory containing JEDI help project (jedi/shared/help); +8/ Copy 7z.dll from sevenzip distribution to trunk/thirdparty/makedist/ +9/ Compile makedist.exe +10/ Execute the following commands in planified tasks: MakeDist.exe /c=JclTesting.xml /s=jcl-weekly-h2,jcl-weekly-hlp,jcl-weekly-chm /x MakeDist.exe /c=JclTesting.xml /s=jcl-daily-source /x Modified: trunk/thirdparty/makedist/howto-release.txt =================================================================== --- trunk/thirdparty/makedist/howto-release.txt 2011-05-27 20:35:51 UTC (rev 3523) +++ trunk/thirdparty/makedist/howto-release.txt 2011-06-09 11:44:44 UTC (rev 3524) @@ -1,12 +1,13 @@ -1/ In WinSCP: create a session that connects to host web.sourceforge.net with login "username,jcl"; -2/ Save this session as "jcl.web.sourceforge.net"; -3/ Set environment variable "DCC2006" to the compilator of Delphi 2006 or RAD Studio 2007; -4/ Set environment variable "DMCC" to Doc-o-matic command line compiler; -5/ Set environment variable "SVN" to up-to-date subversion executable; -6/ Set environment variable "WINSCP" to WinSCP executable; -7/ Copy 7z.dll from sevenzip distribution to trunk/thirdparty/makedist/ -8/ Compile makedist.exe -9/ Execute the command: +1/ In WinSCP: create a session that connects to host web.sourceforge.net with login "username,jcl"; +2/ Save this session as "jcl.web.sourceforge.net"; +3/ Set environment variable "DCC2006" to the compilator of Delphi 2006 or RAD Studio 2007; +4/ Set environment variable "DMCC" to Doc-o-matic command line compiler; +5/ Set environment variable "SVN" to up-to-date subversion executable; +6/ Set environment variable "WINSCP" to WinSCP executable; +7/ Set environment variable "JEDIHELP" to the directory containing JEDI help project (jedi/shared/help); +8/ Copy 7z.dll from sevenzip distribution to trunk/thirdparty/makedist/ +9/ Compile makedist.exe +10/ Execute the command: MakeDist.exe /c=JclFiles.xml /x This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mb...@us...> - 2011-05-27 20:35:57
|
Revision: 3523 http://jcl.svn.sourceforge.net/jcl/?rev=3523&view=rev Author: mbeutel Date: 2011-05-27 20:35:51 +0000 (Fri, 27 May 2011) Log Message: ----------- Added code to replace the RaiseException() import in the dynamic C++ RTL DLL to make sure stack traces can also be gathered for exceptions raised in C++ when the application uses the dynamic RTL. Modified Paths: -------------- trunk/jcl/source/windows/JclHookExcept.pas Modified: trunk/jcl/source/windows/JclHookExcept.pas =================================================================== --- trunk/jcl/source/windows/JclHookExcept.pas 2011-05-27 20:20:15 UTC (rev 3522) +++ trunk/jcl/source/windows/JclHookExcept.pas 2011-05-27 20:35:51 UTC (rev 3523) @@ -565,14 +565,29 @@ NewResultExc := NewExceptObj; end; +function GetCppRtlBase: Pointer; +begin + Result := Pointer (FindHInstance (System.pfnDliNotifyHook)); { hooked by C++ RTL upon startup } +end; + +function HasCppRtl: Boolean; +begin + Result := GetCppRtlBase <> TJclPeMapImgHooks.SystemBase; +end; + function JclHookExceptions: Boolean; var RaiseExceptionAddressCache: Pointer; begin + RaiseExceptionAddressCache := RaiseExceptionAddress; + { Detect C++Builder applications and C++ packages loaded into Delphi applications. + Hook the C++ RTL regardless of ExceptionsHooked so that users can call JclHookException() after + loading a C++ package which might pull in the C++ RTL DLL. } + if HasCppRtl then + TJclPeMapImgHooks.ReplaceImport (GetCppRtlBase, kernel32, RaiseExceptionAddressCache, @HookedRaiseException); if not ExceptionsHooked then begin Recursive := False; - RaiseExceptionAddressCache := RaiseExceptionAddress; with TJclPeMapImgHooks do Result := ReplaceImport(SystemBase, kernel32, RaiseExceptionAddressCache, @HookedRaiseException); if Result then @@ -595,6 +610,8 @@ function JclUnhookExceptions: Boolean; begin + if HasCppRtl then + TJclPeMapImgHooks.ReplaceImport (GetCppRtlBase, kernel32, @HookedRaiseException, @Kernel32_RaiseException); if ExceptionsHooked then begin with TJclPeMapImgHooks do This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mb...@us...> - 2011-05-27 20:20:22
|
Revision: 3522 http://jcl.svn.sourceforge.net/jcl/?rev=3522&view=rev Author: mbeutel Date: 2011-05-27 20:20:15 +0000 (Fri, 27 May 2011) Log Message: ----------- Adjusted SVN properties of JclCppException.pas to adhere to JCL conventions. Modified Paths: -------------- trunk/jcl/source/windows/JclCppException.pas Property Changed: ---------------- trunk/jcl/source/windows/JclCppException.pas Modified: trunk/jcl/source/windows/JclCppException.pas =================================================================== --- trunk/jcl/source/windows/JclCppException.pas 2011-05-27 20:02:04 UTC (rev 3521) +++ trunk/jcl/source/windows/JclCppException.pas 2011-05-27 20:20:15 UTC (rev 3522) @@ -1,631 +1,631 @@ -{**************************************************************************************************} -{ } -{ 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 SystemCppException.pas. } -{ } -{ The Initial Developer of the Original Code is Moritz Beutel. Portions created by Moritz Beutel } -{ are Copyright (C) Moritz Beutel. All Rights Reserved. } -{ } -{ Contributor(s): } -{ Moritz Beutel } -{ } -{**************************************************************************************************} -{ } -{ Routines to enable the Delphi RTL to catch, dispatch and clean up C++ exceptions and to handle } -{ exceptions derived from std::exception. } -{ } -{**************************************************************************************************} -{ } -{ Last modified: $Date:: $ } -{ Revision: $Rev:: $ } -{ Author: $Author:: $ } -{ } -{**************************************************************************************************} - -unit JclCppException; - -interface - -{$I jcl.inc} -{$I windowsonly.inc} - -uses - {$IFDEF UNITVERSIONING} - JclUnitVersioning, - {$ENDIF UNITVERSIONING} - SysUtils; - -type - PJclCppStdException = type Pointer; { mapped to std::exception* via $HPPEMIT } - {$EXTERNALSYM PJclCppStdException} - - { C++ exception of any type } - EJclCppException = class(Exception) - {$IFDEF COMPILER15_UP} - private type - TInaccessibleType = class end; - TPointerType<T> = record - type TPointer = ^T; - end; - {$ENDIF COMPILER15_UP} - private - FTypeName: AnsiString; - FExcDesc: Pointer; - - constructor CreateTypeNamed(ATypeName: PAnsiChar; ExcDesc: Pointer); overload; - function GetCppExceptionObject: Pointer; - function GetThrowLine: Integer; - function GetThrowFile: AnsiString; - public - property CppExceptionObject: Pointer read GetCppExceptionObject; - property ThrowLine: Integer read GetThrowLine; - property ThrowFile: AnsiString read GetThrowFile; - property TypeName: AnsiString read FTypeName; - - function IsCppClass: Boolean; overload; - function AsCppClass(CppClassName: AnsiString): Pointer; overload; - - {$IFDEF COMPILER15_UP} - { These are only accessible from C++ } - function IsCppClass<TCppClass: TInaccessibleType>: Boolean; overload; - function AsCppClass<TCppClass: TInaccessibleType>: TPointerType<TCppClass>.TPointer; overload; - {$ENDIF COMPILER15_UP} - - destructor Destroy; override; - end; - - { C++ exception derived from std::exception } - EJclCppStdException = class(EJclCppException) - private - FExcObj: PJclCppStdException; - - constructor Create(AExcObj: PJclCppStdException; Msg: String; - ATypeName: PAnsiChar; ExcDesc: Pointer); overload; - function GetStdException: PJclCppStdException; - public - { This property returns a pointer to the wrapped exception. } - property StdException: PJclCppStdException read GetStdException; - end; - - (*$HPPEMIT '#include <typeinfo>'*) - (*$HPPEMIT '#include <exception>'*) - (*$HPPEMIT ''*) - (*$HPPEMIT 'namespace Jclcppexception'*) - (*$HPPEMIT '{'*) - (*$HPPEMIT ''*) - (*$HPPEMIT 'typedef std::exception* PJclCppStdException;'*) - (*$HPPEMIT ''*) - (*$HPPEMIT '} /* namespace Jclcppexception */'*) - - {$IFDEF COMPILER15_UP} - (*$HPPEMIT END 'namespace Jclcppexception'*) - (*$HPPEMIT END '{'*) - (*$HPPEMIT END ''*) - (*$HPPEMIT END 'template <typename TCppClass>'*) - (*$HPPEMIT END ' bool __fastcall EJclCppException::IsCppClass<TCppClass>(void)'*) - (*$HPPEMIT END '{'*) - (*$HPPEMIT END ' return IsCppClass() && AsCppClass(typeid(TCppClass).name()) != 0;'*) - (*$HPPEMIT END '}'*) - (*$HPPEMIT END 'template <typename TCppClass>'*) - (*$HPPEMIT END ' EJclCppException::TPointerType__1<TCppClass>::TPointer __fastcall EJclCppException::AsCppClass<TCppClass>(void)'*) - (*$HPPEMIT END '{'*) - (*$HPPEMIT END ' return static_cast<typename EJclCppException::TPointerType__1<TCppClass>::TPointer>(AsCppClass(typeid(TCppClass).name()));'*) - (*$HPPEMIT END '}'*) - (*$HPPEMIT END ''*) - (*$HPPEMIT END '} /* namespace Jclcppexception */'*) - {$ENDIF COMPILER15_UP} - - -type - TJclCppExceptionFlags = set of (cefPrependCppClassName); - -var - JclCppExceptionFlags: TJclCppExceptionFlags = [cefPrependCppClassName]; - -procedure JclInstallCppExceptionFilter; -procedure JclUninstallCppExceptionFilter; -function JclCppExceptionFilterInstalled: Boolean; - - -{$IFDEF UNITVERSIONING} -const - UnitVersioning: TUnitVersionInfo = ( - RCSfile: '$URL: $'; - Revision: '$Revision: $'; - Date: '$Date: $'; - LogPath: 'JCL\source\windows'; - Extra: ''; - Data: nil - ); -{$ENDIF UNITVERSIONING} - -implementation - -uses - JclResources, JclHookExcept; - - -type - TExceptObjProc = function(P: PExceptionRecord): Exception; - - PCppTypeId = ^TCppTypeId; - - TCppBaseList = packed record { Delphi equivalent of struct baseList in xx.h } - blType : PCppTypeId; // type of this base - blOffs : Cardinal; // offset of this base - blFlags : Cardinal; // flags - end; - - TCppTypeId = packed record { incomplete Delphi equivalent of struct tpid in xx.h } - tpSize : Cardinal; // size of type in bytes - tpMask : Word; // attribute bits - tpName : Word; // offset of start of the zero terminated name - // where offset is relative from tpid base - - tpcVptrOffs : Cardinal; // offset of vtable pointer - tpcFlags : Cardinal; // more flags - - { Only valid if (tpMask & TM_IS_CLASS) } - tpcBaseList : Word; // offset of non-virt base list, - // where offset is relative from tpid base - tpcVbasList : Word; // offset of virtual base list - // where offset is relative from tpid base - - tpcDlOpAddr : Pointer; // operator delete addr - tpcDlOpMask : Word; // operator delete convention - - tpcDaOpMask : Word; // operator delete[] convention - tpcDaOpAddr : Pointer; // operator delete[] addr - - { Only valid if (tpcFlags & CF_HAS_DTOR), implies also (tpMask & TM_IS_CLASS) } - tpcDtorCount : Cardinal; // dtor count - total - tpcNVdtCount : Cardinal; // dtor count - non-virtual - - tpcDtorAddr : Pointer; // destructor addr - tpcDtorMask : Word; // destructor convention - - tpcDtMembers : Word; // offset of list of destructible members - // where offset is relative from tpid base - - { ... } - - { Following is the zero terminated name, padded with zero's to - the next dword boundary. - - Optionally (if tpMask & TM_IS_CLASS), we have next: - - non-virtual base list, terminated by a null pointer - - virtual base list, terminated by a null pointer - - Optionally (if tpcFlags & CF_HAS_DTOR), we have next: - - list of destructible members, terminated by a null pointer } - end; - -const - - { Flags for TCppTypeId.tpMask } - TM_IS_STRUCT = $0001; - TM_IS_CLASS = $0002; - TM_IS_PTR = $0010; - TM_IS_REF = $0020; - TM_IS_VOIDPTR = $0040; - TM_LOCALTYPE = $0080; - TM_IS_CONST = $0100; - TM_IS_VOLATILE = $0200; - TM_IS_ARRAY = $0400; - - { Flags for TCppTypeId.tpcFlags } - CF_HAS_CTOR = $00000001; - CF_HAS_DTOR = $00000002; - CF_HAS_BASES = $00000004; - CF_HAS_VBASES = $00000008; - CF_HAS_VTABPTR = $00000010; - CF_HAS_VIRTDT = $00000020; - CF_HAS_RTTI = $00000040; - CF_DELPHICLASS = $00000080; - CF_HAS_FARVPTR = $00001000; - CF_HAS_GUID = $00002000; - - { Flags for TCppExceptDesc.xdFlags } - XDF_ISDELPHIEXCEPTION = $00000004; - XDF_RETHROWN = $00000008; - -type - PCppExceptDesc = ^TCppExceptDesc; - TCppFreeMemFP = procedure(P: PCppExceptDesc); cdecl; - - TCppExceptDesc = packed record { Delphi equivalent of struct _exceptDesc in xx.h } - xdPrevious : Pointer; // previous exception or 0 - - xdTypeID : PCppTypeId; // addr of type-id for thrown type - xdFriendList : PCppTypeId; // friend list supplied to _ThrowExcept - xdFlags : Cardinal; // flags passed to _ThrowExcept - xdSize : Cardinal; // size of thrown value - xdBase : PCppTypeId; // type-id of base type - xdMask : Word; // type-id mask - xdCflg : Word; // type-id class flags (or 0) - - xdFreeFunc : TCppFreeMemFP; // function to free memory - - xdCCaddr : Pointer; // copy-ctor addr - xdCCmask : Cardinal; // copy-ctor mask - - xdERRaddr : Pointer; // address of matching ERR (when found) - xdHtabAdr : Pointer; // address of matching handler - - xdContext : Cardinal; // context of 'catch' block - - xdThrowLine : Cardinal; // source line no. of throw statement - xdThrowFile : PAnsiChar; // source file name of throw statement - - xdArgType : PCppTypeId; // address of arg type descriptor - xdArgAddr : Pointer; // address of arg copy on stack - xdArgBuff : AnsiChar; // arg stored in buffer - xdArgCopy : AnsiChar; // arg copied to catch arg - - xdOSESP : LongWord; // esp of main OS exception handler - xdOSERR : LongWord; // addr of the OS ERR on entry to _ExceptionHandler - xdOSContext : {PContext} Pointer; // CPU Context for an OS exception - xdValue : array[0..0] of AnsiChar; // copy of thrown value - end; - - PCppBaseList = ^TCppBaseList; - -{ pre-Tiburon workaround } -{$IFNDEF COMPILER12_UP} - PByte = PAnsiChar; -{$ENDIF ~COMPILER12_UP} - - -procedure ExceptionHandled(ExcDesc: PCppExceptDesc); forward; -function CppGetBase(var Obj: Pointer; TypeDesc: PCppTypeId; - BaseName: PAnsiChar): Boolean; forward; - -{$IFDEF COMPILER15_UP} -function EJclCppException.AsCppClass<TCppClass>: TPointerType<TCppClass>.TPointer; -begin - Assert (False); -end; -function EJclCppException.IsCppClass<TCppClass>: Boolean; -begin - Assert (False); -end; -{$ENDIF COMPILER15_UP} - -constructor EJclCppException.CreateTypeNamed(ATypeName: PAnsiChar; ExcDesc: Pointer); -begin - inherited CreateFmt(RsCppUnhandledExceptionMsg, [ATypeName]); - FTypeName := ATypeName; - FExcDesc := ExcDesc; -end; - -constructor EJclCppStdException.Create(AExcObj: PJclCppStdException; Msg: String; - ATypeName: PAnsiChar; ExcDesc: Pointer); -begin - if cefPrependCppClassName in JclCppExceptionFlags then - inherited CreateFmt('[%s] %s', [ATypeName, Msg]) - else - inherited Create(Msg); - FExcObj := AExcObj; - FTypeName := ATypeName; - FExcDesc := ExcDesc; -end; - -function EJclCppException.IsCppClass: Boolean; -var - ExcDesc: PCppExceptDesc; -begin - ExcDesc := PCppExceptDesc(FExcDesc); - Result := (ExcDesc.xdTypeID.tpMask and TM_IS_CLASS) <> 0; -end; - -function EJclCppException.GetCppExceptionObject: Pointer; -var - ExcDesc: PCppExceptDesc; -begin - ExcDesc := PCppExceptDesc(FExcDesc); - Result := @ExcDesc.xdValue; -end; - -function EJclCppException.GetThrowFile: AnsiString; -var - ExcDesc: PCppExceptDesc; -begin - ExcDesc := PCppExceptDesc(FExcDesc); - if ExcDesc.xdThrowFile <> nil then - Result := ExcDesc.xdThrowFile - else - Result := ''; -end; - -function EJclCppException.GetThrowLine: Integer; -var - ExcDesc: PCppExceptDesc; -begin - ExcDesc := PCppExceptDesc(FExcDesc); - Result := ExcDesc.xdThrowLine; -end; - -function EJclCppException.AsCppClass(CppClassName: AnsiString): Pointer; -var - ExcDesc: PCppExceptDesc; - Obj: Pointer; -begin - ExcDesc := PCppExceptDesc(FExcDesc); - Obj := @ExcDesc.xdValue; - if CppGetBase(Obj, ExcDesc.xdTypeID, PAnsiChar (CppClassName)) then - Result := Obj - else - Result := nil; -end; - -destructor EJclCppException.Destroy; -var - ExcDesc: PCppExceptDesc; -begin - ExcDesc := PCppExceptDesc(FExcDesc); - - { call the exception object's destructor and free the memory as it - is done in _CatchCleanup() in xx.cpp. } - ExceptionHandled(ExcDesc); - - { Free the memory taken up by the exception descriptor } - ExcDesc.xdFreeFunc(ExcDesc); -end; - - -function EJclCppStdException.GetStdException: PJclCppStdException; -begin - Result := FExcObj; -end; - -{ This function should basically work like destThrownValue()/callDestructor() - in xx.cpp } -procedure DestroyThrownValue (Obj: Pointer; ObjType: PCppTypeId); -type - TCdeclDestructor = procedure(Obj: Pointer; Flags: Integer); cdecl; - TPascalDestructor = procedure(Flags: Integer; Obj: Pointer); pascal; - TFastcallDestructor = procedure(Obj: Pointer; Flags: Integer); - TStdcallDestructor = procedure(Obj: Pointer; Flags: Integer); stdcall; -var - Flags: Integer; - CdeclDestructor: TCdeclDestructor; - PascalDestructor: TPascalDestructor; - FastcallDestructor: TFastcallDestructor; - StdcallDestructor: TStdcallDestructor; -begin - // callDestructor(objAddr, objType, 0, dtorAddr, dtorMask, 1); - Flags := 2; - - Assert((ObjType.tpcDtorMask and $0080) = 0, 'fastthis (-po) not supported'); - - case ObjType.tpcDtorMask and $0007 of - 1: // __cdecl - begin - CdeclDestructor := TCdeclDestructor(ObjType.tpcDtorAddr); - CdeclDestructor(Obj, Flags); - end; - 2: // __pascal - begin - PascalDestructor := TPascalDestructor(ObjType.tpcDtorAddr); - PascalDestructor(Flags, Obj); - end; - 3: // __fastcall - begin - FastcallDestructor := TFastcallDestructor(ObjType.tpcDtorAddr); - FastcallDestructor(Obj, Flags); - end; - 5: // __stdcall - begin - StdcallDestructor := TStdcallDestructor(ObjType.tpcDtorAddr); - StdcallDestructor(Obj, Flags); - end; - else - Assert(False, 'Unsupported calling convention!'); - end; -end; - -{ This function should basically work like exceptionHandled() in xx.cpp } -procedure ExceptionHandled(ExcDesc: PCppExceptDesc); -var - TypeDesc: PCppTypeId; - Obj: Pointer; -begin - { Is the thrown value still present in the descriptor? } - if Ord(ExcDesc.xdArgBuff) <> 0 then - begin - - { Destroy the thrown value if necessary } - if (ExcDesc.xdCflg and CF_HAS_DTOR) <> 0 then - begin - TypeDesc := ExcDesc.xdBase; - Obj := Pointer(@ExcDesc.xdValue); - - { All delphi class objects are thrown by pointer, sort of. - However, we should not meet a Delphi class here! } - if (TypeDesc.tpcFlags and CF_DELPHICLASS) <> 0 then - Obj := Pointer((PCardinal (Obj))^); { dereference } - - { We can't do anything about the _DestructorCount variable here, but - this is a legacy feature anyway. } - - { Don't destroy it if it's a delphi class and it's being rethrown. } - if (ExcDesc.xdFlags and (XDF_ISDELPHIEXCEPTION or XDF_RETHROWN)) - <> (XDF_ISDELPHIEXCEPTION or XDF_RETHROWN) then - DestroyThrownValue(Obj, TypeDesc); - end; - - { Mark the fact that the arg is gone } - ExcDesc.xdArgBuff := AnsiChar(0); - end; - - { Did we make a copy of the argument? } - if Ord (ExcDesc.xdArgCopy) <> 0 then - begin - TypeDesc := ExcDesc.xdArgType; - - { Destroy the thrown value if necessary } - if ((TypeDesc.tpMask and TM_IS_CLASS) <> 0) - and ((TypeDesc.tpcFlags and CF_HAS_DTOR) <> 0) then - DestroyThrownValue(ExcDesc.xdArgAddr, TypeDesc); - - { Mark the fact that the arg is gone } - ExcDesc.xdArgCopy := AnsiChar(0); - end; -end; - -{ It is not easy to get the C++ type description for std::exception, - therefore we identify the base class by name. - - This function should basically work like locateBaseClass() in xxtype.cpp } -function LocateCppBaseClass(BaseList: PCppBaseList; VBase: Boolean; - BaseName: PAnsiChar; var Addr: Pointer) : Boolean; -var - Ptr: Pointer; - BaseBaseList: PCppBaseList; - BaseType: PCppTypeId; -begin - { Check for end of base list } - Result := False; - while BaseList.blType <> nil do - begin - BaseType := BaseList.blType; - - Ptr := Pointer(PByte(Addr) + BaseList.blOffs); - Inc(BaseList); - - if VBase then - Ptr := Pointer((PCardinal(Ptr))^); { dereference } - - { Is this the right base class? } - if StrComp(PAnsiChar(PByte(BaseType) + BaseType.tpName), BaseName) = 0 then - begin - Addr := Ptr; { Match --> return the adjusted pointer to the caller } - Result := True; - Exit; - end; - - { Does this base class have any base classes? } - { Annotation: Would BaseType.tpcFlags & CF_HAS_BASES be a better match for this? } - if (BaseType.tpMask and TM_IS_CLASS) = 0 then - Continue; - - { Get the list of non-virtual bases for this base class } - BaseBaseList := PCppBaseList(PByte (BaseType) + BaseType.tpcBaseList); - - { Give up on this base if it has no non-virtual bases (Ann.: why?) } - if BaseBaseList = nil then - Continue; - - { Search the base classes of this base recursively } - if LocateCppBaseClass(BaseBaseList, False, BaseName, Ptr) then - begin - Addr := Ptr; { Match --> return the adjusted pointer to the caller } - Result := True; - Exit; - end; - end; -end; - -function CppGetBase(var Obj: Pointer; TypeDesc: PCppTypeId; - BaseName: PAnsiChar): Boolean; -var - BaseList, VBaseList: PCppBaseList; -begin - if StrComp(PAnsiChar(PByte(TypeDesc) + TypeDesc.tpName), BaseName) = 0 then - { a class can be considered its own base } - Result := True - else if (TypeDesc.tpMask and TM_IS_CLASS) <> 0 then - begin - { iterate through the base classes } - BaseList := PCppBaseList(PByte(TypeDesc) + TypeDesc.tpcBaseList); - VBaseList := PCppBaseList(PByte(TypeDesc) + TypeDesc.tpcVbasList); - Result := LocateCppBaseClass(BaseList, False, BaseName, Obj) - or LocateCppBaseClass(VBaseList, False, BaseName, Obj); - end - else - Result := False; { Don't be surprised. C++ permits to throw every type. } -end; - -function CppExceptObjProc(P: PExceptionRecord): Exception; -type - { Function pointer to std::type_info::what(). - In the Dinkumware library, std::exception::what() always has the - __cdecl calling convention. } - TCppTypeInfoWhatMethod = function(This: Pointer): PAnsiChar; cdecl; -var - ExcTypeName: PAnsiChar; - ExcDesc: PCppExceptDesc; - ExcObject: Pointer; - ExcObjectVTbl: Pointer; - WhatMethod: TCppTypeInfoWhatMethod; -begin - Result := nil; - case P.ExceptionCode of - $0EEFFACE: { C++ exception } - begin - { When a C++ exception is thrown, the C++ compiler (indirectly) calls the - tossAnException function defined in xx.cpp. The Win32 exception argument - table is filled in line 1096ff as follows: - - argTable[0] = (unsigned long)(void __far *)__throwExceptionName; - argTable[1] = (unsigned long)(void __far *)throwPC; - argTable[2] = (unsigned long)(void __far *)xdp; // : PCppExceptDesc } - - ExcTypeName := PAnsiChar(P.ExceptionInformation[0]); - ExcDesc := PCppExceptDesc(P.ExceptionInformation[2]); - ExcObject := Pointer(@ExcDesc.xdValue); - - if CppGetBase(ExcObject, ExcDesc.xdTypeID, 'std::exception') then - begin - { The exception object is a std::exception subclass and implements - the virtual member function what(). } - ExcObjectVTbl := Pointer(PCardinal (ExcObject)^); - WhatMethod := TCppTypeInfoWhatMethod(PCardinal ( - Cardinal (ExcObjectVTbl) + SizeOf (Pointer))^); - Result := EJclCppStdException.Create(ExcObject, String(WhatMethod(ExcObject)), - PAnsiChar(ExcTypeName), Pointer(ExcDesc)); - end - else - { The exception object has some other type. We cannot extract an - exception message with reasonable efforts. } - Result := EJclCppException.CreateTypeNamed(PAnsiChar(ExcTypeName), Pointer (ExcDesc)); - end; - end; -end; - -var - HookInstalled: Boolean = False; - -procedure JclInstallCppExceptionFilter; -begin - Assert(JclHookExcept.JclExceptionsHooked, - 'Cannot install C++ exception filter: call JclHookExcept.JclHookExceptions() first!'); - if HookInstalled then - Exit; - HookInstalled := JclHookExcept.JclAddExceptFilter(@CppExceptObjProc, npFirstChain); -end; - -procedure JclUninstallCppExceptionFilter; -begin - if not HookInstalled then - Exit; - JclHookExcept.JclRemoveExceptFilter(@CppExceptObjProc); - HookInstalled := False; -end; - -function JclCppExceptionFilterInstalled: Boolean; -begin - Result := HookInstalled; -end; - -end. - +{**************************************************************************************************} +{ } +{ 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 SystemCppException.pas. } +{ } +{ The Initial Developer of the Original Code is Moritz Beutel. Portions created by Moritz Beutel } +{ are Copyright (C) Moritz Beutel. All Rights Reserved. } +{ } +{ Contributor(s): } +{ Moritz Beutel } +{ } +{**************************************************************************************************} +{ } +{ Routines to enable the Delphi RTL to catch, dispatch and clean up C++ exceptions and to handle } +{ exceptions derived from std::exception. } +{ } +{**************************************************************************************************} +{ } +{ Last modified: $Date:: $ } +{ Revision: $Rev:: $ } +{ Author: $Author:: $ } +{ } +{**************************************************************************************************} + +unit JclCppException; + +interface + +{$I jcl.inc} +{$I windowsonly.inc} + +uses + {$IFDEF UNITVERSIONING} + JclUnitVersioning, + {$ENDIF UNITVERSIONING} + SysUtils; + +type + PJclCppStdException = type Pointer; { mapped to std::exception* via $HPPEMIT } + {$EXTERNALSYM PJclCppStdException} + + { C++ exception of any type } + EJclCppException = class(Exception) + {$IFDEF COMPILER15_UP} + private type + TInaccessibleType = class end; + TPointerType<T> = record + type TPointer = ^T; + end; + {$ENDIF COMPILER15_UP} + private + FTypeName: AnsiString; + FExcDesc: Pointer; + + constructor CreateTypeNamed(ATypeName: PAnsiChar; ExcDesc: Pointer); overload; + function GetCppExceptionObject: Pointer; + function GetThrowLine: Integer; + function GetThrowFile: AnsiString; + public + property CppExceptionObject: Pointer read GetCppExceptionObject; + property ThrowLine: Integer read GetThrowLine; + property ThrowFile: AnsiString read GetThrowFile; + property TypeName: AnsiString read FTypeName; + + function IsCppClass: Boolean; overload; + function AsCppClass(CppClassName: AnsiString): Pointer; overload; + + {$IFDEF COMPILER15_UP} + { These are only accessible from C++ } + function IsCppClass<TCppClass: TInaccessibleType>: Boolean; overload; + function AsCppClass<TCppClass: TInaccessibleType>: TPointerType<TCppClass>.TPointer; overload; + {$ENDIF COMPILER15_UP} + + destructor Destroy; override; + end; + + { C++ exception derived from std::exception } + EJclCppStdException = class(EJclCppException) + private + FExcObj: PJclCppStdException; + + constructor Create(AExcObj: PJclCppStdException; Msg: String; + ATypeName: PAnsiChar; ExcDesc: Pointer); overload; + function GetStdException: PJclCppStdException; + public + { This property returns a pointer to the wrapped exception. } + property StdException: PJclCppStdException read GetStdException; + end; + + (*$HPPEMIT '#include <typeinfo>'*) + (*$HPPEMIT '#include <exception>'*) + (*$HPPEMIT ''*) + (*$HPPEMIT 'namespace Jclcppexception'*) + (*$HPPEMIT '{'*) + (*$HPPEMIT ''*) + (*$HPPEMIT 'typedef std::exception* PJclCppStdException;'*) + (*$HPPEMIT ''*) + (*$HPPEMIT '} /* namespace Jclcppexception */'*) + + {$IFDEF COMPILER15_UP} + (*$HPPEMIT END 'namespace Jclcppexception'*) + (*$HPPEMIT END '{'*) + (*$HPPEMIT END ''*) + (*$HPPEMIT END 'template <typename TCppClass>'*) + (*$HPPEMIT END ' bool __fastcall EJclCppException::IsCppClass<TCppClass>(void)'*) + (*$HPPEMIT END '{'*) + (*$HPPEMIT END ' return IsCppClass() && AsCppClass(typeid(TCppClass).name()) != 0;'*) + (*$HPPEMIT END '}'*) + (*$HPPEMIT END 'template <typename TCppClass>'*) + (*$HPPEMIT END ' EJclCppException::TPointerType__1<TCppClass>::TPointer __fastcall EJclCppException::AsCppClass<TCppClass>(void)'*) + (*$HPPEMIT END '{'*) + (*$HPPEMIT END ' return static_cast<typename EJclCppException::TPointerType__1<TCppClass>::TPointer>(AsCppClass(typeid(TCppClass).name()));'*) + (*$HPPEMIT END '}'*) + (*$HPPEMIT END ''*) + (*$HPPEMIT END '} /* namespace Jclcppexception */'*) + {$ENDIF COMPILER15_UP} + + +type + TJclCppExceptionFlags = set of (cefPrependCppClassName); + +var + JclCppExceptionFlags: TJclCppExceptionFlags = [cefPrependCppClassName]; + +procedure JclInstallCppExceptionFilter; +procedure JclUninstallCppExceptionFilter; +function JclCppExceptionFilterInstalled: Boolean; + + +{$IFDEF UNITVERSIONING} +const + UnitVersioning: TUnitVersionInfo = ( + RCSfile: '$URL$'; + Revision: '$Revision$'; + Date: '$Date$'; + LogPath: 'JCL\source\windows'; + Extra: ''; + Data: nil + ); +{$ENDIF UNITVERSIONING} + +implementation + +uses + JclResources, JclHookExcept; + + +type + TExceptObjProc = function(P: PExceptionRecord): Exception; + + PCppTypeId = ^TCppTypeId; + + TCppBaseList = packed record { Delphi equivalent of struct baseList in xx.h } + blType : PCppTypeId; // type of this base + blOffs : Cardinal; // offset of this base + blFlags : Cardinal; // flags + end; + + TCppTypeId = packed record { incomplete Delphi equivalent of struct tpid in xx.h } + tpSize : Cardinal; // size of type in bytes + tpMask : Word; // attribute bits + tpName : Word; // offset of start of the zero terminated name + // where offset is relative from tpid base + + tpcVptrOffs : Cardinal; // offset of vtable pointer + tpcFlags : Cardinal; // more flags + + { Only valid if (tpMask & TM_IS_CLASS) } + tpcBaseList : Word; // offset of non-virt base list, + // where offset is relative from tpid base + tpcVbasList : Word; // offset of virtual base list + // where offset is relative from tpid base + + tpcDlOpAddr : Pointer; // operator delete addr + tpcDlOpMask : Word; // operator delete convention + + tpcDaOpMask : Word; // operator delete[] convention + tpcDaOpAddr : Pointer; // operator delete[] addr + + { Only valid if (tpcFlags & CF_HAS_DTOR), implies also (tpMask & TM_IS_CLASS) } + tpcDtorCount : Cardinal; // dtor count - total + tpcNVdtCount : Cardinal; // dtor count - non-virtual + + tpcDtorAddr : Pointer; // destructor addr + tpcDtorMask : Word; // destructor convention + + tpcDtMembers : Word; // offset of list of destructible members + // where offset is relative from tpid base + + { ... } + + { Following is the zero terminated name, padded with zero's to + the next dword boundary. + + Optionally (if tpMask & TM_IS_CLASS), we have next: + - non-virtual base list, terminated by a null pointer + - virtual base list, terminated by a null pointer + + Optionally (if tpcFlags & CF_HAS_DTOR), we have next: + - list of destructible members, terminated by a null pointer } + end; + +const + + { Flags for TCppTypeId.tpMask } + TM_IS_STRUCT = $0001; + TM_IS_CLASS = $0002; + TM_IS_PTR = $0010; + TM_IS_REF = $0020; + TM_IS_VOIDPTR = $0040; + TM_LOCALTYPE = $0080; + TM_IS_CONST = $0100; + TM_IS_VOLATILE = $0200; + TM_IS_ARRAY = $0400; + + { Flags for TCppTypeId.tpcFlags } + CF_HAS_CTOR = $00000001; + CF_HAS_DTOR = $00000002; + CF_HAS_BASES = $00000004; + CF_HAS_VBASES = $00000008; + CF_HAS_VTABPTR = $00000010; + CF_HAS_VIRTDT = $00000020; + CF_HAS_RTTI = $00000040; + CF_DELPHICLASS = $00000080; + CF_HAS_FARVPTR = $00001000; + CF_HAS_GUID = $00002000; + + { Flags for TCppExceptDesc.xdFlags } + XDF_ISDELPHIEXCEPTION = $00000004; + XDF_RETHROWN = $00000008; + +type + PCppExceptDesc = ^TCppExceptDesc; + TCppFreeMemFP = procedure(P: PCppExceptDesc); cdecl; + + TCppExceptDesc = packed record { Delphi equivalent of struct _exceptDesc in xx.h } + xdPrevious : Pointer; // previous exception or 0 + + xdTypeID : PCppTypeId; // addr of type-id for thrown type + xdFriendList : PCppTypeId; // friend list supplied to _ThrowExcept + xdFlags : Cardinal; // flags passed to _ThrowExcept + xdSize : Cardinal; // size of thrown value + xdBase : PCppTypeId; // type-id of base type + xdMask : Word; // type-id mask + xdCflg : Word; // type-id class flags (or 0) + + xdFreeFunc : TCppFreeMemFP; // function to free memory + + xdCCaddr : Pointer; // copy-ctor addr + xdCCmask : Cardinal; // copy-ctor mask + + xdERRaddr : Pointer; // address of matching ERR (when found) + xdHtabAdr : Pointer; // address of matching handler + + xdContext : Cardinal; // context of 'catch' block + + xdThrowLine : Cardinal; // source line no. of throw statement + xdThrowFile : PAnsiChar; // source file name of throw statement + + xdArgType : PCppTypeId; // address of arg type descriptor + xdArgAddr : Pointer; // address of arg copy on stack + xdArgBuff : AnsiChar; // arg stored in buffer + xdArgCopy : AnsiChar; // arg copied to catch arg + + xdOSESP : LongWord; // esp of main OS exception handler + xdOSERR : LongWord; // addr of the OS ERR on entry to _ExceptionHandler + xdOSContext : {PContext} Pointer; // CPU Context for an OS exception + xdValue : array[0..0] of AnsiChar; // copy of thrown value + end; + + PCppBaseList = ^TCppBaseList; + +{ pre-Tiburon workaround } +{$IFNDEF COMPILER12_UP} + PByte = PAnsiChar; +{$ENDIF ~COMPILER12_UP} + + +procedure ExceptionHandled(ExcDesc: PCppExceptDesc); forward; +function CppGetBase(var Obj: Pointer; TypeDesc: PCppTypeId; + BaseName: PAnsiChar): Boolean; forward; + +{$IFDEF COMPILER15_UP} +function EJclCppException.AsCppClass<TCppClass>: TPointerType<TCppClass>.TPointer; +begin + Assert (False); +end; +function EJclCppException.IsCppClass<TCppClass>: Boolean; +begin + Assert (False); +end; +{$ENDIF COMPILER15_UP} + +constructor EJclCppException.CreateTypeNamed(ATypeName: PAnsiChar; ExcDesc: Pointer); +begin + inherited CreateFmt(RsCppUnhandledExceptionMsg, [ATypeName]); + FTypeName := ATypeName; + FExcDesc := ExcDesc; +end; + +constructor EJclCppStdException.Create(AExcObj: PJclCppStdException; Msg: String; + ATypeName: PAnsiChar; ExcDesc: Pointer); +begin + if cefPrependCppClassName in JclCppExceptionFlags then + inherited CreateFmt('[%s] %s', [ATypeName, Msg]) + else + inherited Create(Msg); + FExcObj := AExcObj; + FTypeName := ATypeName; + FExcDesc := ExcDesc; +end; + +function EJclCppException.IsCppClass: Boolean; +var + ExcDesc: PCppExceptDesc; +begin + ExcDesc := PCppExceptDesc(FExcDesc); + Result := (ExcDesc.xdTypeID.tpMask and TM_IS_CLASS) <> 0; +end; + +function EJclCppException.GetCppExceptionObject: Pointer; +var + ExcDesc: PCppExceptDesc; +begin + ExcDesc := PCppExceptDesc(FExcDesc); + Result := @ExcDesc.xdValue; +end; + +function EJclCppException.GetThrowFile: AnsiString; +var + ExcDesc: PCppExceptDesc; +begin + ExcDesc := PCppExceptDesc(FExcDesc); + if ExcDesc.xdThrowFile <> nil then + Result := ExcDesc.xdThrowFile + else + Result := ''; +end; + +function EJclCppException.GetThrowLine: Integer; +var + ExcDesc: PCppExceptDesc; +begin + ExcDesc := PCppExceptDesc(FExcDesc); + Result := ExcDesc.xdThrowLine; +end; + +function EJclCppException.AsCppClass(CppClassName: AnsiString): Pointer; +var + ExcDesc: PCppExceptDesc; + Obj: Pointer; +begin + ExcDesc := PCppExceptDesc(FExcDesc); + Obj := @ExcDesc.xdValue; + if CppGetBase(Obj, ExcDesc.xdTypeID, PAnsiChar (CppClassName)) then + Result := Obj + else + Result := nil; +end; + +destructor EJclCppException.Destroy; +var + ExcDesc: PCppExceptDesc; +begin + ExcDesc := PCppExceptDesc(FExcDesc); + + { call the exception object's destructor and free the memory as it + is done in _CatchCleanup() in xx.cpp. } + ExceptionHandled(ExcDesc); + + { Free the memory taken up by the exception descriptor } + ExcDesc.xdFreeFunc(ExcDesc); +end; + + +function EJclCppStdException.GetStdException: PJclCppStdException; +begin + Result := FExcObj; +end; + +{ This function should basically work like destThrownValue()/callDestructor() + in xx.cpp } +procedure DestroyThrownValue (Obj: Pointer; ObjType: PCppTypeId); +type + TCdeclDestructor = procedure(Obj: Pointer; Flags: Integer); cdecl; + TPascalDestructor = procedure(Flags: Integer; Obj: Pointer); pascal; + TFastcallDestructor = procedure(Obj: Pointer; Flags: Integer); + TStdcallDestructor = procedure(Obj: Pointer; Flags: Integer); stdcall; +var + Flags: Integer; + CdeclDestructor: TCdeclDestructor; + PascalDestructor: TPascalDestructor; + FastcallDestructor: TFastcallDestructor; + StdcallDestructor: TStdcallDestructor; +begin + // callDestructor(objAddr, objType, 0, dtorAddr, dtorMask, 1); + Flags := 2; + + Assert((ObjType.tpcDtorMask and $0080) = 0, 'fastthis (-po) not supported'); + + case ObjType.tpcDtorMask and $0007 of + 1: // __cdecl + begin + CdeclDestructor := TCdeclDestructor(ObjType.tpcDtorAddr); + CdeclDestructor(Obj, Flags); + end; + 2: // __pascal + begin + PascalDestructor := TPascalDestructor(ObjType.tpcDtorAddr); + PascalDestructor(Flags, Obj); + end; + 3: // __fastcall + begin + FastcallDestructor := TFastcallDestructor(ObjType.tpcDtorAddr); + FastcallDestructor(Obj, Flags); + end; + 5: // __stdcall + begin + StdcallDestructor := TStdcallDestructor(ObjType.tpcDtorAddr); + StdcallDestructor(Obj, Flags); + end; + else + Assert(False, 'Unsupported calling convention!'); + end; +end; + +{ This function should basically work like exceptionHandled() in xx.cpp } +procedure ExceptionHandled(ExcDesc: PCppExceptDesc); +var + TypeDesc: PCppTypeId; + Obj: Pointer; +begin + { Is the thrown value still present in the descriptor? } + if Ord(ExcDesc.xdArgBuff) <> 0 then + begin + + { Destroy the thrown value if necessary } + if (ExcDesc.xdCflg and CF_HAS_DTOR) <> 0 then + begin + TypeDesc := ExcDesc.xdBase; + Obj := Pointer(@ExcDesc.xdValue); + + { All delphi class objects are thrown by pointer, sort of. + However, we should not meet a Delphi class here! } + if (TypeDesc.tpcFlags and CF_DELPHICLASS) <> 0 then + Obj := Pointer((PCardinal (Obj))^); { dereference } + + { We can't do anything about the _DestructorCount variable here, but + this is a legacy feature anyway. } + + { Don't destroy it if it's a delphi class and it's being rethrown. } + if (ExcDesc.xdFlags and (XDF_ISDELPHIEXCEPTION or XDF_RETHROWN)) + <> (XDF_ISDELPHIEXCEPTION or XDF_RETHROWN) then + DestroyThrownValue(Obj, TypeDesc); + end; + + { Mark the fact that the arg is gone } + ExcDesc.xdArgBuff := AnsiChar(0); + end; + + { Did we make a copy of the argument? } + if Ord (ExcDesc.xdArgCopy) <> 0 then + begin + TypeDesc := ExcDesc.xdArgType; + + { Destroy the thrown value if necessary } + if ((TypeDesc.tpMask and TM_IS_CLASS) <> 0) + and ((TypeDesc.tpcFlags and CF_HAS_DTOR) <> 0) then + DestroyThrownValue(ExcDesc.xdArgAddr, TypeDesc); + + { Mark the fact that the arg is gone } + ExcDesc.xdArgCopy := AnsiChar(0); + end; +end; + +{ It is not easy to get the C++ type description for std::exception, + therefore we identify the base class by name. + + This function should basically work like locateBaseClass() in xxtype.cpp } +function LocateCppBaseClass(BaseList: PCppBaseList; VBase: Boolean; + BaseName: PAnsiChar; var Addr: Pointer) : Boolean; +var + Ptr: Pointer; + BaseBaseList: PCppBaseList; + BaseType: PCppTypeId; +begin + { Check for end of base list } + Result := False; + while BaseList.blType <> nil do + begin + BaseType := BaseList.blType; + + Ptr := Pointer(PByte(Addr) + BaseList.blOffs); + Inc(BaseList); + + if VBase then + Ptr := Pointer((PCardinal(Ptr))^); { dereference } + + { Is this the right base class? } + if StrComp(PAnsiChar(PByte(BaseType) + BaseType.tpName), BaseName) = 0 then + begin + Addr := Ptr; { Match --> return the adjusted pointer to the caller } + Result := True; + Exit; + end; + + { Does this base class have any base classes? } + { Annotation: Would BaseType.tpcFlags & CF_HAS_BASES be a better match for this? } + if (BaseType.tpMask and TM_IS_CLASS) = 0 then + Continue; + + { Get the list of non-virtual bases for this base class } + BaseBaseList := PCppBaseList(PByte (BaseType) + BaseType.tpcBaseList); + + { Give up on this base if it has no non-virtual bases (Ann.: why?) } + if BaseBaseList = nil then + Continue; + + { Search the base classes of this base recursively } + if LocateCppBaseClass(BaseBaseList, False, BaseName, Ptr) then + begin + Addr := Ptr; { Match --> return the adjusted pointer to the caller } + Result := True; + Exit; + end; + end; +end; + +function CppGetBase(var Obj: Pointer; TypeDesc: PCppTypeId; + BaseName: PAnsiChar): Boolean; +var + BaseList, VBaseList: PCppBaseList; +begin + if StrComp(PAnsiChar(PByte(TypeDesc) + TypeDesc.tpName), BaseName) = 0 then + { a class can be considered its own base } + Result := True + else if (TypeDesc.tpMask and TM_IS_CLASS) <> 0 then + begin + { iterate through the base classes } + BaseList := PCppBaseList(PByte(TypeDesc) + TypeDesc.tpcBaseList); + VBaseList := PCppBaseList(PByte(TypeDesc) + TypeDesc.tpcVbasList); + Result := LocateCppBaseClass(BaseList, False, BaseName, Obj) + or LocateCppBaseClass(VBaseList, False, BaseName, Obj); + end + else + Result := False; { Don't be surprised. C++ permits to throw every type. } +end; + +function CppExceptObjProc(P: PExceptionRecord): Exception; +type + { Function pointer to std::type_info::what(). + In the Dinkumware library, std::exception::what() always has the + __cdecl calling convention. } + TCppTypeInfoWhatMethod = function(This: Pointer): PAnsiChar; cdecl; +var + ExcTypeName: PAnsiChar; + ExcDesc: PCppExceptDesc; + ExcObject: Pointer; + ExcObjectVTbl: Pointer; + WhatMethod: TCppTypeInfoWhatMethod; +begin + Result := nil; + case P.ExceptionCode of + $0EEFFACE: { C++ exception } + begin + { When a C++ exception is thrown, the C++ compiler (indirectly) calls the + tossAnException function defined in xx.cpp. The Win32 exception argument + table is filled in line 1096ff as follows: + + argTable[0] = (unsigned long)(void __far *)__throwExceptionName; + argTable[1] = (unsigned long)(void __far *)throwPC; + argTable[2] = (unsigned long)(void __far *)xdp; // : PCppExceptDesc } + + ExcTypeName := PAnsiChar(P.ExceptionInformation[0]); + ExcDesc := PCppExceptDesc(P.ExceptionInformation[2]); + ExcObject := Pointer(@ExcDesc.xdValue); + + if CppGetBase(ExcObject, ExcDesc.xdTypeID, 'std::exception') then + begin + { The exception object is a std::exception subclass and implements + the virtual member function what(). } + ExcObjectVTbl := Pointer(PCardinal (ExcObject)^); + WhatMethod := TCppTypeInfoWhatMethod(PCardinal ( + Cardinal (ExcObjectVTbl) + SizeOf (Pointer))^); + Result := EJclCppStdException.Create(ExcObject, String(WhatMethod(ExcObject)), + PAnsiChar(ExcTypeName), Pointer(ExcDesc)); + end + else + { The exception object has some other type. We cannot extract an + exception message with reasonable efforts. } + Result := EJclCppException.CreateTypeNamed(PAnsiChar(ExcTypeName), Pointer (ExcDesc)); + end; + end; +end; + +var + HookInstalled: Boolean = False; + +procedure JclInstallCppExceptionFilter; +begin + Assert(JclHookExcept.JclExceptionsHooked, + 'Cannot install C++ exception filter: call JclHookExcept.JclHookExceptions() first!'); + if HookInstalled then + Exit; + HookInstalled := JclHookExcept.JclAddExceptFilter(@CppExceptObjProc, npFirstChain); +end; + +procedure JclUninstallCppExceptionFilter; +begin + if not HookInstalled then + Exit; + JclHookExcept.JclRemoveExceptFilter(@CppExceptObjProc); + HookInstalled := False; +end; + +function JclCppExceptionFilterInstalled: Boolean; +begin + Result := HookInstalled; +end; + +end. + Property changes on: trunk/jcl/source/windows/JclCppException.pas ___________________________________________________________________ Added: svn:keywords + URL HeadURL Author LastChangedBy Date LastChangedDate Rev Revision LastChangedRevision Id Added: svn:eol-style + native This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mb...@us...> - 2011-05-27 20:02:12
|
Revision: 3521 http://jcl.svn.sourceforge.net/jcl/?rev=3521&view=rev Author: mbeutel Date: 2011-05-27 20:02:04 +0000 (Fri, 27 May 2011) Log Message: ----------- Added JclCppException.pas to the repository. (Original code: SystemCppException.pas, cf. http://www.audacia-software.de/en/bcb/external-exception-eefface.htm) JclCppException.pas uses the exception hooking mechanisms from JclHookExcept.pas to intercept the creation of external exception wrappers for C++ exceptions (usually known by the message "External Exception EEFFACE"). It is capable of generating useful error messages by propagating the value of std::exception::what() to the wrapper exception's Message property. It also provides access to the underlying C++ exception object in a type-safe way, and it ensures proper cleanup of the C++ exception object. Modified Paths: -------------- trunk/jcl/devtools/pgEdit.xml trunk/jcl/packages/c6/Jcl.bpk trunk/jcl/packages/c6/Jcl.dpk trunk/jcl/packages/d10/Jcl.dpk trunk/jcl/packages/d11/Jcl.dpk trunk/jcl/packages/d11/Jcl.dproj trunk/jcl/packages/d12/Jcl.dpk trunk/jcl/packages/d12/Jcl.dproj trunk/jcl/packages/d14/Jcl.dpk trunk/jcl/packages/d14/Jcl.dproj trunk/jcl/packages/d15/Jcl.dpk trunk/jcl/packages/d15/Jcl.dproj trunk/jcl/packages/d6/Jcl.dpk trunk/jcl/packages/d7/Jcl.dpk trunk/jcl/packages/d9/Jcl.dpk trunk/jcl/packages/fpc/Jcl.lpk trunk/jcl/packages/fpc/Jcl.pas trunk/jcl/packages/help/Jcl.dox trunk/jcl/packages/xml/Jcl-R.xml trunk/jcl/source/common/JclResources.pas Added Paths: ----------- trunk/jcl/source/windows/JclCppException.pas Modified: trunk/jcl/devtools/pgEdit.xml =================================================================== --- trunk/jcl/devtools/pgEdit.xml 2011-05-27 19:52:47 UTC (rev 3520) +++ trunk/jcl/devtools/pgEdit.xml 2011-05-27 20:02:04 UTC (rev 3521) @@ -1,7 +1,22 @@ <?xml version="1.0" encoding="iso-8859-1" standalone="no"?> <Configuration> <!-- These are the values stored by jaxStore --> - <pgEdit/> + <pgEdit> + <FormVersion>0</FormVersion> + <ShowCmd>1</ShowCmd> + <Flags>0</Flags> + <PixelsPerInch>96</PixelsPerInch> + <MinMaxPos_1680x1050_>-1,-1,-1,-1</MinMaxPos_1680x1050_> + <MinMaxPos>-1,-1,-1,-1</MinMaxPos> + <NormPos_1680x1050_>340,187,1338,906</NormPos_1680x1050_> + <NormPos>340,187,1338,906</NormPos> + <pnlList_Width>211</pnlList_Width> + <jsgDependencies_Height>129</jsgDependencies_Height> + <pnlEdit_Width>769</pnlEdit_Width> + <jsgFiles_Height>267</jsgFiles_Height> + <odlAddFiles_InitialDir>..\..\source\windows</odlAddFiles_InitialDir> + <cmbModel_ItemIndex>0</cmbModel_ItemIndex> + </pgEdit> <!-- The nodes below are read by the generation process. Packages are generated according to a model. The models are defined Modified: trunk/jcl/packages/c6/Jcl.bpk =================================================================== --- trunk/jcl/packages/c6/Jcl.bpk 2011-05-27 19:52:47 UTC (rev 3520) +++ trunk/jcl/packages/c6/Jcl.bpk 2011-05-27 20:02:04 UTC (rev 3521) @@ -5,7 +5,7 @@ DO NOT EDIT THIS FILE, IT IS GENERATED BY THE PACKAGE GENERATOR ALWAYS EDIT THE RELATED XML FILE (Jcl-R.xml) - Last generated: 07-05-2010 18:46:59 UTC + Last generated: 27-05-2011 01:09:11 UTC ***************************************************************************** --> <PROJECT> @@ -87,6 +87,7 @@ ..\..\lib\c6\MSTask.obj ..\..\lib\c6\sevenzip.obj ..\..\lib\c6\Snmp.obj + ..\..\lib\c6\JclCppException.obj "/> <RESFILES value="Jcl.res"/> <IDLFILES value=""/> @@ -210,6 +211,7 @@ <FILE FILENAME="..\..\source\windows\MSTask.pas" FORMNAME="" UNITNAME="MSTask" CONTAINERID="PascalCompiler" DESIGNCLASS="" LOCALCOMMAND=""/> <FILE FILENAME="..\..\source\windows\sevenzip.pas" FORMNAME="" UNITNAME="sevenzip" CONTAINERID="PascalCompiler" DESIGNCLASS="" LOCALCOMMAND=""/> <FILE FILENAME="..\..\source\windows\Snmp.pas" FORMNAME="" UNITNAME="Snmp" CONTAINERID="PascalCompiler" DESIGNCLASS="" LOCALCOMMAND=""/> + <FILE FILENAME="..\..\source\windows\JclCppException.pas" FORMNAME="" UNITNAME="JclCppException" CONTAINERID="PascalCompiler" DESIGNCLASS="" LOCALCOMMAND=""/> </FILELIST> <BUILDTOOLS> </BUILDTOOLS> Modified: trunk/jcl/packages/c6/Jcl.dpk =================================================================== --- trunk/jcl/packages/c6/Jcl.dpk 2011-05-27 19:52:47 UTC (rev 3520) +++ trunk/jcl/packages/c6/Jcl.dpk 2011-05-27 20:02:04 UTC (rev 3521) @@ -4,7 +4,7 @@ DO NOT EDIT THIS FILE, IT IS GENERATED BY THE PACKAGE GENERATOR ALWAYS EDIT THE RELATED XML FILE (Jcl-R.xml) - Last generated: 07-05-2010 18:46:59 UTC + Last generated: 27-05-2011 01:09:12 UTC ----------------------------------------------------------------------------- } @@ -117,6 +117,7 @@ JclWinMIDI in '..\..\source\windows\JclWinMIDI.pas' , MSTask in '..\..\source\windows\MSTask.pas' , sevenzip in '..\..\source\windows\sevenzip.pas' , - Snmp in '..\..\source\windows\Snmp.pas' + Snmp in '..\..\source\windows\Snmp.pas' , + JclCppException in '..\..\source\windows\JclCppException.pas' ; end. Modified: trunk/jcl/packages/d10/Jcl.dpk =================================================================== --- trunk/jcl/packages/d10/Jcl.dpk 2011-05-27 19:52:47 UTC (rev 3520) +++ trunk/jcl/packages/d10/Jcl.dpk 2011-05-27 20:02:04 UTC (rev 3521) @@ -4,7 +4,7 @@ DO NOT EDIT THIS FILE, IT IS GENERATED BY THE PACKAGE GENERATOR ALWAYS EDIT THE RELATED XML FILE (Jcl-R.xml) - Last generated: 07-05-2010 18:46:59 UTC + Last generated: 27-05-2011 01:09:15 UTC ----------------------------------------------------------------------------- } @@ -121,7 +121,8 @@ mscorlib_TLB in '..\..\source\windows\mscorlib_TLB.pas' , MSTask in '..\..\source\windows\MSTask.pas' , sevenzip in '..\..\source\windows\sevenzip.pas' , - Snmp in '..\..\source\windows\Snmp.pas' + Snmp in '..\..\source\windows\Snmp.pas' , + JclCppException in '..\..\source\windows\JclCppException.pas' ; end. Modified: trunk/jcl/packages/d11/Jcl.dpk =================================================================== --- trunk/jcl/packages/d11/Jcl.dpk 2011-05-27 19:52:47 UTC (rev 3520) +++ trunk/jcl/packages/d11/Jcl.dpk 2011-05-27 20:02:04 UTC (rev 3521) @@ -4,7 +4,7 @@ DO NOT EDIT THIS FILE, IT IS GENERATED BY THE PACKAGE GENERATOR ALWAYS EDIT THE RELATED XML FILE (Jcl-R.xml) - Last generated: 07-05-2010 18:46:59 UTC + Last generated: 27-05-2011 01:09:16 UTC ----------------------------------------------------------------------------- } @@ -122,7 +122,8 @@ mscorlib_TLB in '..\..\source\windows\mscorlib_TLB.pas' , MSTask in '..\..\source\windows\MSTask.pas' , sevenzip in '..\..\source\windows\sevenzip.pas' , - Snmp in '..\..\source\windows\Snmp.pas' + Snmp in '..\..\source\windows\Snmp.pas' , + JclCppException in '..\..\source\windows\JclCppException.pas' ; end. Modified: trunk/jcl/packages/d11/Jcl.dproj =================================================================== --- trunk/jcl/packages/d11/Jcl.dproj 2011-05-27 19:52:47 UTC (rev 3520) +++ trunk/jcl/packages/d11/Jcl.dproj 2011-05-27 20:02:04 UTC (rev 3521) @@ -162,5 +162,6 @@ <DCCReference Include="..\..\source\windows\MSTask.pas"/> <DCCReference Include="..\..\source\windows\sevenzip.pas"/> <DCCReference Include="..\..\source\windows\Snmp.pas"/> + <DCCReference Include="..\..\source\windows\JclCppException.pas"/> </ItemGroup> </Project> Modified: trunk/jcl/packages/d12/Jcl.dpk =================================================================== --- trunk/jcl/packages/d12/Jcl.dpk 2011-05-27 19:52:47 UTC (rev 3520) +++ trunk/jcl/packages/d12/Jcl.dpk 2011-05-27 20:02:04 UTC (rev 3521) @@ -4,7 +4,7 @@ DO NOT EDIT THIS FILE, IT IS GENERATED BY THE PACKAGE GENERATOR ALWAYS EDIT THE RELATED XML FILE (Jcl-R.xml) - Last generated: 07-05-2010 18:46:59 UTC + Last generated: 27-05-2011 01:09:16 UTC ----------------------------------------------------------------------------- } @@ -121,7 +121,8 @@ mscorlib_TLB in '..\..\source\windows\mscorlib_TLB.pas' , MSTask in '..\..\source\windows\MSTask.pas' , sevenzip in '..\..\source\windows\sevenzip.pas' , - Snmp in '..\..\source\windows\Snmp.pas' + Snmp in '..\..\source\windows\Snmp.pas' , + JclCppException in '..\..\source\windows\JclCppException.pas' ; end. Modified: trunk/jcl/packages/d12/Jcl.dproj =================================================================== --- trunk/jcl/packages/d12/Jcl.dproj 2011-05-27 19:52:47 UTC (rev 3520) +++ trunk/jcl/packages/d12/Jcl.dproj 2011-05-27 20:02:04 UTC (rev 3521) @@ -137,6 +137,7 @@ <DCCReference Include="..\..\source\windows\MSTask.pas"/> <DCCReference Include="..\..\source\windows\sevenzip.pas"/> <DCCReference Include="..\..\source\windows\Snmp.pas"/> + <DCCReference Include="..\..\source\windows\JclCppException.pas"/> <BuildConfiguration Include="Base"> <Key>Base</Key> </BuildConfiguration> Modified: trunk/jcl/packages/d14/Jcl.dpk =================================================================== --- trunk/jcl/packages/d14/Jcl.dpk 2011-05-27 19:52:47 UTC (rev 3520) +++ trunk/jcl/packages/d14/Jcl.dpk 2011-05-27 20:02:04 UTC (rev 3521) @@ -4,7 +4,7 @@ DO NOT EDIT THIS FILE, IT IS GENERATED BY THE PACKAGE GENERATOR ALWAYS EDIT THE RELATED XML FILE (Jcl-R.xml) - Last generated: 07-05-2010 18:46:59 UTC + Last generated: 27-05-2011 01:09:18 UTC ----------------------------------------------------------------------------- } @@ -121,7 +121,8 @@ mscorlib_TLB in '..\..\source\windows\mscorlib_TLB.pas' , MSTask in '..\..\source\windows\MSTask.pas' , sevenzip in '..\..\source\windows\sevenzip.pas' , - Snmp in '..\..\source\windows\Snmp.pas' + Snmp in '..\..\source\windows\Snmp.pas' , + JclCppException in '..\..\source\windows\JclCppException.pas' ; end. Modified: trunk/jcl/packages/d14/Jcl.dproj =================================================================== --- trunk/jcl/packages/d14/Jcl.dproj 2011-05-27 19:52:47 UTC (rev 3520) +++ trunk/jcl/packages/d14/Jcl.dproj 2011-05-27 20:02:04 UTC (rev 3521) @@ -139,6 +139,7 @@ <DCCReference Include="..\..\source\windows\MSTask.pas"/> <DCCReference Include="..\..\source\windows\sevenzip.pas"/> <DCCReference Include="..\..\source\windows\Snmp.pas"/> + <DCCReference Include="..\..\source\windows\JclCppException.pas"/> <BuildConfiguration Include="Base"> <Key>Base</Key> </BuildConfiguration> Modified: trunk/jcl/packages/d15/Jcl.dpk =================================================================== --- trunk/jcl/packages/d15/Jcl.dpk 2011-05-27 19:52:47 UTC (rev 3520) +++ trunk/jcl/packages/d15/Jcl.dpk 2011-05-27 20:02:04 UTC (rev 3521) @@ -4,7 +4,7 @@ DO NOT EDIT THIS FILE, IT IS GENERATED BY THE PACKAGE GENERATOR ALWAYS EDIT THE RELATED XML FILE (Jcl-R.xml) - Last generated: 01-08-2010 21:03:32 UTC + Last generated: 27-05-2011 01:09:19 UTC ----------------------------------------------------------------------------- } @@ -120,7 +120,8 @@ mscorlib_TLB in '..\..\source\windows\mscorlib_TLB.pas' , MSTask in '..\..\source\windows\MSTask.pas' , sevenzip in '..\..\source\windows\sevenzip.pas' , - Snmp in '..\..\source\windows\Snmp.pas' + Snmp in '..\..\source\windows\Snmp.pas' , + JclCppException in '..\..\source\windows\JclCppException.pas' ; end. Modified: trunk/jcl/packages/d15/Jcl.dproj =================================================================== --- trunk/jcl/packages/d15/Jcl.dproj 2011-05-27 19:52:47 UTC (rev 3520) +++ trunk/jcl/packages/d15/Jcl.dproj 2011-05-27 20:02:04 UTC (rev 3521) @@ -146,6 +146,7 @@ <DCCReference Include="..\..\source\windows\MSTask.pas"/> <DCCReference Include="..\..\source\windows\sevenzip.pas"/> <DCCReference Include="..\..\source\windows\Snmp.pas"/> + <DCCReference Include="..\..\source\windows\JclCppException.pas"/> <BuildConfiguration Include="Release"> <Key>Cfg_Release</Key> <CfgParent>Base</CfgParent> Modified: trunk/jcl/packages/d6/Jcl.dpk =================================================================== --- trunk/jcl/packages/d6/Jcl.dpk 2011-05-27 19:52:47 UTC (rev 3520) +++ trunk/jcl/packages/d6/Jcl.dpk 2011-05-27 20:02:04 UTC (rev 3521) @@ -4,7 +4,7 @@ DO NOT EDIT THIS FILE, IT IS GENERATED BY THE PACKAGE GENERATOR ALWAYS EDIT THE RELATED XML FILE (Jcl-R.xml) - Last generated: 07-05-2010 18:46:59 UTC + Last generated: 27-05-2011 01:09:13 UTC ----------------------------------------------------------------------------- } @@ -120,7 +120,8 @@ mscorlib_TLB in '..\..\source\windows\mscorlib_TLB.pas' , MSTask in '..\..\source\windows\MSTask.pas' , sevenzip in '..\..\source\windows\sevenzip.pas' , - Snmp in '..\..\source\windows\Snmp.pas' + Snmp in '..\..\source\windows\Snmp.pas' , + JclCppException in '..\..\source\windows\JclCppException.pas' ; end. Modified: trunk/jcl/packages/d7/Jcl.dpk =================================================================== --- trunk/jcl/packages/d7/Jcl.dpk 2011-05-27 19:52:47 UTC (rev 3520) +++ trunk/jcl/packages/d7/Jcl.dpk 2011-05-27 20:02:04 UTC (rev 3521) @@ -4,7 +4,7 @@ DO NOT EDIT THIS FILE, IT IS GENERATED BY THE PACKAGE GENERATOR ALWAYS EDIT THE RELATED XML FILE (Jcl-R.xml) - Last generated: 07-05-2010 18:46:59 UTC + Last generated: 27-05-2011 01:09:13 UTC ----------------------------------------------------------------------------- } @@ -120,7 +120,8 @@ mscorlib_TLB in '..\..\source\windows\mscorlib_TLB.pas' , MSTask in '..\..\source\windows\MSTask.pas' , sevenzip in '..\..\source\windows\sevenzip.pas' , - Snmp in '..\..\source\windows\Snmp.pas' + Snmp in '..\..\source\windows\Snmp.pas' , + JclCppException in '..\..\source\windows\JclCppException.pas' ; end. Modified: trunk/jcl/packages/d9/Jcl.dpk =================================================================== --- trunk/jcl/packages/d9/Jcl.dpk 2011-05-27 19:52:47 UTC (rev 3520) +++ trunk/jcl/packages/d9/Jcl.dpk 2011-05-27 20:02:04 UTC (rev 3521) @@ -4,7 +4,7 @@ DO NOT EDIT THIS FILE, IT IS GENERATED BY THE PACKAGE GENERATOR ALWAYS EDIT THE RELATED XML FILE (Jcl-R.xml) - Last generated: 07-05-2010 18:46:59 UTC + Last generated: 27-05-2011 01:09:14 UTC ----------------------------------------------------------------------------- } @@ -120,7 +120,8 @@ mscorlib_TLB in '..\..\source\windows\mscorlib_TLB.pas' , MSTask in '..\..\source\windows\MSTask.pas' , sevenzip in '..\..\source\windows\sevenzip.pas' , - Snmp in '..\..\source\windows\Snmp.pas' + Snmp in '..\..\source\windows\Snmp.pas' , + JclCppException in '..\..\source\windows\JclCppException.pas' ; end. Modified: trunk/jcl/packages/fpc/Jcl.lpk =================================================================== --- trunk/jcl/packages/fpc/Jcl.lpk 2011-05-27 19:52:47 UTC (rev 3520) +++ trunk/jcl/packages/fpc/Jcl.lpk 2011-05-27 20:02:04 UTC (rev 3521) @@ -39,7 +39,7 @@ <Description Value="JEDI Code Library RTL package"/> <License Value="Copyright (C) 1999, 2011 Project JEDI"/> <Version Major="2" Minor="3" Release="0" Build="3847"/> - <Files Count="75"> + <Files Count="76"> <Item1> <Filename Value="..\..\source\common\bzip2.pas"/> <UnitName Value="bzip2"/> @@ -340,6 +340,10 @@ <Filename Value="..\..\source\windows\Snmp.pas"/> <UnitName Value="Snmp"/> </Item75> + <Item76> + <Filename Value="..\..\source\windows\JclCppException.pas"/> + <UnitName Value="JclCppException"/> + </Item76> </Files> <RequiredPkgs Count="1"> <Item1> Modified: trunk/jcl/packages/fpc/Jcl.pas =================================================================== --- trunk/jcl/packages/fpc/Jcl.pas 2011-05-27 19:52:47 UTC (rev 3520) +++ trunk/jcl/packages/fpc/Jcl.pas 2011-05-27 20:02:04 UTC (rev 3521) @@ -3,7 +3,7 @@ DO NOT EDIT THIS FILE, IT IS GENERATED BY THE PACKAGE GENERATOR ALWAYS EDIT THE RELATED XML FILE (Jcl-R.xml) - Last generated: 08-01-2011 18:17:57 UTC + Last generated: 27-05-2011 01:09:11 UTC ----------------------------------------------------------------------------- } @@ -86,7 +86,8 @@ mscorlib_TLB, MSTask, sevenzip, - Snmp + Snmp, + JclCppException ; implementation Modified: trunk/jcl/packages/help/Jcl.dox =================================================================== --- trunk/jcl/packages/help/Jcl.dox 2011-05-27 19:52:47 UTC (rev 3520) +++ trunk/jcl/packages/help/Jcl.dox 2011-05-27 20:02:04 UTC (rev 3521) @@ -1,4 +1,4 @@ -; This is a Doc-O-Matic version 6.5.1.1382 project file. +; This is a Doc-O-Matic version 6.5.1.1382 project file. ; This file is maintained by Doc-O-Matic, do not edit manually. [*Control*] @@ -30,7 +30,7 @@ File1=..\..\..\help\JEDI.doxdb [Source Files] -Count=151 +Count=152 File0=..\..\source\include\crossplatform.inc File1=..\..\source\include\jcl.inc File2=..\..\source\include\jclc6.inc @@ -182,6 +182,7 @@ File148=..\..\..\help\UnitConv.dtx File149=..\..\..\help\WideStrings.dtx File150=..\..\..\help\Win32.dtx +File151=..\..\source\windows\JclCppException.pas [General] Copyright=Copyright (C) 1999, 2011 Project JEDI Modified: trunk/jcl/packages/xml/Jcl-R.xml =================================================================== --- trunk/jcl/packages/xml/Jcl-R.xml 2011-05-27 19:52:47 UTC (rev 3520) +++ trunk/jcl/packages/xml/Jcl-R.xml 2011-05-27 20:02:04 UTC (rev 3521) @@ -1,11 +1,16 @@ -<?xml version="1.0" encoding="iso-8859-1"?> +<?xml version="1.0" encoding="iso-8859-1" standalone="no"?> <Package Name="Jcl" Design="0"> <Description>JEDI Code Library RTL package</Description> <GUID>{44DB645B-C167-410D-9334-38AF9F0C7913}</GUID> - <C6PFlags/> - <C6Libs/> - <CompilerDefines>RELEASE</CompilerDefines> - <ImageBase>48000000</ImageBase> + <Properties> + <Property Name="C6PFlags" Value=""/> + <Property Name="C6Libs" Value=""/> + <Property Name="CompilerDefines" Value="RELEASE"/> + <Property Name="ImageBase" Value="48000000"/> + <Property Name="VersionMajorNumber" Value=""/> + <Property Name="VersionMinorNumber" Value=""/> + <Property Name="ReleaseNumber" Value=""/> + </Properties> <Requires> <Package Name="rtl" Targets="Delphi,Bcb,Bds" Condition=""/> <Package Name="FCL" Targets="fpc" Condition=""/> @@ -165,5 +170,6 @@ <File Name="..\..\..\help\UnitConv.dtx" Targets="help" Formname="" Condition=""/> <File Name="..\..\..\help\WideStrings.dtx" Targets="help" Formname="" Condition=""/> <File Name="..\..\..\help\Win32.dtx" Targets="help" Formname="" Condition=""/> + <File Name="..\..\source\windows\JclCppException.pas" Targets="Windows" Formname="" Condition=""/> </Contains> </Package> Modified: trunk/jcl/source/common/JclResources.pas =================================================================== --- trunk/jcl/source/common/JclResources.pas 2011-05-27 19:52:47 UTC (rev 3520) +++ trunk/jcl/source/common/JclResources.pas 2011-05-27 20:02:04 UTC (rev 3521) @@ -1152,6 +1152,10 @@ resourcestring RsUnknownFunctionAt = 'Unknown function at %s'; +//=== JclCppException ======================================================== +resourcestring + RsCppUnhandledExceptionMsg = 'Unhandled C++ exception of type ''%s'' occurred'; + //=== JclDotNet ============================================================== resourcestring RsEUnknownCLRVersion = '"%s" is not a known CLR version'; Added: trunk/jcl/source/windows/JclCppException.pas =================================================================== --- trunk/jcl/source/windows/JclCppException.pas (rev 0) +++ trunk/jcl/source/windows/JclCppException.pas 2011-05-27 20:02:04 UTC (rev 3521) @@ -0,0 +1,631 @@ +{**************************************************************************************************} +{ } +{ 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 SystemCppException.pas. } +{ } +{ The Initial Developer of the Original Code is Moritz Beutel. Portions created by Moritz Beutel } +{ are Copyright (C) Moritz Beutel. All Rights Reserved. } +{ } +{ Contributor(s): } +{ Moritz Beutel } +{ } +{**************************************************************************************************} +{ } +{ Routines to enable the Delphi RTL to catch, dispatch and clean up C++ exceptions and to handle } +{ exceptions derived from std::exception. } +{ } +{**************************************************************************************************} +{ } +{ Last modified: $Date:: $ } +{ Revision: $Rev:: $ } +{ Author: $Author:: $ } +{ } +{**************************************************************************************************} + +unit JclCppException; + +interface + +{$I jcl.inc} +{$I windowsonly.inc} + +uses + {$IFDEF UNITVERSIONING} + JclUnitVersioning, + {$ENDIF UNITVERSIONING} + SysUtils; + +type + PJclCppStdException = type Pointer; { mapped to std::exception* via $HPPEMIT } + {$EXTERNALSYM PJclCppStdException} + + { C++ exception of any type } + EJclCppException = class(Exception) + {$IFDEF COMPILER15_UP} + private type + TInaccessibleType = class end; + TPointerType<T> = record + type TPointer = ^T; + end; + {$ENDIF COMPILER15_UP} + private + FTypeName: AnsiString; + FExcDesc: Pointer; + + constructor CreateTypeNamed(ATypeName: PAnsiChar; ExcDesc: Pointer); overload; + function GetCppExceptionObject: Pointer; + function GetThrowLine: Integer; + function GetThrowFile: AnsiString; + public + property CppExceptionObject: Pointer read GetCppExceptionObject; + property ThrowLine: Integer read GetThrowLine; + property ThrowFile: AnsiString read GetThrowFile; + property TypeName: AnsiString read FTypeName; + + function IsCppClass: Boolean; overload; + function AsCppClass(CppClassName: AnsiString): Pointer; overload; + + {$IFDEF COMPILER15_UP} + { These are only accessible from C++ } + function IsCppClass<TCppClass: TInaccessibleType>: Boolean; overload; + function AsCppClass<TCppClass: TInaccessibleType>: TPointerType<TCppClass>.TPointer; overload; + {$ENDIF COMPILER15_UP} + + destructor Destroy; override; + end; + + { C++ exception derived from std::exception } + EJclCppStdException = class(EJclCppException) + private + FExcObj: PJclCppStdException; + + constructor Create(AExcObj: PJclCppStdException; Msg: String; + ATypeName: PAnsiChar; ExcDesc: Pointer); overload; + function GetStdException: PJclCppStdException; + public + { This property returns a pointer to the wrapped exception. } + property StdException: PJclCppStdException read GetStdException; + end; + + (*$HPPEMIT '#include <typeinfo>'*) + (*$HPPEMIT '#include <exception>'*) + (*$HPPEMIT ''*) + (*$HPPEMIT 'namespace Jclcppexception'*) + (*$HPPEMIT '{'*) + (*$HPPEMIT ''*) + (*$HPPEMIT 'typedef std::exception* PJclCppStdException;'*) + (*$HPPEMIT ''*) + (*$HPPEMIT '} /* namespace Jclcppexception */'*) + + {$IFDEF COMPILER15_UP} + (*$HPPEMIT END 'namespace Jclcppexception'*) + (*$HPPEMIT END '{'*) + (*$HPPEMIT END ''*) + (*$HPPEMIT END 'template <typename TCppClass>'*) + (*$HPPEMIT END ' bool __fastcall EJclCppException::IsCppClass<TCppClass>(void)'*) + (*$HPPEMIT END '{'*) + (*$HPPEMIT END ' return IsCppClass() && AsCppClass(typeid(TCppClass).name()) != 0;'*) + (*$HPPEMIT END '}'*) + (*$HPPEMIT END 'template <typename TCppClass>'*) + (*$HPPEMIT END ' EJclCppException::TPointerType__1<TCppClass>::TPointer __fastcall EJclCppException::AsCppClass<TCppClass>(void)'*) + (*$HPPEMIT END '{'*) + (*$HPPEMIT END ' return static_cast<typename EJclCppException::TPointerType__1<TCppClass>::TPointer>(AsCppClass(typeid(TCppClass).name()));'*) + (*$HPPEMIT END '}'*) + (*$HPPEMIT END ''*) + (*$HPPEMIT END '} /* namespace Jclcppexception */'*) + {$ENDIF COMPILER15_UP} + + +type + TJclCppExceptionFlags = set of (cefPrependCppClassName); + +var + JclCppExceptionFlags: TJclCppExceptionFlags = [cefPrependCppClassName]; + +procedure JclInstallCppExceptionFilter; +procedure JclUninstallCppExceptionFilter; +function JclCppExceptionFilterInstalled: Boolean; + + +{$IFDEF UNITVERSIONING} +const + UnitVersioning: TUnitVersionInfo = ( + RCSfile: '$URL: $'; + Revision: '$Revision: $'; + Date: '$Date: $'; + LogPath: 'JCL\source\windows'; + Extra: ''; + Data: nil + ); +{$ENDIF UNITVERSIONING} + +implementation + +uses + JclResources, JclHookExcept; + + +type + TExceptObjProc = function(P: PExceptionRecord): Exception; + + PCppTypeId = ^TCppTypeId; + + TCppBaseList = packed record { Delphi equivalent of struct baseList in xx.h } + blType : PCppTypeId; // type of this base + blOffs : Cardinal; // offset of this base + blFlags : Cardinal; // flags + end; + + TCppTypeId = packed record { incomplete Delphi equivalent of struct tpid in xx.h } + tpSize : Cardinal; // size of type in bytes + tpMask : Word; // attribute bits + tpName : Word; // offset of start of the zero terminated name + // where offset is relative from tpid base + + tpcVptrOffs : Cardinal; // offset of vtable pointer + tpcFlags : Cardinal; // more flags + + { Only valid if (tpMask & TM_IS_CLASS) } + tpcBaseList : Word; // offset of non-virt base list, + // where offset is relative from tpid base + tpcVbasList : Word; // offset of virtual base list + // where offset is relative from tpid base + + tpcDlOpAddr : Pointer; // operator delete addr + tpcDlOpMask : Word; // operator delete convention + + tpcDaOpMask : Word; // operator delete[] convention + tpcDaOpAddr : Pointer; // operator delete[] addr + + { Only valid if (tpcFlags & CF_HAS_DTOR), implies also (tpMask & TM_IS_CLASS) } + tpcDtorCount : Cardinal; // dtor count - total + tpcNVdtCount : Cardinal; // dtor count - non-virtual + + tpcDtorAddr : Pointer; // destructor addr + tpcDtorMask : Word; // destructor convention + + tpcDtMembers : Word; // offset of list of destructible members + // where offset is relative from tpid base + + { ... } + + { Following is the zero terminated name, padded with zero's to + the next dword boundary. + + Optionally (if tpMask & TM_IS_CLASS), we have next: + - non-virtual base list, terminated by a null pointer + - virtual base list, terminated by a null pointer + + Optionally (if tpcFlags & CF_HAS_DTOR), we have next: + - list of destructible members, terminated by a null pointer } + end; + +const + + { Flags for TCppTypeId.tpMask } + TM_IS_STRUCT = $0001; + TM_IS_CLASS = $0002; + TM_IS_PTR = $0010; + TM_IS_REF = $0020; + TM_IS_VOIDPTR = $0040; + TM_LOCALTYPE = $0080; + TM_IS_CONST = $0100; + TM_IS_VOLATILE = $0200; + TM_IS_ARRAY = $0400; + + { Flags for TCppTypeId.tpcFlags } + CF_HAS_CTOR = $00000001; + CF_HAS_DTOR = $00000002; + CF_HAS_BASES = $00000004; + CF_HAS_VBASES = $00000008; + CF_HAS_VTABPTR = $00000010; + CF_HAS_VIRTDT = $00000020; + CF_HAS_RTTI = $00000040; + CF_DELPHICLASS = $00000080; + CF_HAS_FARVPTR = $00001000; + CF_HAS_GUID = $00002000; + + { Flags for TCppExceptDesc.xdFlags } + XDF_ISDELPHIEXCEPTION = $00000004; + XDF_RETHROWN = $00000008; + +type + PCppExceptDesc = ^TCppExceptDesc; + TCppFreeMemFP = procedure(P: PCppExceptDesc); cdecl; + + TCppExceptDesc = packed record { Delphi equivalent of struct _exceptDesc in xx.h } + xdPrevious : Pointer; // previous exception or 0 + + xdTypeID : PCppTypeId; // addr of type-id for thrown type + xdFriendList : PCppTypeId; // friend list supplied to _ThrowExcept + xdFlags : Cardinal; // flags passed to _ThrowExcept + xdSize : Cardinal; // size of thrown value + xdBase : PCppTypeId; // type-id of base type + xdMask : Word; // type-id mask + xdCflg : Word; // type-id class flags (or 0) + + xdFreeFunc : TCppFreeMemFP; // function to free memory + + xdCCaddr : Pointer; // copy-ctor addr + xdCCmask : Cardinal; // copy-ctor mask + + xdERRaddr : Pointer; // address of matching ERR (when found) + xdHtabAdr : Pointer; // address of matching handler + + xdContext : Cardinal; // context of 'catch' block + + xdThrowLine : Cardinal; // source line no. of throw statement + xdThrowFile : PAnsiChar; // source file name of throw statement + + xdArgType : PCppTypeId; // address of arg type descriptor + xdArgAddr : Pointer; // address of arg copy on stack + xdArgBuff : AnsiChar; // arg stored in buffer + xdArgCopy : AnsiChar; // arg copied to catch arg + + xdOSESP : LongWord; // esp of main OS exception handler + xdOSERR : LongWord; // addr of the OS ERR on entry to _ExceptionHandler + xdOSContext : {PContext} Pointer; // CPU Context for an OS exception + xdValue : array[0..0] of AnsiChar; // copy of thrown value + end; + + PCppBaseList = ^TCppBaseList; + +{ pre-Tiburon workaround } +{$IFNDEF COMPILER12_UP} + PByte = PAnsiChar; +{$ENDIF ~COMPILER12_UP} + + +procedure ExceptionHandled(ExcDesc: PCppExceptDesc); forward; +function CppGetBase(var Obj: Pointer; TypeDesc: PCppTypeId; + BaseName: PAnsiChar): Boolean; forward; + +{$IFDEF COMPILER15_UP} +function EJclCppException.AsCppClass<TCppClass>: TPointerType<TCppClass>.TPointer; +begin + Assert (False); +end; +function EJclCppException.IsCppClass<TCppClass>: Boolean; +begin + Assert (False); +end; +{$ENDIF COMPILER15_UP} + +constructor EJclCppException.CreateTypeNamed(ATypeName: PAnsiChar; ExcDesc: Pointer); +begin + inherited CreateFmt(RsCppUnhandledExceptionMsg, [ATypeName]); + FTypeName := ATypeName; + FExcDesc := ExcDesc; +end; + +constructor EJclCppStdException.Create(AExcObj: PJclCppStdException; Msg: String; + ATypeName: PAnsiChar; ExcDesc: Pointer); +begin + if cefPrependCppClassName in JclCppExceptionFlags then + inherited CreateFmt('[%s] %s', [ATypeName, Msg]) + else + inherited Create(Msg); + FExcObj := AExcObj; + FTypeName := ATypeName; + FExcDesc := ExcDesc; +end; + +function EJclCppException.IsCppClass: Boolean; +var + ExcDesc: PCppExceptDesc; +begin + ExcDesc := PCppExceptDesc(FExcDesc); + Result := (ExcDesc.xdTypeID.tpMask and TM_IS_CLASS) <> 0; +end; + +function EJclCppException.GetCppExceptionObject: Pointer; +var + ExcDesc: PCppExceptDesc; +begin + ExcDesc := PCppExceptDesc(FExcDesc); + Result := @ExcDesc.xdValue; +end; + +function EJclCppException.GetThrowFile: AnsiString; +var + ExcDesc: PCppExceptDesc; +begin + ExcDesc := PCppExceptDesc(FExcDesc); + if ExcDesc.xdThrowFile <> nil then + Result := ExcDesc.xdThrowFile + else + Result := ''; +end; + +function EJclCppException.GetThrowLine: Integer; +var + ExcDesc: PCppExceptDesc; +begin + ExcDesc := PCppExceptDesc(FExcDesc); + Result := ExcDesc.xdThrowLine; +end; + +function EJclCppException.AsCppClass(CppClassName: AnsiString): Pointer; +var + ExcDesc: PCppExceptDesc; + Obj: Pointer; +begin + ExcDesc := PCppExceptDesc(FExcDesc); + Obj := @ExcDesc.xdValue; + if CppGetBase(Obj, ExcDesc.xdTypeID, PAnsiChar (CppClassName)) then + Result := Obj + else + Result := nil; +end; + +destructor EJclCppException.Destroy; +var + ExcDesc: PCppExceptDesc; +begin + ExcDesc := PCppExceptDesc(FExcDesc); + + { call the exception object's destructor and free the memory as it + is done in _CatchCleanup() in xx.cpp. } + ExceptionHandled(ExcDesc); + + { Free the memory taken up by the exception descriptor } + ExcDesc.xdFreeFunc(ExcDesc); +end; + + +function EJclCppStdException.GetStdException: PJclCppStdException; +begin + Result := FExcObj; +end; + +{ This function should basically work like destThrownValue()/callDestructor() + in xx.cpp } +procedure DestroyThrownValue (Obj: Pointer; ObjType: PCppTypeId); +type + TCdeclDestructor = procedure(Obj: Pointer; Flags: Integer); cdecl; + TPascalDestructor = procedure(Flags: Integer; Obj: Pointer); pascal; + TFastcallDestructor = procedure(Obj: Pointer; Flags: Integer); + TStdcallDestructor = procedure(Obj: Pointer; Flags: Integer); stdcall; +var + Flags: Integer; + CdeclDestructor: TCdeclDestructor; + PascalDestructor: TPascalDestructor; + FastcallDestructor: TFastcallDestructor; + StdcallDestructor: TStdcallDestructor; +begin + // callDestructor(objAddr, objType, 0, dtorAddr, dtorMask, 1); + Flags := 2; + + Assert((ObjType.tpcDtorMask and $0080) = 0, 'fastthis (-po) not supported'); + + case ObjType.tpcDtorMask and $0007 of + 1: // __cdecl + begin + CdeclDestructor := TCdeclDestructor(ObjType.tpcDtorAddr); + CdeclDestructor(Obj, Flags); + end; + 2: // __pascal + begin + PascalDestructor := TPascalDestructor(ObjType.tpcDtorAddr); + PascalDestructor(Flags, Obj); + end; + 3: // __fastcall + begin + FastcallDestructor := TFastcallDestructor(ObjType.tpcDtorAddr); + FastcallDestructor(Obj, Flags); + end; + 5: // __stdcall + begin + StdcallDestructor := TStdcallDestructor(ObjType.tpcDtorAddr); + StdcallDestructor(Obj, Flags); + end; + else + Assert(False, 'Unsupported calling convention!'); + end; +end; + +{ This function should basically work like exceptionHandled() in xx.cpp } +procedure ExceptionHandled(ExcDesc: PCppExceptDesc); +var + TypeDesc: PCppTypeId; + Obj: Pointer; +begin + { Is the thrown value still present in the descriptor? } + if Ord(ExcDesc.xdArgBuff) <> 0 then + begin + + { Destroy the thrown value if necessary } + if (ExcDesc.xdCflg and CF_HAS_DTOR) <> 0 then + begin + TypeDesc := ExcDesc.xdBase; + Obj := Pointer(@ExcDesc.xdValue); + + { All delphi class objects are thrown by pointer, sort of. + However, we should not meet a Delphi class here! } + if (TypeDesc.tpcFlags and CF_DELPHICLASS) <> 0 then + Obj := Pointer((PCardinal (Obj))^); { dereference } + + { We can't do anything about the _DestructorCount variable here, but + this is a legacy feature anyway. } + + { Don't destroy it if it's a delphi class and it's being rethrown. } + if (ExcDesc.xdFlags and (XDF_ISDELPHIEXCEPTION or XDF_RETHROWN)) + <> (XDF_ISDELPHIEXCEPTION or XDF_RETHROWN) then + DestroyThrownValue(Obj, TypeDesc); + end; + + { Mark the fact that the arg is gone } + ExcDesc.xdArgBuff := AnsiChar(0); + end; + + { Did we make a copy of the argument? } + if Ord (ExcDesc.xdArgCopy) <> 0 then + begin + TypeDesc := ExcDesc.xdArgType; + + { Destroy the thrown value if necessary } + if ((TypeDesc.tpMask and TM_IS_CLASS) <> 0) + and ((TypeDesc.tpcFlags and CF_HAS_DTOR) <> 0) then + DestroyThrownValue(ExcDesc.xdArgAddr, TypeDesc); + + { Mark the fact that the arg is gone } + ExcDesc.xdArgCopy := AnsiChar(0); + end; +end; + +{ It is not easy to get the C++ type description for std::exception, + therefore we identify the base class by name. + + This function should basically work like locateBaseClass() in xxtype.cpp } +function LocateCppBaseClass(BaseList: PCppBaseList; VBase: Boolean; + BaseName: PAnsiChar; var Addr: Pointer) : Boolean; +var + Ptr: Pointer; + BaseBaseList: PCppBaseList; + BaseType: PCppTypeId; +begin + { Check for end of base list } + Result := False; + while BaseList.blType <> nil do + begin + BaseType := BaseList.blType; + + Ptr := Pointer(PByte(Addr) + BaseList.blOffs); + Inc(BaseList); + + if VBase then + Ptr := Pointer((PCardinal(Ptr))^); { dereference } + + { Is this the right base class? } + if StrComp(PAnsiChar(PByte(BaseType) + BaseType.tpName), BaseName) = 0 then + begin + Addr := Ptr; { Match --> return the adjusted pointer to the caller } + Result := True; + Exit; + end; + + { Does this base class have any base classes? } + { Annotation: Would BaseType.tpcFlags & CF_HAS_BASES be a better match for this? } + if (BaseType.tpMask and TM_IS_CLASS) = 0 then + Continue; + + { Get the list of non-virtual bases for this base class } + BaseBaseList := PCppBaseList(PByte (BaseType) + BaseType.tpcBaseList); + + { Give up on this base if it has no non-virtual bases (Ann.: why?) } + if BaseBaseList = nil then + Continue; + + { Search the base classes of this base recursively } + if LocateCppBaseClass(BaseBaseList, False, BaseName, Ptr) then + begin + Addr := Ptr; { Match --> return the adjusted pointer to the caller } + Result := True; + Exit; + end; + end; +end; + +function CppGetBase(var Obj: Pointer; TypeDesc: PCppTypeId; + BaseName: PAnsiChar): Boolean; +var + BaseList, VBaseList: PCppBaseList; +begin + if StrComp(PAnsiChar(PByte(TypeDesc) + TypeDesc.tpName), BaseName) = 0 then + { a class can be considered its own base } + Result := True + else if (TypeDesc.tpMask and TM_IS_CLASS) <> 0 then + begin + { iterate through the base classes } + BaseList := PCppBaseList(PByte(TypeDesc) + TypeDesc.tpcBaseList); + VBaseList := PCppBaseList(PByte(TypeDesc) + TypeDesc.tpcVbasList); + Result := LocateCppBaseClass(BaseList, False, BaseName, Obj) + or LocateCppBaseClass(VBaseList, False, BaseName, Obj); + end + else + Result := False; { Don't be surprised. C++ permits to throw every type. } +end; + +function CppExceptObjProc(P: PExceptionRecord): Exception; +type + { Function pointer to std::type_info::what(). + In the Dinkumware library, std::exception::what() always has the + __cdecl calling convention. } + TCppTypeInfoWhatMethod = function(This: Pointer): PAnsiChar; cdecl; +var + ExcTypeName: PAnsiChar; + ExcDesc: PCppExceptDesc; + ExcObject: Pointer; + ExcObjectVTbl: Pointer; + WhatMethod: TCppTypeInfoWhatMethod; +begin + Result := nil; + case P.ExceptionCode of + $0EEFFACE: { C++ exception } + begin + { When a C++ exception is thrown, the C++ compiler (indirectly) calls the + tossAnException function defined in xx.cpp. The Win32 exception argument + table is filled in line 1096ff as follows: + + argTable[0] = (unsigned long)(void __far *)__throwExceptionName; + argTable[1] = (unsigned long)(void __far *)throwPC; + argTable[2] = (unsigned long)(void __far *)xdp; // : PCppExceptDesc } + + ExcTypeName := PAnsiChar(P.ExceptionInformation[0]); + ExcDesc := PCppExceptDesc(P.ExceptionInformation[2]); + ExcObject := Pointer(@ExcDesc.xdValue); + + if CppGetBase(ExcObject, ExcDesc.xdTypeID, 'std::exception') then + begin + { The exception object is a std::exception subclass and implements + the virtual member function what(). } + ExcObjectVTbl := Pointer(PCardinal (ExcObject)^); + WhatMethod := TCppTypeInfoWhatMethod(PCardinal ( + Cardinal (ExcObjectVTbl) + SizeOf (Pointer))^); + Result := EJclCppStdException.Create(ExcObject, String(WhatMethod(ExcObject)), + PAnsiChar(ExcTypeName), Pointer(ExcDesc)); + end + else + { The exception object has some other type. We cannot extract an + exception message with reasonable efforts. } + Result := EJclCppException.CreateTypeNamed(PAnsiChar(ExcTypeName), Pointer (ExcDesc)); + end; + end; +end; + +var + HookInstalled: Boolean = False; + +procedure JclInstallCppExceptionFilter; +begin + Assert(JclHookExcept.JclExceptionsHooked, + 'Cannot install C++ exception filter: call JclHookExcept.JclHookExceptions() first!'); + if HookInstalled then + Exit; + HookInstalled := JclHookExcept.JclAddExceptFilter(@CppExceptObjProc, npFirstChain); +end; + +procedure JclUninstallCppExceptionFilter; +begin + if not HookInstalled then + Exit; + JclHookExcept.JclRemoveExceptFilter(@CppExceptObjProc); + HookInstalled := False; +end; + +function JclCppExceptionFilterInstalled: Boolean; +begin + Result := HookInstalled; +end; + +end. + This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mb...@us...> - 2011-05-27 19:52:53
|
Revision: 3520 http://jcl.svn.sourceforge.net/jcl/?rev=3520&view=rev Author: mbeutel Date: 2011-05-27 19:52:47 +0000 (Fri, 27 May 2011) Log Message: ----------- Added exception filtering facility which allows to intercept the creation of wrapper objects for unhandled exceptions. Modified Paths: -------------- trunk/jcl/source/windows/JclHookExcept.pas Modified: trunk/jcl/source/windows/JclHookExcept.pas =================================================================== --- trunk/jcl/source/windows/JclHookExcept.pas 2011-05-11 20:47:24 UTC (rev 3519) +++ trunk/jcl/source/windows/JclHookExcept.pas 2011-05-27 19:52:47 UTC (rev 3520) @@ -47,16 +47,25 @@ type // Exception hooking notifiers routines +{$IFDEF BORLAND} + TJclExceptFilterProc = function(ExceptRecord: PExceptionRecord): Exception; +{$ENDIF BORLAND} TJclExceptNotifyProc = procedure(ExceptObj: TObject; ExceptAddr: Pointer; OSException: Boolean); TJclExceptNotifyProcEx = procedure(ExceptObj: TObject; ExceptAddr: Pointer; OSException: Boolean; StackPointer: Pointer); TJclExceptNotifyMethod = procedure(ExceptObj: TObject; ExceptAddr: Pointer; OSException: Boolean) of object; TJclExceptNotifyPriority = (npNormal, npFirstChain); +{$IFDEF BORLAND} +function JclAddExceptFilter(const FilterProc: TJclExceptFilterProc; Priority: TJclExceptNotifyPriority = npNormal): Boolean; +{$ENDIF BORLAND} function JclAddExceptNotifier(const NotifyProc: TJclExceptNotifyProc; Priority: TJclExceptNotifyPriority = npNormal): Boolean; overload; function JclAddExceptNotifier(const NotifyProc: TJclExceptNotifyProcEx; Priority: TJclExceptNotifyPriority = npNormal): Boolean; overload; function JclAddExceptNotifier(const NotifyMethod: TJclExceptNotifyMethod; Priority: TJclExceptNotifyPriority = npNormal): Boolean; overload; +{$IFDEF BORLAND} +function JclRemoveExceptFilter(const FilterProc: TJclExceptFilterProc): Boolean; +{$ENDIF BORLAND} function JclRemoveExceptNotifier(const NotifyProc: TJclExceptNotifyProc): Boolean; overload; function JclRemoveExceptNotifier(const NotifyProc: TJclExceptNotifyProcEx): Boolean; overload; function JclRemoveExceptNotifier(const NotifyMethod: TJclExceptNotifyMethod): Boolean; overload; @@ -107,6 +116,18 @@ ExceptObj: Exception; end; +{$IFDEF BORLAND} + TFilterItem = class(TObject) + private + FExceptFilterProc: TJclExceptFilterProc; + FPriority: TJclExceptNotifyPriority; + public + constructor Create(const ExceptFilterProc: TJclExceptFilterProc; APriority: TJclExceptNotifyPriority); + function DoFilterException(ExceptRecord: PExceptionRecord; out ExceptObj: Exception): Boolean; + property Priority: TJclExceptNotifyPriority read FPriority; + end; +{$ENDIF BORLAND} + TNotifierItem = class(TObject) private FNotifyMethod: TJclExceptNotifyMethod; @@ -132,6 +153,9 @@ SysUtils_ExceptProc: TExceptProc; {$ENDIF FPC} Notifiers: TThreadList; + {$IFDEF BORLAND} + Filters: TThreadList; + {$ENDIF BORLAND} {$IFDEF HOOK_DLL_EXCEPTIONS} const @@ -176,20 +200,41 @@ Assert(Result <> nil); end; -procedure FreeNotifiers; +procedure FreeThreadObjList(var TheList: TThreadList); var I: Integer; begin - with Notifiers.LockList do + with TheList.LockList do try for I := 0 to Count - 1 do TObject(Items[I]).Free; finally - Notifiers.UnlockList; + TheList.UnlockList; end; - FreeAndNil(Notifiers); + FreeAndNil(TheList); end; +//=== { TFilterItem } ======================================================== + +{$IFDEF BORLAND} +constructor TFilterItem.Create(const ExceptFilterProc: TJclExceptFilterProc; APriority: TJclExceptNotifyPriority); +begin + FExceptFilterProc := ExceptFilterProc; + FPriority := APriority; +end; + +function TFilterItem.DoFilterException(ExceptRecord: PExceptionRecord; out ExceptObj: Exception): Boolean; +begin + if Assigned(FExceptFilterProc) then + begin + ExceptObj := FExceptFilterProc(ExceptRecord); + Result := ExceptObj <> nil; + end + else + Result := False; +end; +{$ENDIF BORLAND} + //=== { TNotifierItem } ====================================================== constructor TNotifierItem.Create(const NotifyProc: TJclExceptNotifyProc; Priority: TJclExceptNotifyPriority); @@ -238,6 +283,38 @@ {$STACKFRAMES ON} +{$IFDEF BORLAND} +function DoExceptFilter(ExceptRecord: PExceptionRecord): Exception; +var + Priorities: TJclExceptNotifyPriority; + I: Integer; +begin + if Recursive then + Exit; + if Assigned(Filters) then + begin + Recursive := True; + try + with Filters.LockList do + try + for Priorities := High(Priorities) downto Low(Priorities) do + for I := 0 to Count - 1 do + with TFilterItem(Items[I]) do + if Priority = Priorities then + if DoFilterException(ExceptRecord, Result) then + Exit; + finally + Filters.UnlockList; + end; + // Nobody wanted to handle the external exception. Call the default handler. + Result := SysUtils_ExceptObjProc(ExceptRecord); + finally + Recursive := False; + end; + end; +end; +{$ENDIF BORLAND} + procedure DoExceptNotify(ExceptObj: TObject; ExceptAddr: Pointer; OSException: Boolean; StackPointer: Pointer); var Priorities: TJclExceptNotifyPriority; @@ -298,7 +375,7 @@ var NewResultExcCache: Exception; // TLS optimization begin - Result := SysUtils_ExceptObjProc(P); + Result := DoExceptFilter(P); DoExceptNotify(Result, P^.ExceptionAddress, True, GetFramePointer); NewResultExcCache := NewResultExc; if NewResultExcCache <> nil then @@ -333,6 +410,20 @@ (TJclAddr(@JclBelongsHookedCode) > TJclAddr(Address)); end; +{$IFDEF BORLAND} +function JclAddExceptFilter(const FilterProc: TJclExceptFilterProc; Priority: TJclExceptNotifyPriority = npNormal): Boolean; +begin + Result := Assigned(FilterProc); + if Result then + with Filters.LockList do + try + Add(TFilterItem.Create(FilterProc, Priority)); + finally + Filters.UnlockList; + end; +end; +{$ENDIF BORLAND} + function JclAddExceptNotifier(const NotifyProc: TJclExceptNotifyProc; Priority: TJclExceptNotifyPriority): Boolean; begin Result := Assigned(NotifyProc); @@ -369,6 +460,32 @@ end; end; +{$IFDEF BORLAND} +function JclRemoveExceptFilter(const FilterProc: TJclExceptFilterProc): Boolean; +var + O: TFilterItem; + I: Integer; +begin + Result := Assigned(FilterProc); + if Result then + with Filters.LockList do + try + for I := 0 to Count - 1 do + begin + O := TFilterItem(Items[I]); + if @O.FExceptFilterProc = @FilterProc then + begin + O.Free; + Items[I] := nil; + end; + end; + Pack; + finally + Filters.UnlockList; + end; +end; +{$ENDIF BORLAND} + function JclRemoveExceptNotifier(const NotifyProc: TJclExceptNotifyProc): Boolean; var O: TNotifierItem; @@ -667,6 +784,9 @@ initialization Notifiers := TThreadList.Create; + {$IFDEF BORLAND} + Filters := TThreadList.Create; + {$ENDIF BORLAND} {$IFDEF UNITVERSIONING} RegisterUnitVersion(HInstance, UnitVersioning); {$ENDIF UNITVERSIONING} @@ -678,6 +798,9 @@ {$IFDEF HOOK_DLL_EXCEPTIONS} FinalizeLibrariesHookExcept; {$ENDIF HOOK_DLL_EXCEPTIONS} - FreeNotifiers; + FreeThreadObjList(Notifiers); + {$IFDEF BORLAND} + FreeThreadObjList(Filters); + {$ENDIF BORLAND} end. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jfu...@us...> - 2011-05-11 20:47:30
|
Revision: 3519 http://jcl.svn.sourceforge.net/jcl/?rev=3519&view=rev Author: jfudickar Date: 2011-05-11 20:47:24 +0000 (Wed, 11 May 2011) Log Message: ----------- Fixed handling of {$IFNDEF UNICODE_SILENT_FAILURE} inside of all *SetNextBuffer and *SetNextBufferToStream functions Modified Paths: -------------- trunk/jcl/source/common/JclStringConversions.pas Modified: trunk/jcl/source/common/JclStringConversions.pas =================================================================== --- trunk/jcl/source/common/JclStringConversions.pas 2011-04-09 12:54:32 UTC (rev 3518) +++ trunk/jcl/source/common/JclStringConversions.pas 2011-05-11 20:47:24 UTC (rev 3519) @@ -2881,10 +2881,11 @@ begin // add ReplacementCharacter AnsiBuffer := AnsiReplacementCharacter; - {$IFNDEF UNICODE_SILENT_FAILURE} - Result := False; + {$IFDEF UNICODE_SILENT_FAILURE} + Result := True; + {$ELSE} StrPos := -1; - {$ENDIF ~UNICODE_SILENT_FAILURE} + {$ENDIF UNICODE_SILENT_FAILURE} end; AnsiStrLen := Length(AnsiBuffer); Result := Result and ((StrPos + AnsiStrLen) <= (StrLen + 1)); @@ -2928,8 +2929,9 @@ begin // add ReplacementCharacter AnsiBuffer := AnsiReplacementCharacter; - {$IFNDEF UNICODE_SILENT_FAILURE} - Success := False; + {$IFDEF UNICODE_SILENT_FAILURE} + Success := True; + {$ELSE} StrPos := -1; {$ENDIF ~UNICODE_SILENT_FAILURE} end; @@ -2973,12 +2975,13 @@ begin // add ReplacementCharacter AnsiBuffer := AnsiReplacementCharacter; - {$IFNDEF UNICODE_SILENT_FAILURE} - Result := False; - {$ENDIF ~UNICODE_SILENT_FAILURE} + {$IFDEF UNICODE_SILENT_FAILURE} + Result := True; + {$ENDIF UNICODE_SILENT_FAILURE} end; - for I := 1 to Length(AnsiBuffer) do - Result := Result and StreamWriteByte(S, Ord(AnsiBuffer[I])); + if Result then + for I := 1 to Length(AnsiBuffer) do + Result := Result and StreamWriteByte(S, Ord(AnsiBuffer[I])); end; function AnsiSetNextBufferToStream(S: TStream; const Buffer: TUCS4Array; var Start: SizeInt; Count: SizeInt): SizeInt; overload; @@ -3009,13 +3012,14 @@ begin // add ReplacementCharacter AnsiBuffer := AnsiReplacementCharacter; - {$IFNDEF UNICODE_SILENT_FAILURE} - Success := False; - {$ENDIF ~UNICODE_SILENT_FAILURE} + {$IFDEF UNICODE_SILENT_FAILURE} + Success := True; + {$ENDIF UNICODE_SILENT_FAILURE} end; - for I := 1 to Length(AnsiBuffer) do - Success := Success and StreamWriteByte(S, Ord(AnsiBuffer[I])); if Success then + for I := 1 to Length(AnsiBuffer) do + Success := Success and StreamWriteByte(S, Ord(AnsiBuffer[I])); + if Success then begin Inc(Start); Inc(Result); @@ -3045,18 +3049,19 @@ // add ReplacementCharacter AnsiBuffer := AnsiReplacementCharacter; AnsiStrLen := 1; - {$IFNDEF UNICODE_SILENT_FAILURE} - Result := False; + {$IFDEF UNICODE_SILENT_FAILURE} + Result := True; + {$ELSE} StrPos := -1; {$ENDIF ~UNICODE_SILENT_FAILURE} end; Result := Result and ((StrPos + AnsiStrLen) <= (StrLen + 1)); if Result then for TmpPos := 1 to AnsiStrLen do - begin - S[StrPos] := AnsiBuffer[TmpPos]; - Inc(StrPos); - end; + begin + S[StrPos] := AnsiBuffer[TmpPos]; + Inc(StrPos); + end; end; end; @@ -3086,18 +3091,19 @@ // add ReplacementCharacter AnsiBuffer := AnsiReplacementCharacter; AnsiStrLen := 1; - {$IFNDEF UNICODE_SILENT_FAILURE} - Success := False; + {$IFDEF UNICODE_SILENT_FAILURE} + Success := True; + {$ELSE} StrPos := -1; - {$ENDIF ~UNICODE_SILENT_FAILURE} + {$ENDIF UNICODE_SILENT_FAILURE} end; Success := Success and ((StrPos + AnsiStrLen) <= (StrLen + 1)); if Success then for TmpPos := 1 to AnsiStrLen do - begin - S[StrPos] := AnsiBuffer[TmpPos]; - Inc(StrPos); - end; + begin + S[StrPos] := AnsiBuffer[TmpPos]; + Inc(StrPos); + end; if Success then begin Inc(Start); @@ -3124,12 +3130,13 @@ // add ReplacementCharacter AnsiBuffer := AnsiReplacementCharacter; AnsiStrLen := 1; - {$IFNDEF UNICODE_SILENT_FAILURE} - Result := False; - {$ENDIF ~UNICODE_SILENT_FAILURE} + {$IFDEF UNICODE_SILENT_FAILURE} + Result := True; + {$ENDIF UNICODE_SILENT_FAILURE} end; - for TmpPos := 1 to AnsiStrLen do - Result := Result and StreamWriteByte(S, Ord(AnsiBuffer[TmpPos])); + if Result then + for TmpPos := 1 to AnsiStrLen do + Result := Result and StreamWriteByte(S, Ord(AnsiBuffer[TmpPos])); end; function AnsiSetNextBufferToStream(S: TStream; CodePage: Word; const Buffer: TUCS4Array; var Start: SizeInt; Count: SizeInt): SizeInt; overload; @@ -3156,13 +3163,14 @@ // add ReplacementCharacter AnsiBuffer := AnsiReplacementCharacter; AnsiStrLen := 1; - {$IFNDEF UNICODE_SILENT_FAILURE} - Success := False; - {$ENDIF ~UNICODE_SILENT_FAILURE} + {$IFDEF UNICODE_SILENT_FAILURE} + Success := True; + {$ENDIF UNICODE_SILENT_FAILURE} end; - for TmpPos := 1 to AnsiStrLen do - Success := Success and StreamWriteByte(S, Ord(AnsiBuffer[TmpPos])); if Success then + for TmpPos := 1 to AnsiStrLen do + Success := Success and StreamWriteByte(S, Ord(AnsiBuffer[TmpPos])); + if Success then begin Inc(Start); Inc(Result); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sf...@us...> - 2011-04-09 12:54:38
|
Revision: 3518 http://jcl.svn.sourceforge.net/jcl/?rev=3518&view=rev Author: sfarrow Date: 2011-04-09 12:54:32 +0000 (Sat, 09 Apr 2011) Log Message: ----------- Ensure that JclSysUtils compiles in Delphi 7 by changing the call to RaiseLastOSError to use the version of the procedure appropriate to the Delphi version, i.e use the procedure taking a parameter in delphi 11 and above otherwise use the procedure that requests the error from the operating system in delphi 10 and below. Modified Paths: -------------- trunk/jcl/source/common/JclSysUtils.pas Modified: trunk/jcl/source/common/JclSysUtils.pas =================================================================== --- trunk/jcl/source/common/JclSysUtils.pas 2011-04-04 08:49:05 UTC (rev 3517) +++ trunk/jcl/source/common/JclSysUtils.pas 2011-04-09 12:54:32 UTC (rev 3518) @@ -2737,7 +2737,11 @@ PipeInfo.PipeRead := 0; end else + {$IFDEF DELPHI11_UP} RaiseLastOSError(Res); + {$ELSE} + RaiseLastOSError; + {$ENDIF DELPHI11_UP} end; end; @@ -2902,7 +2906,11 @@ // event on abort AbortPtr^ := True else + {$IFDEF DELPHI11_UP} RaiseLastOSError(Index); + {$ELSE} + RaiseLastOSError; + {$ENDIF DELPHI11_UP} end; if AbortPtr^ then TerminateProcess(ProcessEvent.Handle, Cardinal(ABORT_EXIT_CODE)); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |