Commits

Anonymous committed 67caaf4

Initial commit

  • Participants

Comments (0)

Files changed (14)

+glob:*.identcache
+glob:*.dcu
+glob:*/__history/*
+glob:*/Debug/*
+glob:*/Release/*
+glob:*.local
+glob:*.skincfg

File Demo/ASProviderDemoApp.dpr

+program ASProviderDemoApp;
+
+uses
+  Forms,
+  TestMain in 'TestMain.pas' {MainForm};
+
+{$R *.res}
+
+begin
+  ReportMemoryLeaksOnShutdown := True;
+
+  Application.Initialize;
+  Application.MainFormOnTaskbar := True;
+  Application.CreateForm(TMainForm, MainForm);
+  Application.Run;
+end.

File Demo/ASProviderDemoApp.dproj

+	<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+		<PropertyGroup>
+			<ProjectGuid>{117A304A-6040-4F9A-8317-47A58F9FB37B}</ProjectGuid>
+			<ProjectVersion>12.2</ProjectVersion>
+			<MainSource>ASProviderDemoApp.dpr</MainSource>
+			<Base>True</Base>
+			<Config Condition="'$(Config)'==''">Debug</Config>
+			<Platform>Win32</Platform>
+			<AppType>Application</AppType>
+			<FrameworkType>VCL</FrameworkType>
+			<DCC_DCCCompiler>DCC32</DCC_DCCCompiler>
+		</PropertyGroup>
+		<PropertyGroup Condition="'$(Config)'=='Base' or '$(Base)'!=''">
+			<Base>true</Base>
+		</PropertyGroup>
+		<PropertyGroup Condition="'$(Config)'=='Debug' or '$(Cfg_1)'!=''">
+			<Cfg_1>true</Cfg_1>
+			<CfgParent>Base</CfgParent>
+			<Base>true</Base>
+		</PropertyGroup>
+		<PropertyGroup Condition="'$(Config)'=='Release' or '$(Cfg_2)'!=''">
+			<Cfg_2>true</Cfg_2>
+			<CfgParent>Base</CfgParent>
+			<Base>true</Base>
+		</PropertyGroup>
+		<PropertyGroup Condition="'$(Base)'!=''">
+			<DCC_UsePackage>vclimg;vcl;vclx;dbrtl;Rave90VCL;bdertl;rtl;xmlrtl;vclactnband;VclSmp;svnui;svn;TeeUI;TeeDB;Tee;vcldb;vcldbx;vcltouch;dsnap;dsnapcon;vclib;ibxpress;adortl;IndyCore;IndySystem;IndyProtocols;inet;intrawebdb_110_150;Intraweb_110_150;vclie;inetdb;webdsnap;websnap;inetdbbde;inetdbxpress;soaprtl;vclribbon;DbxCommonDriver;DBXInterBaseDriver;DBXMySQLDriver;dbexpress;dbxcds;CodeSiteExpressVcl;StrSecIV150;dxCoreD15;cxLibraryD15;dxDockingD15;cxPageControlD15;dxNavBarD15;dcldxSkinsCoreD15;dxSkinsCoreD15;dxSkinBlackD15;dxSkinBlueD15;dxSkinCaramelD15;dxSkinCoffeeD15;dxSkinDarkRoomD15;dxSkinDarkSideD15;dxSkinFoggyD15;dxSkinGlassOceansD15;dxSkiniMaginaryD15;dxSkinLilianD15;dxSkinLiquidSkyD15;dxSkinLondonLiquidSkyD15;dxSkinMcSkinD15;dxSkinMoneyTwinsD15;dxSkinOffice2007BlackD15;dxSkinOffice2007BlueD15;dxSkinOffice2007GreenD15;dxSkinOffice2007PinkD15;dxSkinOffice2007SilverD15;dxSkinOffice2010BlackD15;dxSkinOffice2010BlueD15;dxSkinOffice2010SilverD15;dxSkinPumpkinD15;dxSkinSevenD15;dxSkinSharpD15;dxSkinSilverD15;dxSkinSpringTimeD15;dxSkinStardustD15;dxSkinSummer2008D15;dxSkinValentineD15;dxSkinXmas2008BlueD15;dxmdsD15;dxorgcD15;dxdborD15;cxEditorsD15;cxExtEditorsD15;dxsbD15;dxComnD15;dxBarD15;dxBarDBNavD15;dxBarExtDBItemsD15;dxBarExtItemsD15;dxRibbonD15;dxSpellCheckerD15;dxdbtrD15;dxtrmdD15;cxSchedulerD15;cxVerticalGridD15;dxLayoutControlD15;cxGridD15;cxTreeListD15;cxPivotGridD15;cxPivotGridOLAPD15;dxPSCoreD15;dxPSTeeChartD15;dxPSLnksD15;dxPSDBTeeChartD15;dxPScxPCProdD15;dxSkinscxPCPainterD15;dxSkinscxScheduler3PainterD15;dxSkinsdxBarPainterD15;dxSkinsdxNavBar2PainterD15;dxSkinsdxRibbonPainterD15;dxSkinsdxDLPainterD15;cxBarEditItemD15;cxSchedulerGridD15;cxTreeListdxBarPopupMenuD15;cxPivotGridChartD15;dxPScxCommonD15;dxPScxExtCommonD15;dxPScxGrid6LnkD15;dxPScxPivotGrid2LnkD15;dxPScxScheduler3LnkD15;dxPScxSSLnkD15;dxPScxTL5LnkD15;dxPScxVGridLnkD15;dxPSdxDBOCLnkD15;dxPSdxDBTVLnkD15;dxPSdxFCLnkD15;dxPSdxLC2LnkD15;dxPSdxOCLnkD15;dxPsPrVwAdvD15;dxPSPrVwRibbonD15;dxFlowChartD15;cxSpreadSheetD15</DCC_UsePackage>
+			<DCC_DcuOutput>.\$(Config)\$(Platform)</DCC_DcuOutput>
+			<DCC_ImageBase>00400000</DCC_ImageBase>
+			<DCC_UnitAlias>WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;$(DCC_UnitAlias)</DCC_UnitAlias>
+			<DCC_ExeOutput>.\$(Config)\$(Platform)</DCC_ExeOutput>
+		</PropertyGroup>
+		<PropertyGroup Condition="'$(Cfg_1)'!=''">
+			<DCC_DebugDCUs>true</DCC_DebugDCUs>
+			<DCC_Define>DEBUG;$(DCC_Define)</DCC_Define>
+			<DCC_Optimize>false</DCC_Optimize>
+			<DCC_GenerateStackFrames>true</DCC_GenerateStackFrames>
+		</PropertyGroup>
+		<PropertyGroup Condition="'$(Cfg_2)'!=''">
+			<DCC_LocalDebugSymbols>false</DCC_LocalDebugSymbols>
+			<DCC_Define>RELEASE;$(DCC_Define)</DCC_Define>
+			<DCC_SymbolReferenceInfo>0</DCC_SymbolReferenceInfo>
+			<DCC_DebugInformation>false</DCC_DebugInformation>
+		</PropertyGroup>
+		<ItemGroup>
+			<DelphiCompile Include="ASProviderDemoApp.dpr">
+				<MainSource>MainSource</MainSource>
+			</DelphiCompile>
+			<DCCReference Include="TestMain.pas">
+				<Form>MainForm</Form>
+			</DCCReference>
+			<BuildConfiguration Include="Release">
+				<Key>Cfg_2</Key>
+				<CfgParent>Base</CfgParent>
+			</BuildConfiguration>
+			<BuildConfiguration Include="Base">
+				<Key>Base</Key>
+			</BuildConfiguration>
+			<BuildConfiguration Include="Debug">
+				<Key>Cfg_1</Key>
+				<CfgParent>Base</CfgParent>
+			</BuildConfiguration>
+		</ItemGroup>
+		<Import Condition="Exists('$(BDS)\Bin\CodeGear.Delphi.Targets')" Project="$(BDS)\Bin\CodeGear.Delphi.Targets"/>
+		<Import Condition="Exists('$(APPDATA)\Embarcadero\$(BDSAPPDATABASEDIR)\8.0\UserTools.proj')" Project="$(APPDATA)\Embarcadero\$(BDSAPPDATABASEDIR)\8.0\UserTools.proj"/>
+		<ProjectExtensions>
+			<Borland.Personality>Delphi.Personality.12</Borland.Personality>
+			<Borland.ProjectType/>
+			<BorlandProject>
+				<Delphi.Personality>
+					<VersionInfo>
+						<VersionInfo Name="IncludeVerInfo">False</VersionInfo>
+						<VersionInfo Name="AutoIncBuild">False</VersionInfo>
+						<VersionInfo Name="MajorVer">1</VersionInfo>
+						<VersionInfo Name="MinorVer">0</VersionInfo>
+						<VersionInfo Name="Release">0</VersionInfo>
+						<VersionInfo Name="Build">0</VersionInfo>
+						<VersionInfo Name="Debug">False</VersionInfo>
+						<VersionInfo Name="PreRelease">False</VersionInfo>
+						<VersionInfo Name="Special">False</VersionInfo>
+						<VersionInfo Name="Private">False</VersionInfo>
+						<VersionInfo Name="DLL">False</VersionInfo>
+						<VersionInfo Name="Locale">1053</VersionInfo>
+						<VersionInfo Name="CodePage">1252</VersionInfo>
+					</VersionInfo>
+					<VersionInfoKeys>
+						<VersionInfoKeys Name="CompanyName"/>
+						<VersionInfoKeys Name="FileDescription"/>
+						<VersionInfoKeys Name="FileVersion">1.0.0.0</VersionInfoKeys>
+						<VersionInfoKeys Name="InternalName"/>
+						<VersionInfoKeys Name="LegalCopyright"/>
+						<VersionInfoKeys Name="LegalTrademarks"/>
+						<VersionInfoKeys Name="OriginalFilename"/>
+						<VersionInfoKeys Name="ProductName"/>
+						<VersionInfoKeys Name="ProductVersion">1.0.0.0</VersionInfoKeys>
+						<VersionInfoKeys Name="Comments"/>
+					</VersionInfoKeys>
+					<Excluded_Packages>
+						<Excluded_Packages Name="$(BDSBIN)\bcboffice2k150.bpl">Embarcadero C++Builder Office 2000 Servers Package</Excluded_Packages>
+						<Excluded_Packages Name="$(BDSBIN)\bcbofficexp150.bpl">Embarcadero C++Builder Office XP Servers Package</Excluded_Packages>
+						<Excluded_Packages Name="$(BDSBIN)\dcloffice2k150.bpl">Microsoft Office 2000 Sample Automation Server Wrapper Components</Excluded_Packages>
+						<Excluded_Packages Name="$(BDSBIN)\dclofficexp150.bpl">Microsoft Office XP Sample Automation Server Wrapper Components</Excluded_Packages>
+					</Excluded_Packages>
+					<Source>
+						<Source Name="MainSource">ASProviderDemoApp.dpr</Source>
+					</Source>
+				</Delphi.Personality>
+				<Platforms>
+					<Platform value="Win32">True</Platform>
+				</Platforms>
+			</BorlandProject>
+			<ProjectFileVersion>12</ProjectFileVersion>
+		</ProjectExtensions>
+	</Project>
+
+<!-- EurekaLog First Line
+[Exception Log]
+EurekaLog Version=6025
+Activate=0
+Activate Handle=1
+Save Log File=1
+Foreground Tab=0
+Freeze Activate=0
+Freeze Timeout=60
+SMTP From=eurekalog@email.com
+SMTP Host=
+SMTP Port=25
+SMTP UserID=
+SMTP Password=
+Append to Log=0
+TerminateBtn Operation=2
+Errors Number=32
+Errors Terminate=3
+Email Address=
+Email Object=
+Email Send Options=0
+Output Path=
+Encrypt Password=
+AutoCloseDialogSecs=0
+WebSendMode=0
+SupportULR=
+HTMLLayout Count=15
+HTMLLine0="%U003Chtml%U003E"
+HTMLLine1="  %U003Chead%U003E"
+HTMLLine2="  %U003C/head%U003E"
+HTMLLine3="  %U003Cbody TopMargin=10 LeftMargin=10%U003E"
+HTMLLine4="    %U003Ctable width="100%%" border="0"%U003E"
+HTMLLine5="      %U003Ctr%U003E"
+HTMLLine6="        %U003Ctd nowrap%U003E"
+HTMLLine7="          %U003Cfont face="Lucida Console, Courier" size="2"%U003E"
+HTMLLine8="            %U003C%%HTML_TAG%%%U003E"
+HTMLLine9="          %U003C/font%U003E"
+HTMLLine10="        %U003C/td%U003E"
+HTMLLine11="      %U003C/tr%U003E"
+HTMLLine12="    %U003C/table%U003E"
+HTMLLine13="  %U003C/body%U003E"
+HTMLLine14="%U003C/html%U003E"
+AutoCrashOperation=2
+AutoCrashNumber=10
+AutoCrashMinutes=1
+WebURL=
+WebUserID=
+WebPassword=
+WebPort=0
+AttachedFiles=
+ProxyURL=
+ProxyUser=
+ProxyPassword=
+ProxyPort=8080
+TrakerUser=
+TrakerPassword=
+TrakerAssignTo=
+TrakerProject=
+TrakerCategory=
+TrakerTrialID=
+ZipPassword=
+PreBuildEvent=
+PostSuccessfulBuildEvent=
+PostFailureBuildEvent=
+ExceptionDialogType=2
+Count=0
+EMail Message Line Count=0
+loNoDuplicateErrors=0
+loAppendReproduceText=0
+loDeleteLogAtVersionChange=0
+loAddComputerNameInLogFileName=0
+loSaveModulesAndProcessesSections=1
+loSaveAssemblerAndCPUSections=1
+soAppStartDate=1
+soAppName=1
+soAppVersionNumber=1
+soAppParameters=1
+soAppCompilationDate=1
+soAppUpTime=1
+soExcDate=1
+soExcAddress=1
+soExcModuleName=1
+soExcModuleVersion=1
+soExcType=1
+soExcMessage=1
+soExcID=1
+soExcCount=1
+soExcStatus=1
+soExcNote=1
+soUserID=1
+soUserName=1
+soUserEmail=1
+soUserPrivileges=1
+soUserCompany=1
+soActCtlsFormClass=1
+soActCtlsFormText=1
+soActCtlsControlClass=1
+soActCtlsControlText=1
+soCmpName=1
+soCmpTotalMemory=1
+soCmpFreeMemory=1
+soCmpTotalDisk=1
+soCmpFreeDisk=1
+soCmpSysUpTime=1
+soCmpProcessor=1
+soCmpDisplayMode=1
+soCmpDisplayDPI=1
+soCmpVideoCard=1
+soCmpPrinter=1
+soOSType=1
+soOSBuildN=1
+soOSUpdate=1
+soOSLanguage=1
+soOSCharset=1
+soNetIP=1
+soNetSubmask=1
+soNetGateway=1
+soNetDNS1=1
+soNetDNS2=1
+soNetDHCP=1
+soCustomData=1
+sndShowSendDialog=1
+sndShowSuccessFailureMsg=0
+sndSendEntireLog=0
+sndSendXMLLogCopy=0
+sndSendScreenshot=1
+sndUseOnlyActiveWindow=0
+sndSendLastHTMLPage=1
+sndSendInSeparatedThread=0
+sndAddDateInFileName=0
+sndAddComputerNameInFileName=0
+edoSendErrorReportChecked=1
+edoAttachScreenshotChecked=1
+edoShowCopyToClipOption=1
+edoShowDetailsButton=1
+edoShowInDetailedMode=0
+edoShowInTopMostMode=0
+edoUseEurekaLogLookAndFeel=0
+edoShowSendErrorReportOption=1
+edoShowAttachScreenshotOption=1
+edoShowCustomButton=0
+csoShowDLLs=1
+csoShowBPLs=1
+csoShowBorlandThreads=1
+csoShowWindowsThreads=1
+csoDoNotStoreProcNames=0
+boPauseBorlandThreads=0
+boDoNotPauseMainThread=0
+boPauseWindowsThreads=0
+boUseMainModuleOptions=1
+boCopyLogInCaseOfError=1
+boSaveCompressedCopyInCaseOfError=0
+boHandleSafeCallExceptions=1
+boCallRTLExceptionEvent=0
+boCatchHandledExceptions=0
+loCatchLeaks=0
+loGroupsSonLeaks=1
+loHideBorlandLeaks=1
+loFreeAllLeaks=1
+loCatchLeaksExceptions=1
+cfoReduceFileSize=1
+cfoCheckFileCorruption=0
+Count mtInformationMsgCaption=1
+mtInformationMsgCaption0="Information."
+Count mtQuestionMsgCaption=1
+mtQuestionMsgCaption0="Question."
+Count mtErrorMsgCaption=1
+mtErrorMsgCaption0="Error."
+Count mtDialog_Caption=1
+mtDialog_Caption0="Error occurred"
+Count mtDialog_ErrorMsgCaption=2
+mtDialog_ErrorMsgCaption0="An error has occurred during program execution."
+mtDialog_ErrorMsgCaption1="Please read the following information for further details."
+Count mtDialog_GeneralCaption=1
+mtDialog_GeneralCaption0="General"
+Count mtDialog_GeneralHeader=1
+mtDialog_GeneralHeader0="General Information"
+Count mtDialog_CallStackCaption=1
+mtDialog_CallStackCaption0="Call Stack"
+Count mtDialog_CallStackHeader=1
+mtDialog_CallStackHeader0="Call Stack Information"
+Count mtDialog_ModulesCaption=1
+mtDialog_ModulesCaption0="Modules"
+Count mtDialog_ModulesHeader=1
+mtDialog_ModulesHeader0="Modules Information"
+Count mtDialog_ProcessesCaption=1
+mtDialog_ProcessesCaption0="Processes"
+Count mtDialog_ProcessesHeader=1
+mtDialog_ProcessesHeader0="Processes Information"
+Count mtDialog_AsmCaption=1
+mtDialog_AsmCaption0="Assembler"
+Count mtDialog_AsmHeader=1
+mtDialog_AsmHeader0="Assembler Information"
+Count mtDialog_CPUCaption=1
+mtDialog_CPUCaption0="CPU"
+Count mtDialog_CPUHeader=1
+mtDialog_CPUHeader0="CPU Information"
+Count mtDialog_OKButtonCaption=1
+mtDialog_OKButtonCaption0="%U0026OK"
+Count mtDialog_TerminateButtonCaption=1
+mtDialog_TerminateButtonCaption0="%U0026Terminate"
+Count mtDialog_RestartButtonCaption=1
+mtDialog_RestartButtonCaption0="%U0026Restart"
+Count mtDialog_DetailsButtonCaption=1
+mtDialog_DetailsButtonCaption0="%U0026Details"
+Count mtDialog_CustomButtonCaption=1
+mtDialog_CustomButtonCaption0="%U0026Help"
+Count mtDialog_SendMessage=1
+mtDialog_SendMessage0="%U0026Send this error via Internet"
+Count mtDialog_ScreenshotMessage=1
+mtDialog_ScreenshotMessage0="%U0026Attach a Screenshot image"
+Count mtDialog_CopyMessage=1
+mtDialog_CopyMessage0="%U0026Copy to Clipboard"
+Count mtDialog_SupportMessage=1
+mtDialog_SupportMessage0="Go to the Support Page"
+Count mtMSDialog_ErrorMsgCaption=1
+mtMSDialog_ErrorMsgCaption0="The application has encountered a problem. We are sorry for the inconvenience."
+Count mtMSDialog_RestartCaption=1
+mtMSDialog_RestartCaption0="Restart application."
+Count mtMSDialog_TerminateCaption=1
+mtMSDialog_TerminateCaption0="Terminate application."
+Count mtMSDialog_PleaseCaption=1
+mtMSDialog_PleaseCaption0="Please tell us about this problem."
+Count mtMSDialog_DescriptionCaption=1
+mtMSDialog_DescriptionCaption0="We have created an error report that you can send to us. We will treat this report as confidential and anonymous."
+Count mtMSDialog_SeeDetailsCaption=1
+mtMSDialog_SeeDetailsCaption0="To see what data the error report contains,"
+Count mtMSDialog_SeeClickCaption=1
+mtMSDialog_SeeClickCaption0="click here."
+Count mtMSDialog_HowToReproduceCaption=1
+mtMSDialog_HowToReproduceCaption0="What were you doing when the problem happened (optional)?"
+Count mtMSDialog_EmailCaption=1
+mtMSDialog_EmailCaption0="Email address (optional):"
+Count mtMSDialog_SendButtonCaption=1
+mtMSDialog_SendButtonCaption0="%U0026Send Error Report"
+Count mtMSDialog_NoSendButtonCaption=1
+mtMSDialog_NoSendButtonCaption0="%U0026Don't Send"
+Count mtLog_AppHeader=1
+mtLog_AppHeader0="Application"
+Count mtLog_AppStartDate=1
+mtLog_AppStartDate0="Start Date"
+Count mtLog_AppName=1
+mtLog_AppName0="Name/Description"
+Count mtLog_AppVersionNumber=1
+mtLog_AppVersionNumber0="Version Number"
+Count mtLog_AppParameters=1
+mtLog_AppParameters0="Parameters"
+Count mtLog_AppCompilationDate=1
+mtLog_AppCompilationDate0="Compilation Date"
+Count mtLog_AppUpTime=1
+mtLog_AppUpTime0="Up Time"
+Count mtLog_ExcHeader=1
+mtLog_ExcHeader0="Exception"
+Count mtLog_ExcDate=1
+mtLog_ExcDate0="Date"
+Count mtLog_ExcAddress=1
+mtLog_ExcAddress0="Address"
+Count mtLog_ExcModuleName=1
+mtLog_ExcModuleName0="Module Name"
+Count mtLog_ExcModuleVersion=1
+mtLog_ExcModuleVersion0="Module Version"
+Count mtLog_ExcType=1
+mtLog_ExcType0="Type"
+Count mtLog_ExcMessage=1
+mtLog_ExcMessage0="Message"
+Count mtLog_ExcID=1
+mtLog_ExcID0="ID"
+Count mtLog_ExcCount=1
+mtLog_ExcCount0="Count"
+Count mtLog_ExcStatus=1
+mtLog_ExcStatus0="Status"
+Count mtLog_ExcNote=1
+mtLog_ExcNote0="Note"
+Count mtLog_UserHeader=1
+mtLog_UserHeader0="User"
+Count mtLog_UserID=1
+mtLog_UserID0="ID"
+Count mtLog_UserName=1
+mtLog_UserName0="Name"
+Count mtLog_UserEmail=1
+mtLog_UserEmail0="Email"
+Count mtLog_UserCompany=1
+mtLog_UserCompany0="Company"
+Count mtLog_UserPrivileges=1
+mtLog_UserPrivileges0="Privileges"
+Count mtLog_ActCtrlsHeader=1
+mtLog_ActCtrlsHeader0="Active Controls"
+Count mtLog_ActCtrlsFormClass=1
+mtLog_ActCtrlsFormClass0="Form Class"
+Count mtLog_ActCtrlsFormText=1
+mtLog_ActCtrlsFormText0="Form Text"
+Count mtLog_ActCtrlsControlClass=1
+mtLog_ActCtrlsControlClass0="Control Class"
+Count mtLog_ActCtrlsControlText=1
+mtLog_ActCtrlsControlText0="Control Text"
+Count mtLog_CmpHeader=1
+mtLog_CmpHeader0="Computer"
+Count mtLog_CmpName=1
+mtLog_CmpName0="Name"
+Count mtLog_CmpTotalMemory=1
+mtLog_CmpTotalMemory0="Total Memory"
+Count mtLog_CmpFreeMemory=1
+mtLog_CmpFreeMemory0="Free Memory"
+Count mtLog_CmpTotalDisk=1
+mtLog_CmpTotalDisk0="Total Disk"
+Count mtLog_CmpFreeDisk=1
+mtLog_CmpFreeDisk0="Free Disk"
+Count mtLog_CmpSystemUpTime=1
+mtLog_CmpSystemUpTime0="System Up Time"
+Count mtLog_CmpProcessor=1
+mtLog_CmpProcessor0="Processor"
+Count mtLog_CmpDisplayMode=1
+mtLog_CmpDisplayMode0="Display Mode"
+Count mtLog_CmpDisplayDPI=1
+mtLog_CmpDisplayDPI0="Display DPI"
+Count mtLog_CmpVideoCard=1
+mtLog_CmpVideoCard0="Video Card"
+Count mtLog_CmpPrinter=1
+mtLog_CmpPrinter0="Printer"
+Count mtLog_OSHeader=1
+mtLog_OSHeader0="Operating System"
+Count mtLog_OSType=1
+mtLog_OSType0="Type"
+Count mtLog_OSBuildN=1
+mtLog_OSBuildN0="Build #"
+Count mtLog_OSUpdate=1
+mtLog_OSUpdate0="Update"
+Count mtLog_OSLanguage=1
+mtLog_OSLanguage0="Language"
+Count mtLog_OSCharset=1
+mtLog_OSCharset0="Charset"
+Count mtLog_NetHeader=1
+mtLog_NetHeader0="Network"
+Count mtLog_NetIP=1
+mtLog_NetIP0="IP Address"
+Count mtLog_NetSubmask=1
+mtLog_NetSubmask0="Submask"
+Count mtLog_NetGateway=1
+mtLog_NetGateway0="Gateway"
+Count mtLog_NetDNS1=1
+mtLog_NetDNS10="DNS 1"
+Count mtLog_NetDNS2=1
+mtLog_NetDNS20="DNS 2"
+Count mtLog_NetDHCP=1
+mtLog_NetDHCP0="DHCP"
+Count mtLog_CustInfoHeader=1
+mtLog_CustInfoHeader0="Custom Information"
+Count mtCallStack_Address=1
+mtCallStack_Address0="Address"
+Count mtCallStack_Name=1
+mtCallStack_Name0="Module"
+Count mtCallStack_Unit=1
+mtCallStack_Unit0="Unit"
+Count mtCallStack_Class=1
+mtCallStack_Class0="Class"
+Count mtCallStack_Procedure=1
+mtCallStack_Procedure0="Procedure/Method"
+Count mtCallStack_Line=1
+mtCallStack_Line0="Line"
+Count mtCallStack_MainThread=1
+mtCallStack_MainThread0="Main"
+Count mtCallStack_ExceptionThread=1
+mtCallStack_ExceptionThread0="Exception Thread"
+Count mtCallStack_RunningThread=1
+mtCallStack_RunningThread0="Running Thread"
+Count mtCallStack_CallingThread=1
+mtCallStack_CallingThread0="Calling Thread"
+Count mtCallStack_ThreadID=1
+mtCallStack_ThreadID0="ID"
+Count mtCallStack_ThreadPriority=1
+mtCallStack_ThreadPriority0="Priority"
+Count mtCallStack_ThreadClass=1
+mtCallStack_ThreadClass0="Class"
+Count mtCallStack_LeakCaption=1
+mtCallStack_LeakCaption0="Memory Leak"
+Count mtCallStack_LeakData=1
+mtCallStack_LeakData0="Data"
+Count mtCallStack_LeakType=1
+mtCallStack_LeakType0="Type"
+Count mtCallStack_LeakSize=1
+mtCallStack_LeakSize0="Total size"
+Count mtCallStack_LeakCount=1
+mtCallStack_LeakCount0="Count"
+Count mtSendDialog_Caption=1
+mtSendDialog_Caption0="Send."
+Count mtSendDialog_Message=1
+mtSendDialog_Message0="Message"
+Count mtSendDialog_Resolving=1
+mtSendDialog_Resolving0="Resolving DNS..."
+Count mtSendDialog_Login=1
+mtSendDialog_Login0="Login..."
+Count mtSendDialog_Connecting=1
+mtSendDialog_Connecting0="Connecting with server..."
+Count mtSendDialog_Connected=1
+mtSendDialog_Connected0="Connected with server."
+Count mtSendDialog_Sending=1
+mtSendDialog_Sending0="Sending message..."
+Count mtSendDialog_Sent=1
+mtSendDialog_Sent0="Message sent."
+Count mtSendDialog_SelectProject=1
+mtSendDialog_SelectProject0="Select project..."
+Count mtSendDialog_Searching=1
+mtSendDialog_Searching0="Searching..."
+Count mtSendDialog_Modifying=1
+mtSendDialog_Modifying0="Modifying..."
+Count mtSendDialog_Disconnecting=1
+mtSendDialog_Disconnecting0="Disconnecting..."
+Count mtSendDialog_Disconnected=1
+mtSendDialog_Disconnected0="Disconnected."
+Count mtReproduceDialog_Caption=1
+mtReproduceDialog_Caption0="Request"
+Count mtReproduceDialog_Request=1
+mtReproduceDialog_Request0="Please describe the steps to reproduce the error:"
+Count mtReproduceDialog_OKButtonCaption=1
+mtReproduceDialog_OKButtonCaption0="%U0026OK"
+Count mtModules_Handle=1
+mtModules_Handle0="Handle"
+Count mtModules_Name=1
+mtModules_Name0="Name"
+Count mtModules_Description=1
+mtModules_Description0="Description"
+Count mtModules_Version=1
+mtModules_Version0="Version"
+Count mtModules_Size=1
+mtModules_Size0="Size"
+Count mtModules_LastModified=1
+mtModules_LastModified0="Modified"
+Count mtModules_Path=1
+mtModules_Path0="Path"
+Count mtProcesses_ID=1
+mtProcesses_ID0="ID"
+Count mtProcesses_Name=1
+mtProcesses_Name0="Name"
+Count mtProcesses_Description=1
+mtProcesses_Description0="Description"
+Count mtProcesses_Version=1
+mtProcesses_Version0="Version"
+Count mtProcesses_Memory=1
+mtProcesses_Memory0="Memory"
+Count mtProcesses_Priority=1
+mtProcesses_Priority0="Priority"
+Count mtProcesses_Threads=1
+mtProcesses_Threads0="Threads"
+Count mtProcesses_Path=1
+mtProcesses_Path0="Path"
+Count mtCPU_Registers=1
+mtCPU_Registers0="Registers"
+Count mtCPU_Stack=1
+mtCPU_Stack0="Stack"
+Count mtCPU_MemoryDump=1
+mtCPU_MemoryDump0="Memory Dump"
+Count mtSend_SuccessMsg=1
+mtSend_SuccessMsg0="The message was sent successfully."
+Count mtSend_FailureMsg=1
+mtSend_FailureMsg0="Sorry, sending the message didn't work."
+Count mtSend_BugClosedMsg=2
+mtSend_BugClosedMsg0="These BUG is just closed."
+mtSend_BugClosedMsg1="Contact the program support to obtain an update."
+Count mtSend_UnknownErrorMsg=1
+mtSend_UnknownErrorMsg0="Unknown error."
+Count mtSend_InvalidLoginMsg=1
+mtSend_InvalidLoginMsg0="Invalid login request."
+Count mtSend_InvalidSearchMsg=1
+mtSend_InvalidSearchMsg0="Invalid search request."
+Count mtSend_InvalidSelectionMsg=1
+mtSend_InvalidSelectionMsg0="Invalid selection request."
+Count mtSend_InvalidInsertMsg=1
+mtSend_InvalidInsertMsg0="Invalid insert request."
+Count mtSend_InvalidModifyMsg=1
+mtSend_InvalidModifyMsg0="Invalid modify request."
+Count mtFileCrackedMsg=2
+mtFileCrackedMsg0="This file is cracked."
+mtFileCrackedMsg1="The application will be closed."
+Count mtException_LeakMultiFree=1
+mtException_LeakMultiFree0="Multi Free memory leak."
+Count mtException_LeakMemoryOverrun=1
+mtException_LeakMemoryOverrun0="Memory Overrun leak."
+Count mtException_AntiFreeze=1
+mtException_AntiFreeze0="The application seems to be frozen."
+Count mtInvalidEmailMsg=1
+mtInvalidEmailMsg0="Invalid email."
+TextsCollection=English
+EurekaLog Last Line -->

File Demo/ASProviderDemoApp.res

Binary file added.

File Demo/TestMain.dfm

+object MainForm: TMainForm
+  Left = 0
+  Top = 0
+  Caption = 'AS Provider Demo App'
+  ClientHeight = 337
+  ClientWidth = 635
+  Color = clBtnFace
+  Font.Charset = DEFAULT_CHARSET
+  Font.Color = clWindowText
+  Font.Height = -11
+  Font.Name = 'Tahoma'
+  Font.Style = []
+  OldCreateOrder = False
+  OnCreate = FormCreate
+  OnDestroy = FormDestroy
+  PixelsPerInch = 96
+  TextHeight = 13
+  object Button1: TButton
+    Left = 535
+    Top = 41
+    Width = 75
+    Height = 25
+    Caption = 'Open'
+    TabOrder = 0
+    OnClick = Button1Click
+  end
+  object DBGrid1: TDBGrid
+    Left = 40
+    Top = 32
+    Width = 489
+    Height = 120
+    DataSource = DataSource1
+    TabOrder = 1
+    TitleFont.Charset = DEFAULT_CHARSET
+    TitleFont.Color = clWindowText
+    TitleFont.Height = -11
+    TitleFont.Name = 'Tahoma'
+    TitleFont.Style = []
+  end
+  object cxDBNavigator1: TcxDBNavigator
+    Left = 40
+    Top = 168
+    Width = 255
+    Height = 25
+    DataSource = DataSource1
+    TabOrder = 2
+  end
+  object Button2: TButton
+    Left = 535
+    Top = 72
+    Width = 75
+    Height = 25
+    Caption = 'Apply'
+    TabOrder = 3
+    OnClick = Button2Click
+  end
+  object ClientDataSet1: TClientDataSet
+    Aggregates = <>
+    Params = <>
+    ProviderName = 'ASComponentProvider1'
+    Left = 480
+    Top = 168
+  end
+  object DataSource1: TDataSource
+    DataSet = ClientDataSet1
+    Left = 408
+    Top = 168
+  end
+  object ASProvider1: TASProvider
+    Left = 560
+    Top = 168
+  end
+  object ASComponentProvider1: TASComponentProvider
+    Active = False
+    ProvidedComponent = ASProvider1
+    FieldDefs = <
+      item
+        Name = 'Data'
+        Attributes = [faReadonly]
+        DataType = ftVariant
+      end
+      item
+        Name = 'ComponentCount'
+        Attributes = [faReadonly]
+        DataType = ftInteger
+      end
+      item
+        Name = 'ComponentIndex'
+        DataType = ftInteger
+      end
+      item
+        Name = 'DesignInfo'
+        DataType = ftInteger
+      end
+      item
+        Name = 'Name'
+        DataType = ftWideString
+        Size = 20
+      end
+      item
+        Name = 'Tag'
+        DataType = ftInteger
+      end>
+    Left = 488
+    Top = 248
+  end
+end

File Demo/TestMain.pas

+unit TestMain;
+
+interface
+
+uses
+  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
+  Dialogs, DB, DBClient, ASObjectProvider, StdCtrls, Provider, Grids, DBGrids, xmldom, Xmlxform, ASProvider,
+  cxGraphics, cxControls, cxLookAndFeels, cxLookAndFeelPainters, cxNavigator, cxDBNavigator;
+
+type
+  TMainForm = class(TForm)
+    ClientDataSet1: TClientDataSet;
+    Button1: TButton;
+    DBGrid1: TDBGrid;
+    DataSource1: TDataSource;
+    ASProvider1: TASProvider;
+    cxDBNavigator1: TcxDBNavigator;
+    Button2: TButton;
+    ASComponentProvider1: TASComponentProvider;
+    procedure Button1Click(Sender: TObject);
+    procedure FormCreate(Sender: TObject);
+    procedure FormDestroy(Sender: TObject);
+    procedure Button2Click(Sender: TObject);
+  private
+    { Private declarations }
+  public
+    { Public declarations }
+  end;
+
+var
+  MainForm: TMainForm;
+
+implementation
+
+uses
+  CodeSiteLogging;
+
+{$R *.dfm}
+
+procedure TMainForm.Button1Click(Sender: TObject);
+begin
+  ASComponentProvider1.Open;
+  ClientDataSet1.Open;
+end;
+
+procedure TMainForm.Button2Click(Sender: TObject);
+begin
+  ClientDataSet1.ApplyUpdates(0);
+end;
+
+procedure TMainForm.FormCreate(Sender: TObject);
+begin
+end;
+
+procedure TMainForm.FormDestroy(Sender: TObject);
+begin
+end;
+
+end.

File Proj/asobjprovider.dpk

+package asobjprovider;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION OFF}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'ASTEKK Object Provider'}
+{$LIBSUFFIX '150'}
+{$IMPLICITBUILD ON}
+{$DEFINE DEBUG}
+
+requires
+  rtl,
+  dsnap,
+  dbrtl,
+  CodeSiteExpressVcl,
+  asutils;
+
+contains
+  ASProvider in '..\Src\ASProvider.pas';
+
+end.

File Proj/asobjprovider.dproj

+	<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+		<PropertyGroup>
+			<ProjectGuid>{C9DB6A1A-9FED-4555-B0A4-84B6AE1B33A9}</ProjectGuid>
+			<MainSource>asobjprovider.dpk</MainSource>
+			<ProjectVersion>12.2</ProjectVersion>
+			<Base>True</Base>
+			<Config Condition="'$(Config)'==''">Debug</Config>
+			<Platform>Win32</Platform>
+			<AppType>Package</AppType>
+			<FrameworkType>None</FrameworkType>
+			<DCC_DCCCompiler>DCC32</DCC_DCCCompiler>
+		</PropertyGroup>
+		<PropertyGroup Condition="'$(Config)'=='Base' or '$(Base)'!=''">
+			<Base>true</Base>
+		</PropertyGroup>
+		<PropertyGroup Condition="'$(Config)'=='Debug' or '$(Cfg_1)'!=''">
+			<Cfg_1>true</Cfg_1>
+			<CfgParent>Base</CfgParent>
+			<Base>true</Base>
+		</PropertyGroup>
+		<PropertyGroup Condition="'$(Config)'=='Release' or '$(Cfg_2)'!=''">
+			<Cfg_2>true</Cfg_2>
+			<CfgParent>Base</CfgParent>
+			<Base>true</Base>
+		</PropertyGroup>
+		<PropertyGroup Condition="'$(Base)'!=''">
+			<DCC_GenerateStackFrames>true</DCC_GenerateStackFrames>
+			<DCC_Optimize>false</DCC_Optimize>
+			<DCC_Define>DEBUG;$(DCC_Define)</DCC_Define>
+			<DllSuffix>150</DllSuffix>
+			<DCC_CBuilderOutput>All</DCC_CBuilderOutput>
+			<DCC_Description>ASTEKK Object Provider</DCC_Description>
+			<GenDll>true</GenDll>
+			<GenPackage>true</GenPackage>
+			<DCC_DcuOutput>$(BDSCOMMONDIR)\Dcu</DCC_DcuOutput>
+			<DCC_ImageBase>00400000</DCC_ImageBase>
+			<DCC_UnitAlias>WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;$(DCC_UnitAlias)</DCC_UnitAlias>
+			<DCC_ExeOutput>.\$(Config)\$(Platform)</DCC_ExeOutput>
+		</PropertyGroup>
+		<PropertyGroup Condition="'$(Cfg_1)'!=''">
+			<DCC_MapFile>3</DCC_MapFile>
+			<DCC_Optimize>false</DCC_Optimize>
+			<DCC_GenerateStackFrames>true</DCC_GenerateStackFrames>
+		</PropertyGroup>
+		<PropertyGroup Condition="'$(Cfg_2)'!=''">
+			<DCC_LocalDebugSymbols>false</DCC_LocalDebugSymbols>
+			<DCC_Define>RELEASE;$(DCC_Define)</DCC_Define>
+			<DCC_SymbolReferenceInfo>0</DCC_SymbolReferenceInfo>
+			<DCC_DebugInformation>false</DCC_DebugInformation>
+		</PropertyGroup>
+		<ItemGroup>
+			<DelphiCompile Include="asobjprovider.dpk">
+				<MainSource>MainSource</MainSource>
+			</DelphiCompile>
+			<DCCReference Include="rtl.dcp"/>
+			<DCCReference Include="dsnap.dcp"/>
+			<DCCReference Include="dbrtl.dcp"/>
+			<DCCReference Include="CodeSiteExpressVcl.dcp"/>
+			<DCCReference Include="asutils.dcp"/>
+			<DCCReference Include="..\Src\ASProvider.pas"/>
+			<BuildConfiguration Include="Release">
+				<Key>Cfg_2</Key>
+				<CfgParent>Base</CfgParent>
+			</BuildConfiguration>
+			<BuildConfiguration Include="Base">
+				<Key>Base</Key>
+			</BuildConfiguration>
+			<BuildConfiguration Include="Debug">
+				<Key>Cfg_1</Key>
+				<CfgParent>Base</CfgParent>
+			</BuildConfiguration>
+		</ItemGroup>
+		<Import Condition="Exists('$(BDS)\Bin\CodeGear.Delphi.Targets')" Project="$(BDS)\Bin\CodeGear.Delphi.Targets"/>
+		<Import Condition="Exists('$(APPDATA)\Embarcadero\$(BDSAPPDATABASEDIR)\8.0\UserTools.proj')" Project="$(APPDATA)\Embarcadero\$(BDSAPPDATABASEDIR)\8.0\UserTools.proj"/>
+		<ProjectExtensions>
+			<Borland.Personality>Delphi.Personality.12</Borland.Personality>
+			<Borland.ProjectType>Package</Borland.ProjectType>
+			<BorlandProject>
+				<Delphi.Personality>
+					<VersionInfo>
+						<VersionInfo Name="IncludeVerInfo">True</VersionInfo>
+						<VersionInfo Name="AutoIncBuild">False</VersionInfo>
+						<VersionInfo Name="MajorVer">1</VersionInfo>
+						<VersionInfo Name="MinorVer">0</VersionInfo>
+						<VersionInfo Name="Release">0</VersionInfo>
+						<VersionInfo Name="Build">0</VersionInfo>
+						<VersionInfo Name="Debug">False</VersionInfo>
+						<VersionInfo Name="PreRelease">False</VersionInfo>
+						<VersionInfo Name="Special">False</VersionInfo>
+						<VersionInfo Name="Private">False</VersionInfo>
+						<VersionInfo Name="DLL">False</VersionInfo>
+						<VersionInfo Name="Locale">1053</VersionInfo>
+						<VersionInfo Name="CodePage">1252</VersionInfo>
+					</VersionInfo>
+					<VersionInfoKeys>
+						<VersionInfoKeys Name="CompanyName"/>
+						<VersionInfoKeys Name="FileDescription"/>
+						<VersionInfoKeys Name="FileVersion">1.0.0.0</VersionInfoKeys>
+						<VersionInfoKeys Name="InternalName"/>
+						<VersionInfoKeys Name="LegalCopyright"/>
+						<VersionInfoKeys Name="LegalTrademarks"/>
+						<VersionInfoKeys Name="OriginalFilename"/>
+						<VersionInfoKeys Name="ProductName"/>
+						<VersionInfoKeys Name="ProductVersion">1.0.0.0</VersionInfoKeys>
+						<VersionInfoKeys Name="Comments"/>
+					</VersionInfoKeys>
+					<Excluded_Packages>
+						<Excluded_Packages Name="$(BDSBIN)\bcboffice2k150.bpl">Embarcadero C++Builder Office 2000 Servers Package</Excluded_Packages>
+						<Excluded_Packages Name="$(BDSBIN)\bcbofficexp150.bpl">Embarcadero C++Builder Office XP Servers Package</Excluded_Packages>
+						<Excluded_Packages Name="$(BDSBIN)\dcloffice2k150.bpl">Microsoft Office 2000 Sample Automation Server Wrapper Components</Excluded_Packages>
+						<Excluded_Packages Name="$(BDSBIN)\dclofficexp150.bpl">Microsoft Office XP Sample Automation Server Wrapper Components</Excluded_Packages>
+					</Excluded_Packages>
+					<Source>
+						<Source Name="MainSource">asobjprovider.dpk</Source>
+					</Source>
+				</Delphi.Personality>
+				<Platforms>
+					<Platform value="Win32">True</Platform>
+				</Platforms>
+				<UnitTesting>
+					<TestProjectName>C:\Work\ASTEKK\Delphi\ASProvider\Test\asobjproviderTests.dproj</TestProjectName>
+				</UnitTesting>
+			</BorlandProject>
+			<ProjectFileVersion>12</ProjectFileVersion>
+		</ProjectExtensions>
+	</Project>
+
+<!-- EurekaLog First Line
+[Exception Log]
+EurekaLog Version=6025
+Activate=0
+Activate Handle=1
+Save Log File=1
+Foreground Tab=0
+Freeze Activate=0
+Freeze Timeout=60
+SMTP From=eurekalog@email.com
+SMTP Host=
+SMTP Port=25
+SMTP UserID=
+SMTP Password=
+Append to Log=0
+TerminateBtn Operation=2
+Errors Number=32
+Errors Terminate=3
+Email Address=
+Email Object=
+Email Send Options=0
+Output Path=
+Encrypt Password=
+AutoCloseDialogSecs=0
+WebSendMode=0
+SupportULR=
+HTMLLayout Count=15
+HTMLLine0="%U003Chtml%U003E"
+HTMLLine1="  %U003Chead%U003E"
+HTMLLine2="  %U003C/head%U003E"
+HTMLLine3="  %U003Cbody TopMargin=10 LeftMargin=10%U003E"
+HTMLLine4="    %U003Ctable width="100%%" border="0"%U003E"
+HTMLLine5="      %U003Ctr%U003E"
+HTMLLine6="        %U003Ctd nowrap%U003E"
+HTMLLine7="          %U003Cfont face="Lucida Console, Courier" size="2"%U003E"
+HTMLLine8="            %U003C%%HTML_TAG%%%U003E"
+HTMLLine9="          %U003C/font%U003E"
+HTMLLine10="        %U003C/td%U003E"
+HTMLLine11="      %U003C/tr%U003E"
+HTMLLine12="    %U003C/table%U003E"
+HTMLLine13="  %U003C/body%U003E"
+HTMLLine14="%U003C/html%U003E"
+AutoCrashOperation=2
+AutoCrashNumber=10
+AutoCrashMinutes=1
+WebURL=
+WebUserID=
+WebPassword=
+WebPort=0
+AttachedFiles=
+ProxyURL=
+ProxyUser=
+ProxyPassword=
+ProxyPort=8080
+TrakerUser=
+TrakerPassword=
+TrakerAssignTo=
+TrakerProject=
+TrakerCategory=
+TrakerTrialID=
+ZipPassword=
+PreBuildEvent=
+PostSuccessfulBuildEvent=
+PostFailureBuildEvent=
+ExceptionDialogType=2
+Count=0
+EMail Message Line Count=0
+loNoDuplicateErrors=0
+loAppendReproduceText=0
+loDeleteLogAtVersionChange=0
+loAddComputerNameInLogFileName=0
+loSaveModulesAndProcessesSections=1
+loSaveAssemblerAndCPUSections=1
+soAppStartDate=1
+soAppName=1
+soAppVersionNumber=1
+soAppParameters=1
+soAppCompilationDate=1
+soAppUpTime=1
+soExcDate=1
+soExcAddress=1
+soExcModuleName=1
+soExcModuleVersion=1
+soExcType=1
+soExcMessage=1
+soExcID=1
+soExcCount=1
+soExcStatus=1
+soExcNote=1
+soUserID=1
+soUserName=1
+soUserEmail=1
+soUserPrivileges=1
+soUserCompany=1
+soActCtlsFormClass=1
+soActCtlsFormText=1
+soActCtlsControlClass=1
+soActCtlsControlText=1
+soCmpName=1
+soCmpTotalMemory=1
+soCmpFreeMemory=1
+soCmpTotalDisk=1
+soCmpFreeDisk=1
+soCmpSysUpTime=1
+soCmpProcessor=1
+soCmpDisplayMode=1
+soCmpDisplayDPI=1
+soCmpVideoCard=1
+soCmpPrinter=1
+soOSType=1
+soOSBuildN=1
+soOSUpdate=1
+soOSLanguage=1
+soOSCharset=1
+soNetIP=1
+soNetSubmask=1
+soNetGateway=1
+soNetDNS1=1
+soNetDNS2=1
+soNetDHCP=1
+soCustomData=1
+sndShowSendDialog=1
+sndShowSuccessFailureMsg=0
+sndSendEntireLog=0
+sndSendXMLLogCopy=0
+sndSendScreenshot=1
+sndUseOnlyActiveWindow=0
+sndSendLastHTMLPage=1
+sndSendInSeparatedThread=0
+sndAddDateInFileName=0
+sndAddComputerNameInFileName=0
+edoSendErrorReportChecked=1
+edoAttachScreenshotChecked=1
+edoShowCopyToClipOption=1
+edoShowDetailsButton=1
+edoShowInDetailedMode=0
+edoShowInTopMostMode=0
+edoUseEurekaLogLookAndFeel=0
+edoShowSendErrorReportOption=1
+edoShowAttachScreenshotOption=1
+edoShowCustomButton=0
+csoShowDLLs=1
+csoShowBPLs=1
+csoShowBorlandThreads=1
+csoShowWindowsThreads=1
+csoDoNotStoreProcNames=0
+boPauseBorlandThreads=0
+boDoNotPauseMainThread=0
+boPauseWindowsThreads=0
+boUseMainModuleOptions=1
+boCopyLogInCaseOfError=1
+boSaveCompressedCopyInCaseOfError=0
+boHandleSafeCallExceptions=1
+boCallRTLExceptionEvent=0
+boCatchHandledExceptions=0
+loCatchLeaks=0
+loGroupsSonLeaks=1
+loHideBorlandLeaks=1
+loFreeAllLeaks=1
+loCatchLeaksExceptions=1
+cfoReduceFileSize=1
+cfoCheckFileCorruption=0
+Count mtInformationMsgCaption=1
+mtInformationMsgCaption0="Information."
+Count mtQuestionMsgCaption=1
+mtQuestionMsgCaption0="Question."
+Count mtErrorMsgCaption=1
+mtErrorMsgCaption0="Error."
+Count mtDialog_Caption=1
+mtDialog_Caption0="Error occurred"
+Count mtDialog_ErrorMsgCaption=2
+mtDialog_ErrorMsgCaption0="An error has occurred during program execution."
+mtDialog_ErrorMsgCaption1="Please read the following information for further details."
+Count mtDialog_GeneralCaption=1
+mtDialog_GeneralCaption0="General"
+Count mtDialog_GeneralHeader=1
+mtDialog_GeneralHeader0="General Information"
+Count mtDialog_CallStackCaption=1
+mtDialog_CallStackCaption0="Call Stack"
+Count mtDialog_CallStackHeader=1
+mtDialog_CallStackHeader0="Call Stack Information"
+Count mtDialog_ModulesCaption=1
+mtDialog_ModulesCaption0="Modules"
+Count mtDialog_ModulesHeader=1
+mtDialog_ModulesHeader0="Modules Information"
+Count mtDialog_ProcessesCaption=1
+mtDialog_ProcessesCaption0="Processes"
+Count mtDialog_ProcessesHeader=1
+mtDialog_ProcessesHeader0="Processes Information"
+Count mtDialog_AsmCaption=1
+mtDialog_AsmCaption0="Assembler"
+Count mtDialog_AsmHeader=1
+mtDialog_AsmHeader0="Assembler Information"
+Count mtDialog_CPUCaption=1
+mtDialog_CPUCaption0="CPU"
+Count mtDialog_CPUHeader=1
+mtDialog_CPUHeader0="CPU Information"
+Count mtDialog_OKButtonCaption=1
+mtDialog_OKButtonCaption0="%U0026OK"
+Count mtDialog_TerminateButtonCaption=1
+mtDialog_TerminateButtonCaption0="%U0026Terminate"
+Count mtDialog_RestartButtonCaption=1
+mtDialog_RestartButtonCaption0="%U0026Restart"
+Count mtDialog_DetailsButtonCaption=1
+mtDialog_DetailsButtonCaption0="%U0026Details"
+Count mtDialog_CustomButtonCaption=1
+mtDialog_CustomButtonCaption0="%U0026Help"
+Count mtDialog_SendMessage=1
+mtDialog_SendMessage0="%U0026Send this error via Internet"
+Count mtDialog_ScreenshotMessage=1
+mtDialog_ScreenshotMessage0="%U0026Attach a Screenshot image"
+Count mtDialog_CopyMessage=1
+mtDialog_CopyMessage0="%U0026Copy to Clipboard"
+Count mtDialog_SupportMessage=1
+mtDialog_SupportMessage0="Go to the Support Page"
+Count mtMSDialog_ErrorMsgCaption=1
+mtMSDialog_ErrorMsgCaption0="The application has encountered a problem. We are sorry for the inconvenience."
+Count mtMSDialog_RestartCaption=1
+mtMSDialog_RestartCaption0="Restart application."
+Count mtMSDialog_TerminateCaption=1
+mtMSDialog_TerminateCaption0="Terminate application."
+Count mtMSDialog_PleaseCaption=1
+mtMSDialog_PleaseCaption0="Please tell us about this problem."
+Count mtMSDialog_DescriptionCaption=1
+mtMSDialog_DescriptionCaption0="We have created an error report that you can send to us. We will treat this report as confidential and anonymous."
+Count mtMSDialog_SeeDetailsCaption=1
+mtMSDialog_SeeDetailsCaption0="To see what data the error report contains,"
+Count mtMSDialog_SeeClickCaption=1
+mtMSDialog_SeeClickCaption0="click here."
+Count mtMSDialog_HowToReproduceCaption=1
+mtMSDialog_HowToReproduceCaption0="What were you doing when the problem happened (optional)?"
+Count mtMSDialog_EmailCaption=1
+mtMSDialog_EmailCaption0="Email address (optional):"
+Count mtMSDialog_SendButtonCaption=1
+mtMSDialog_SendButtonCaption0="%U0026Send Error Report"
+Count mtMSDialog_NoSendButtonCaption=1
+mtMSDialog_NoSendButtonCaption0="%U0026Don't Send"
+Count mtLog_AppHeader=1
+mtLog_AppHeader0="Application"
+Count mtLog_AppStartDate=1
+mtLog_AppStartDate0="Start Date"
+Count mtLog_AppName=1
+mtLog_AppName0="Name/Description"
+Count mtLog_AppVersionNumber=1
+mtLog_AppVersionNumber0="Version Number"
+Count mtLog_AppParameters=1
+mtLog_AppParameters0="Parameters"
+Count mtLog_AppCompilationDate=1
+mtLog_AppCompilationDate0="Compilation Date"
+Count mtLog_AppUpTime=1
+mtLog_AppUpTime0="Up Time"
+Count mtLog_ExcHeader=1
+mtLog_ExcHeader0="Exception"
+Count mtLog_ExcDate=1
+mtLog_ExcDate0="Date"
+Count mtLog_ExcAddress=1
+mtLog_ExcAddress0="Address"
+Count mtLog_ExcModuleName=1
+mtLog_ExcModuleName0="Module Name"
+Count mtLog_ExcModuleVersion=1
+mtLog_ExcModuleVersion0="Module Version"
+Count mtLog_ExcType=1
+mtLog_ExcType0="Type"
+Count mtLog_ExcMessage=1
+mtLog_ExcMessage0="Message"
+Count mtLog_ExcID=1
+mtLog_ExcID0="ID"
+Count mtLog_ExcCount=1
+mtLog_ExcCount0="Count"
+Count mtLog_ExcStatus=1
+mtLog_ExcStatus0="Status"
+Count mtLog_ExcNote=1
+mtLog_ExcNote0="Note"
+Count mtLog_UserHeader=1
+mtLog_UserHeader0="User"
+Count mtLog_UserID=1
+mtLog_UserID0="ID"
+Count mtLog_UserName=1
+mtLog_UserName0="Name"
+Count mtLog_UserEmail=1
+mtLog_UserEmail0="Email"
+Count mtLog_UserCompany=1
+mtLog_UserCompany0="Company"
+Count mtLog_UserPrivileges=1
+mtLog_UserPrivileges0="Privileges"
+Count mtLog_ActCtrlsHeader=1
+mtLog_ActCtrlsHeader0="Active Controls"
+Count mtLog_ActCtrlsFormClass=1
+mtLog_ActCtrlsFormClass0="Form Class"
+Count mtLog_ActCtrlsFormText=1
+mtLog_ActCtrlsFormText0="Form Text"
+Count mtLog_ActCtrlsControlClass=1
+mtLog_ActCtrlsControlClass0="Control Class"
+Count mtLog_ActCtrlsControlText=1
+mtLog_ActCtrlsControlText0="Control Text"
+Count mtLog_CmpHeader=1
+mtLog_CmpHeader0="Computer"
+Count mtLog_CmpName=1
+mtLog_CmpName0="Name"
+Count mtLog_CmpTotalMemory=1
+mtLog_CmpTotalMemory0="Total Memory"
+Count mtLog_CmpFreeMemory=1
+mtLog_CmpFreeMemory0="Free Memory"
+Count mtLog_CmpTotalDisk=1
+mtLog_CmpTotalDisk0="Total Disk"
+Count mtLog_CmpFreeDisk=1
+mtLog_CmpFreeDisk0="Free Disk"
+Count mtLog_CmpSystemUpTime=1
+mtLog_CmpSystemUpTime0="System Up Time"
+Count mtLog_CmpProcessor=1
+mtLog_CmpProcessor0="Processor"
+Count mtLog_CmpDisplayMode=1
+mtLog_CmpDisplayMode0="Display Mode"
+Count mtLog_CmpDisplayDPI=1
+mtLog_CmpDisplayDPI0="Display DPI"
+Count mtLog_CmpVideoCard=1
+mtLog_CmpVideoCard0="Video Card"
+Count mtLog_CmpPrinter=1
+mtLog_CmpPrinter0="Printer"
+Count mtLog_OSHeader=1
+mtLog_OSHeader0="Operating System"
+Count mtLog_OSType=1
+mtLog_OSType0="Type"
+Count mtLog_OSBuildN=1
+mtLog_OSBuildN0="Build #"
+Count mtLog_OSUpdate=1
+mtLog_OSUpdate0="Update"
+Count mtLog_OSLanguage=1
+mtLog_OSLanguage0="Language"
+Count mtLog_OSCharset=1
+mtLog_OSCharset0="Charset"
+Count mtLog_NetHeader=1
+mtLog_NetHeader0="Network"
+Count mtLog_NetIP=1
+mtLog_NetIP0="IP Address"
+Count mtLog_NetSubmask=1
+mtLog_NetSubmask0="Submask"
+Count mtLog_NetGateway=1
+mtLog_NetGateway0="Gateway"
+Count mtLog_NetDNS1=1
+mtLog_NetDNS10="DNS 1"
+Count mtLog_NetDNS2=1
+mtLog_NetDNS20="DNS 2"
+Count mtLog_NetDHCP=1
+mtLog_NetDHCP0="DHCP"
+Count mtLog_CustInfoHeader=1
+mtLog_CustInfoHeader0="Custom Information"
+Count mtCallStack_Address=1
+mtCallStack_Address0="Address"
+Count mtCallStack_Name=1
+mtCallStack_Name0="Module"
+Count mtCallStack_Unit=1
+mtCallStack_Unit0="Unit"
+Count mtCallStack_Class=1
+mtCallStack_Class0="Class"
+Count mtCallStack_Procedure=1
+mtCallStack_Procedure0="Procedure/Method"
+Count mtCallStack_Line=1
+mtCallStack_Line0="Line"
+Count mtCallStack_MainThread=1
+mtCallStack_MainThread0="Main"
+Count mtCallStack_ExceptionThread=1
+mtCallStack_ExceptionThread0="Exception Thread"
+Count mtCallStack_RunningThread=1
+mtCallStack_RunningThread0="Running Thread"
+Count mtCallStack_CallingThread=1
+mtCallStack_CallingThread0="Calling Thread"
+Count mtCallStack_ThreadID=1
+mtCallStack_ThreadID0="ID"
+Count mtCallStack_ThreadPriority=1
+mtCallStack_ThreadPriority0="Priority"
+Count mtCallStack_ThreadClass=1
+mtCallStack_ThreadClass0="Class"
+Count mtCallStack_LeakCaption=1
+mtCallStack_LeakCaption0="Memory Leak"
+Count mtCallStack_LeakData=1
+mtCallStack_LeakData0="Data"
+Count mtCallStack_LeakType=1
+mtCallStack_LeakType0="Type"
+Count mtCallStack_LeakSize=1
+mtCallStack_LeakSize0="Total size"
+Count mtCallStack_LeakCount=1
+mtCallStack_LeakCount0="Count"
+Count mtSendDialog_Caption=1
+mtSendDialog_Caption0="Send."
+Count mtSendDialog_Message=1
+mtSendDialog_Message0="Message"
+Count mtSendDialog_Resolving=1
+mtSendDialog_Resolving0="Resolving DNS..."
+Count mtSendDialog_Login=1
+mtSendDialog_Login0="Login..."
+Count mtSendDialog_Connecting=1
+mtSendDialog_Connecting0="Connecting with server..."
+Count mtSendDialog_Connected=1
+mtSendDialog_Connected0="Connected with server."
+Count mtSendDialog_Sending=1
+mtSendDialog_Sending0="Sending message..."
+Count mtSendDialog_Sent=1
+mtSendDialog_Sent0="Message sent."
+Count mtSendDialog_SelectProject=1
+mtSendDialog_SelectProject0="Select project..."
+Count mtSendDialog_Searching=1
+mtSendDialog_Searching0="Searching..."
+Count mtSendDialog_Modifying=1
+mtSendDialog_Modifying0="Modifying..."
+Count mtSendDialog_Disconnecting=1
+mtSendDialog_Disconnecting0="Disconnecting..."
+Count mtSendDialog_Disconnected=1
+mtSendDialog_Disconnected0="Disconnected."
+Count mtReproduceDialog_Caption=1
+mtReproduceDialog_Caption0="Request"
+Count mtReproduceDialog_Request=1
+mtReproduceDialog_Request0="Please describe the steps to reproduce the error:"
+Count mtReproduceDialog_OKButtonCaption=1
+mtReproduceDialog_OKButtonCaption0="%U0026OK"
+Count mtModules_Handle=1
+mtModules_Handle0="Handle"
+Count mtModules_Name=1
+mtModules_Name0="Name"
+Count mtModules_Description=1
+mtModules_Description0="Description"
+Count mtModules_Version=1
+mtModules_Version0="Version"
+Count mtModules_Size=1
+mtModules_Size0="Size"
+Count mtModules_LastModified=1
+mtModules_LastModified0="Modified"
+Count mtModules_Path=1
+mtModules_Path0="Path"
+Count mtProcesses_ID=1
+mtProcesses_ID0="ID"
+Count mtProcesses_Name=1
+mtProcesses_Name0="Name"
+Count mtProcesses_Description=1
+mtProcesses_Description0="Description"
+Count mtProcesses_Version=1
+mtProcesses_Version0="Version"
+Count mtProcesses_Memory=1
+mtProcesses_Memory0="Memory"
+Count mtProcesses_Priority=1
+mtProcesses_Priority0="Priority"
+Count mtProcesses_Threads=1
+mtProcesses_Threads0="Threads"
+Count mtProcesses_Path=1
+mtProcesses_Path0="Path"
+Count mtCPU_Registers=1
+mtCPU_Registers0="Registers"
+Count mtCPU_Stack=1
+mtCPU_Stack0="Stack"
+Count mtCPU_MemoryDump=1
+mtCPU_MemoryDump0="Memory Dump"
+Count mtSend_SuccessMsg=1
+mtSend_SuccessMsg0="The message was sent successfully."
+Count mtSend_FailureMsg=1
+mtSend_FailureMsg0="Sorry, sending the message didn't work."
+Count mtSend_BugClosedMsg=2
+mtSend_BugClosedMsg0="These BUG is just closed."
+mtSend_BugClosedMsg1="Contact the program support to obtain an update."
+Count mtSend_UnknownErrorMsg=1
+mtSend_UnknownErrorMsg0="Unknown error."
+Count mtSend_InvalidLoginMsg=1
+mtSend_InvalidLoginMsg0="Invalid login request."
+Count mtSend_InvalidSearchMsg=1
+mtSend_InvalidSearchMsg0="Invalid search request."
+Count mtSend_InvalidSelectionMsg=1
+mtSend_InvalidSelectionMsg0="Invalid selection request."
+Count mtSend_InvalidInsertMsg=1
+mtSend_InvalidInsertMsg0="Invalid insert request."
+Count mtSend_InvalidModifyMsg=1
+mtSend_InvalidModifyMsg0="Invalid modify request."
+Count mtFileCrackedMsg=2
+mtFileCrackedMsg0="This file is cracked."
+mtFileCrackedMsg1="The application will be closed."
+Count mtException_LeakMultiFree=1
+mtException_LeakMultiFree0="Multi Free memory leak."
+Count mtException_LeakMemoryOverrun=1
+mtException_LeakMemoryOverrun0="Memory Overrun leak."
+Count mtException_AntiFreeze=1
+mtException_AntiFreeze0="The application seems to be frozen."
+Count mtInvalidEmailMsg=1
+mtInvalidEmailMsg0="Invalid email."
+TextsCollection=English
+EurekaLog Last Line -->

File Proj/asobjprovider.res

Binary file added.

File Src/ASProvider.pas

+unit ASProvider;
+
+interface
+
+uses
+  SysUtils, Classes, DB, DBClient, Provider;
+
+type
+  TASCustomProvider = class(TBaseProvider)
+  private
+    FActive: Boolean;
+    FStreamedActive: Boolean;
+    FClass: TClass;
+    FObject: TObject;
+    FDataSet: TCustomClientDataSet;
+    FDSWriter: TDataPacketWriter;
+    FFieldDefs: TFieldDefs;
+
+  private
+    function GetDataSet: TCustomClientDataSet;
+    function GetDSWriter: TDataPacketWriter;
+    function GetFieldDefs: TFieldDefs;
+    procedure SetFieldDefs(const Value: TFieldDefs);
+    procedure SetActive(const Value: Boolean);
+
+  protected
+    procedure SetProvidedClass(const Value: TClass); virtual;
+    function GetProvidedClass: TClass; virtual;
+    procedure SetProvidedObject(const Value: TObject); virtual;
+    function GetProvidedObject: TObject; virtual;
+
+    function CreateResolver: TCustomResolver; override;
+    procedure CreateDataPacket(PacketOpts: TGetRecordOptions;
+      ProvOpts: TProviderOptions; var RecsOut: Integer; var Data: OleVariant); override;
+
+  protected
+    procedure Loaded; override;
+    procedure ExtractMetaData;
+    procedure ExtractData;
+
+    function CreateDataSet: TCustomClientDataSet; virtual;
+    property DataSet: TCustomClientDataSet read GetDataSet;
+    property DSWriter: TDataPacketWriter read GetDSWriter;
+
+  public
+    constructor Create; overload;
+    constructor Create(AOwner: TComponent); overload; override;
+    destructor Destroy; override;
+
+    procedure Open;
+    procedure Close;
+
+    property Active: Boolean read FActive write SetActive;
+    property ProvidedClass: TClass read GetProvidedClass write SetProvidedClass;
+    property ProvidedObject: TObject read GetProvidedObject write SetProvidedObject;
+    property FieldDefs: TFieldDefs read GetFieldDefs write SetFieldDefs;
+  end;
+
+  TASProvider = class(TASCustomProvider)
+  end;
+
+  TASGenericProvider<T: class> = class(TASCustomProvider)
+  private
+    FTypedObject: T;
+
+  protected
+    procedure SetProvidedClass(const Value: TClass); override;
+
+    function GetProvidedTypedObject: T;
+    procedure SetProvidedTypedObject(const Value: T);
+
+    property ProvidedObject;
+
+  public
+    property ProvidedTypedObject: T read GetProvidedTypedObject write SetProvidedTypedObject;
+  end;
+
+  TASComponentProvider = class(TASGenericProvider<TComponent>)
+  private
+    function GetProvidedComponent: TComponent;
+    procedure SetProvidedComponent(const Value: TComponent);
+
+  protected
+    property ProvidedTypedObject;
+
+  published
+    property Active;
+    property ProvidedComponent: TComponent read GetProvidedComponent write SetProvidedComponent;
+    property FieldDefs;
+  end;
+
+  TASResolver = class(TCustomResolver)
+  protected
+    procedure DoUpdate(Tree: TUpdateTree); override;
+    procedure DoDelete(Tree: TUpdateTree); override;
+    procedure DoInsert(Tree: TUpdateTree); override;
+    procedure InitializeConflictBuffer(Tree: TUpdateTree); override;
+  public
+    procedure InitTreeData(Tree: TUpdateTree); override;
+  end;
+
+procedure Register;
+
+implementation
+
+uses
+  Forms, Rtti, TypInfo, Variants, CodeSiteLogging, ASDebug;
+
+procedure Register;
+begin
+  RegisterComponents('ASTEKK', [TASProvider, TASComponentProvider]);
+end;
+
+{ TASCustomProvider }
+
+procedure TASCustomProvider.Close;
+begin
+  Active := False;
+end;
+
+constructor TASCustomProvider.Create(AOwner: TComponent);
+begin
+  inherited;
+  FFieldDefs := DefaultFieldDefsClass.Create(DataSet);
+end;
+
+constructor TASCustomProvider.Create;
+begin
+  Create(Application);
+end;
+
+procedure TASCustomProvider.CreateDataPacket(PacketOpts: TGetRecordOptions; ProvOpts: TProviderOptions;
+  var RecsOut: Integer; var Data: OleVariant);
+begin
+  with DSWriter do begin
+    PacketOptions := PacketOpts;
+    Options := ProvOpts;
+    GetDataPacket(DataSet, RecsOut, Data);
+  end;
+end;
+
+function TASCustomProvider.CreateDataSet: TCustomClientDataSet;
+begin
+  Result := TClientDataSet.Create(Self);
+end;
+
+function TASCustomProvider.CreateResolver: TCustomResolver;
+begin
+  Result := TASResolver.Create(Self);
+end;
+
+destructor TASCustomProvider.Destroy;
+begin
+  FreeAndNil(FDSWriter);
+  FreeAndNil(FFieldDefs);
+  FreeAndNil(FDataSet);
+
+  inherited;
+end;
+
+procedure TASCustomProvider.ExtractData;
+var
+  Ctx: TRttiContext;
+  T: TRttiType;
+  P: TRttiProperty;
+  F: TField;
+  R: Boolean;
+
+begin
+  DataSet.Active := False;
+  DataSet.FieldDefs := FieldDefs;
+  DataSet.CreateDataSet;
+
+  if not Assigned(FObject) then
+    Exit;
+
+  Ctx := TRttiContext.Create;
+  try
+    T := Ctx.GetType(ProvidedClass);
+    DataSet.Insert;
+    try
+      for F in DataSet.Fields do begin
+        P := T.GetProperty(F.FieldName);
+        if Assigned(P) then begin
+          R := F.ReadOnly;
+          if R then
+            F.ReadOnly := False;
+
+          F.Value := P.GetValue(GetProvidedObject).AsVariant;
+
+          if R then
+            F.ReadOnly := True;
+//          CodeSite.Send('Set value %s = %s', [F.FieldName, VarToStr(P.GetValue(ProvidedObject).AsVariant)]);
+        end;
+      end;
+
+      DataSet.Post;
+    except
+      DataSet.Cancel;
+      raise;
+    end;
+  finally
+    Ctx.Free;
+  end;
+end;
+
+procedure TASCustomProvider.ExtractMetaData;
+var
+  Ctx: TRttiContext;
+  T: TRttiType;
+  P: TRttiProperty;
+  F: TFieldType;
+
+  function RttiTypeToFieldType(T: TRttiType): TFieldType;
+  const
+    type_map: array[TTypeKind] of TFieldType = (
+      ftUnknown,          //    tkUnknown
+      ftInteger,          //    tkInteger
+      ftFixedChar,        //    tkChar
+      ftUnknown,          //    tkEnumeration
+      ftFloat,            //    tkFloat
+      ftString,           //    tkString
+      ftUnknown,          //    tkSet
+      ftUnknown,          //    tkClass
+      ftUnknown,          //    tkMethod
+      ftFixedWideChar,    //    tkWChar
+      ftString,           //    tkLString
+      ftWideString,       //    tkWString
+      ftVariant,          //    tkVariant
+      ftArray,            //    tkArray
+      ftUnknown,          //    tkRecord
+      ftUnknown,          //    tkInterface
+      ftUnknown,          //    tkInt64
+      ftUnknown,          //    tkDynArray
+      ftWideString,       //    tkUString
+      ftUnknown,          //    tkClassRef
+      ftUnknown,          //    tkPointer
+      ftUnknown           //    tkProcedure
+    );
+
+    {
+    Available field types:
+      ftString, ftSmallint, ftInteger, ftWord, // 0..4
+      ftBoolean, ftFloat, ftCurrency, ftBCD, ftDate, ftTime, ftDateTime, // 5..11
+      ftBytes, ftVarBytes, ftAutoInc, ftBlob, ftMemo, ftGraphic, ftFmtMemo, // 12..18
+      ftParadoxOle, ftDBaseOle, ftTypedBinary, ftCursor, ftFixedChar, ftWideString, // 19..24
+      ftLargeint, ftADT, ftArray, ftReference, ftDataSet, ftOraBlob, ftOraClob, // 25..31
+      ftVariant, ftInterface, ftIDispatch, ftGuid, ftTimeStamp, ftFMTBcd, // 32..37
+      ftFixedWideChar, ftWideMemo, ftOraTimeStamp, ftOraInterval, // 38..41
+      ftLongWord, ftShortint, ftByte, ftExtended, ftConnection, ftParams, ftStream, //42..48
+      ftTimeStampOffset, ftObject, ftSingle
+    }
+
+  begin
+    Result := type_map[T.TypeKind];
+  end;
+
+  function fullName(T: TRttiObject): string;
+  begin
+    Result := '';
+
+    if T is TRttiNamedObject then
+      Result := (T as TRttiNamedObject).Name;
+
+    if Assigned(T.Parent) then
+      Result := fullName(T.Parent) + '.' + Result;
+  end;
+
+begin
+  FieldDefs.Clear;
+
+  if not Assigned(FClass) then
+    Exit;
+
+  Ctx := TRttiContext.Create;
+  try
+    T := Ctx.GetType(ProvidedClass);
+    FieldDefs.BeginUpdate;
+    try
+      for P in T.GetProperties do begin
+        if not ((P.Visibility in [mvPublic, mvPublished]) and P.IsReadable) then
+          Continue;
+
+        F := RttiTypeToFieldType(P.PropertyType);
+        if F = ftUnknown then
+          Continue;
+
+        if FieldDefs.IndexOf(P.Name) >= 0 then
+          Continue;
+
+//        CodeSite.Send('Add field ''%s'' (%s) [%s] as %s', [P.Name, P.PropertyType.Name, fullName(P), GetEnumName(TypeInfo(TFieldType), Integer(F))]);
+        with FieldDefs.AddFieldDef do try
+          Name := P.Name;
+          DataType := F;
+          if F in [ftString, ftWideString] then
+            Size := 20;
+
+          if not P.IsWritable then
+            Attributes := [faReadonly];
+        except
+          Free;
+          raise;
+        end;
+      end;
+    finally
+      FieldDefs.EndUpdate;
+    end;
+  finally
+    Ctx.Free;
+  end;
+end;
+
+function TASCustomProvider.GetDataSet: TCustomClientDataSet;
+begin
+  if not Assigned(FDataSet) then
+    FDataSet := CreateDataSet;
+
+  Result := FDataSet;
+end;
+
+function TASCustomProvider.GetDSWriter: TDataPacketWriter;
+begin
+  if not Assigned(FDSWriter) then
+    FDSWriter := TDataPacketWriter.Create;
+
+  Result := FDSWriter;
+end;
+
+function TASCustomProvider.GetFieldDefs: TFieldDefs;
+begin
+  Result := FFieldDefs;
+end;
+
+function TASCustomProvider.GetProvidedClass: TClass;
+begin
+  Result := FClass;
+end;
+
+function TASCustomProvider.GetProvidedObject: TObject;
+begin
+  Result := FObject;
+end;
+
+procedure TASCustomProvider.Loaded;
+begin
+  inherited;
+  try
+    Active := FStreamedActive;
+{$IFDEF DEBUG}
+  except
+    on E: Exception do ApplicationShowException(E);
+{$ELSE}
+  finally
+{$ENDIF}
+  end;
+end;
+
+procedure TASCustomProvider.Open;
+begin
+  Active := True;
+end;
+
+procedure TASCustomProvider.SetActive(const Value: Boolean);
+begin
+  if csReading in ComponentState then
+    FStreamedActive := Value
+  else if Active <> Value then begin
+    if Value then begin
+      ExtractMetaData;
+      ExtractData;
+    end;
+
+    FActive := Value;
+  end;
+end;
+
+procedure TASCustomProvider.SetFieldDefs(const Value: TFieldDefs);
+begin
+  FFieldDefs.Assign(Value);
+end;
+
+procedure TASCustomProvider.SetProvidedClass(const Value: TClass);
+begin
+  FClass := Value;
+
+  if Active then
+    ExtractMetaData;
+end;
+
+procedure TASCustomProvider.SetProvidedObject(const Value: TObject);
+begin
+  if not Assigned(FClass) and Assigned(Value) then
+    ProvidedClass := Value.ClassType;
+
+  if Assigned(Value) and not Value.InheritsFrom(ProvidedClass) then
+    raise EArgumentException.CreateFmt(
+      '%s can not provide %s. It does not inherit from %s.',
+      [
+        ClassName, Value.ClassName, ProvidedClass.ClassName
+      ]
+    );
+
+  FObject := Value;
+
+  if Active then
+    ExtractData;
+end;
+
+{ TASResolver }
+
+procedure TASResolver.DoDelete(Tree: TUpdateTree);
+begin
+
+end;
+
+procedure TASResolver.DoInsert(Tree: TUpdateTree);
+begin
+
+end;
+
+procedure TASResolver.DoUpdate(Tree: TUpdateTree);
+begin
+
+end;
+
+procedure TASResolver.InitializeConflictBuffer(Tree: TUpdateTree);
+begin
+
+end;
+
+procedure TASResolver.InitTreeData(Tree: TUpdateTree);
+begin
+  Tree.Source := (Provider as TASCustomProvider).DataSet;
+end;
+
+{ TASGenericProvider<T> }
+
+function TASGenericProvider<T>.GetProvidedTypedObject: T;
+begin
+  Result := FTypedObject;
+  CodeSite.Send('GetProvidedObject', Result);
+  TASDebug.OutputDebugStringFmt('GetProvidedObject: %s', [TValue.From<T>(Result).ToString]);
+end;
+
+procedure TASGenericProvider<T>.SetProvidedClass(const Value: TClass);
+begin
+  TASDebug.OutputDebugStringFmt('SetProvidedClass: %s', [TValue.From<TClass>(Value).ToString]);
+  if Assigned(Value) and not Value.InheritsFrom(T) then
+    raise EArgumentException.CreateFmt(
+      '%s can not provide a %s. It does not inherit from %s.',
+      [
+        ClassName, Value.ClassName, T.ClassName
+      ]
+    );
+
+  inherited;
+end;
+
+procedure TASGenericProvider<T>.SetProvidedTypedObject(const Value: T);
+begin
+  CodeSite.Send('SetProvidedObject', Value);
+  TASDebug.OutputDebugStringFmt('SetProvidedObject: %s', [TValue.From<T>(Value).ToString]);
+  FTypedObject := Value;
+  SetProvidedObject(Value);
+end;
+
+{ TASComponentProvider }
+
+function TASComponentProvider.GetProvidedComponent: TComponent;
+begin
+  Result := GetProvidedTypedObject;
+end;
+
+procedure TASComponentProvider.SetProvidedComponent(const Value: TComponent);
+begin
+  SetProvidedTypedObject(Value);
+end;
+
+end.
+

File Test/TestASProvider.pas

+unit TestASProvider;
+{
+
+  Delphi DUnit Test Case
+  ----------------------
+  This unit contains a skeleton test case class generated by the Test Case Wizard.
+  Modify the generated code to correctly setup and call the methods from the unit 
+  being tested.
+
+}
+
+interface
+
+uses
+  Classes, SysUtils, TestFramework, DB, DBClient, Provider, ASProvider;
+
+type
+  TTestData = class
+  private
+    Fstring: string;
+    FroString: string;
+    Fint: Integer;
+  public
+    property Astring: string read Fstring write Fstring;
+    property AroString: string read FroString;
+    property Aint: Integer read Fint write Fint;
+  end;
+
+  TExpectFieldDef = record
+    Idx: Integer;
+    Name: string;
+    Size: Integer;
+    DataType: TFieldType;
+    Attr: TFieldAttributes;
+  end;
+
+  // Test methods for class TASCustomProvider
+
+  TestTASProviders<T: TASCustomProvider, constructor> = class(TTestCase)
+  strict private
+    FASCustomProvider: T;
+  protected
+    procedure CheckFieldDef(Expect: TExpectFieldDef);
+  public
+    procedure SetUp; override;
+    procedure TearDown; override;
+  published
+    procedure TestProvidedClass;
+    procedure TestMetaData;
+    procedure TestData;
+
+  end;
+
+
+  // Test methods for class TASResolver
+
+  TestTASResolver = class(TTestCase)
+  strict private
+    FASResolver: TASResolver;
+    FASCustomProvider: TASCustomProvider;
+  public
+    procedure SetUp; override;
+    procedure TearDown; override;
+  published
+    procedure TestInitTreeData;
+  end;
+
+const
+  expect_fields: array[1..3] of TExpectFieldDef = (
+    (Idx: 0; Name: 'Astring';   Size: 20; DataType: ftWideString; Attr: []),
+    (Idx: 1; Name: 'AroString'; Size: 20; DataType: ftWideString; Attr: [faReadonly]),
+    (Idx: 2; Name: 'Aint';      Size: 0;  DataType: ftInteger;    Attr: [])
+  );
+
+implementation
+
+uses
+  Forms, Rtti;
+
+procedure TestTASProviders<T>.CheckFieldDef(Expect: TExpectFieldDef);
+var
+  S: string;
+begin
+  S := Format('Field #%d ', [Expect.Idx]);
+  with FASCustomProvider.FieldDefs[Expect.Idx] do begin
+    CheckEqualsString(Expect.Name, Name, S + 'name');
+    CheckEquals(Expect.Size, Size, S + 'size');
+    Check(Expect.DataType = DataType,
+      Format(
+        S + 'expected field type ''%s'' <> actual field type ''%s''',
+        [
+          FieldTypeNames[Expect.DataType],
+          FieldTypeNames[DataType]
+        ]
+      )
+    );
+    Check(Expect.Attr = Attributes,
+      Format(
+        S + 'attributes missmatch; missing attributes %s; unexpected attributes %s',
+        [
+          TValue.From<TFieldAttributes>(Expect.Attr - Attributes).ToString,
+          TValue.From<TFieldAttributes>(Attributes - Expect.Attr).ToString
+        ]
+      )
+    );
+  end;
+end;
+
+procedure TestTASProviders<T>.SetUp;
+begin
+  FASCustomProvider := T.Create;
+end;
+
+procedure TestTASProviders<T>.TearDown;
+begin
+  FASCustomProvider.Free;
+  FASCustomProvider := nil;
+end;
+
+procedure TestTASProviders<T>.TestData;
+var
+  Obj: TTestData;
+  DS: TClientDataSet;
+begin
+  Obj := TTestData.Create;
+  DS := TClientDataSet.Create(Application);
+  try
+    with Obj do begin
+      FroString := 'a ro string';
+      Astring := 'a string';
+      Aint := 5;
+    end;
+
+    FASCustomProvider.ProvidedObject := Obj;
+    FASCustomProvider.Name := 'TestProvider';
+
+    DS.ProviderName := 'TestProvider';
+    DS.Active := True;
+
+    CheckEquals(1, DS.RecordCount, 'Record count');
+    CheckEqualsString('a ro string', DS.FieldByName('AroString').AsString);
+    CheckEqualsString('a string', DS.FieldByName('Astring').AsString);
+    CheckEquals(5, DS.FieldByName('Aint').AsInteger, 'Aint field');
+  finally
+    Obj.Free;
+    DS.Free;
+  end;
+end;
+
+procedure TestTASProviders<T>.TestMetaData;
+var
+  I: Integer;
+
+begin
+  FASCustomProvider.ProvidedClass := TTestData;
+  CheckEquals(TTestData, FASCustomProvider.ProvidedClass, 'Provided class');
+  CheckEquals(High(expect_fields), FASCustomProvider.FieldDefs.Count, 'Unexpected number of field defs');
+
+  for I := Low(expect_fields) to High(expect_fields) do
+    CheckFieldDef(expect_fields[I]);
+end;
+
+procedure TestTASProviders<T>.TestProvidedClass;
+begin
+  if not T.ClassNameIs('TASCustomProvider') then
+    ExpectedException := EArgumentException;
+  FASCustomProvider.ProvidedClass := Self.ClassType;
+end;
+
+procedure TestTASResolver.SetUp;
+begin
+  FASCustomProvider := TASCustomProvider.Create(nil);
+  FASResolver := TASResolver.Create(FASCustomProvider);
+end;
+
+procedure TestTASResolver.TearDown;
+begin
+  FASResolver.Free;
+  FASResolver := nil;