From 895f496507c283e8dcceccdc9e892544348f4fc4 Mon Sep 17 00:00:00 2001 From: Mark van Renswoude Date: Sun, 18 May 2014 18:09:07 +0000 Subject: [PATCH] Initial commit --- NamedPipeClient/X2LogNamedPipeClient.dpr | 18 + NamedPipeClient/X2LogNamedPipeClient.dproj | 178 +++++++++ NamedPipeClient/X2LogNamedPipeClient.res | Bin 0 -> 298600 bytes NamedPipeClient/source/MainFrm.dfm | 27 ++ NamedPipeClient/source/MainFrm.pas | 243 ++++++++++++ Test/X2LogTest.dpr | 27 ++ Test/X2LogTest.dproj | 201 ++++++++++ Test/X2LogTest.res | Bin 0 -> 298600 bytes Test/source/MainFrm.dfm | 155 ++++++++ Test/source/MainFrm.pas | 167 ++++++++ X2Log.Constants.pas | 89 +++++ X2Log.Exception.Default.pas | 30 ++ X2Log.Exception.madExcept.pas | 35 ++ X2Log.Intf.pas | 45 +++ X2Log.Observer.Custom.pas | 52 +++ X2Log.Observer.CustomThreaded.pas | 235 ++++++++++++ X2Log.Observer.Event.pas | 50 +++ X2Log.Observer.LogFile.pas | 185 +++++++++ X2Log.Observer.NamedPipe.pas | 422 +++++++++++++++++++++ X2Log.groupproj | 48 +++ X2Log.pas | 134 +++++++ 21 files changed, 2341 insertions(+) create mode 100644 NamedPipeClient/X2LogNamedPipeClient.dpr create mode 100644 NamedPipeClient/X2LogNamedPipeClient.dproj create mode 100644 NamedPipeClient/X2LogNamedPipeClient.res create mode 100644 NamedPipeClient/source/MainFrm.dfm create mode 100644 NamedPipeClient/source/MainFrm.pas create mode 100644 Test/X2LogTest.dpr create mode 100644 Test/X2LogTest.dproj create mode 100644 Test/X2LogTest.res create mode 100644 Test/source/MainFrm.dfm create mode 100644 Test/source/MainFrm.pas create mode 100644 X2Log.Constants.pas create mode 100644 X2Log.Exception.Default.pas create mode 100644 X2Log.Exception.madExcept.pas create mode 100644 X2Log.Intf.pas create mode 100644 X2Log.Observer.Custom.pas create mode 100644 X2Log.Observer.CustomThreaded.pas create mode 100644 X2Log.Observer.Event.pas create mode 100644 X2Log.Observer.LogFile.pas create mode 100644 X2Log.Observer.NamedPipe.pas create mode 100644 X2Log.groupproj create mode 100644 X2Log.pas diff --git a/NamedPipeClient/X2LogNamedPipeClient.dpr b/NamedPipeClient/X2LogNamedPipeClient.dpr new file mode 100644 index 0000000..5503192 --- /dev/null +++ b/NamedPipeClient/X2LogNamedPipeClient.dpr @@ -0,0 +1,18 @@ +program X2LogNamedPipeClient; + +uses + Vcl.Forms, + MainFrm in 'source\MainFrm.pas' {MainForm}, + X2Log.Intf in '..\X2Log.Intf.pas'; + +{$R *.res} + +var + MainForm: TMainForm; + +begin + Application.Initialize; + Application.MainFormOnTaskbar := True; + Application.CreateForm(TMainForm, MainForm); + Application.Run; +end. diff --git a/NamedPipeClient/X2LogNamedPipeClient.dproj b/NamedPipeClient/X2LogNamedPipeClient.dproj new file mode 100644 index 0000000..eb8409d --- /dev/null +++ b/NamedPipeClient/X2LogNamedPipeClient.dproj @@ -0,0 +1,178 @@ + + + {883FC03C-9DB1-43A5-8053-5C920FDBCCAC} + 13.4 + VCL + X2LogNamedPipeClient.dpr + True + Debug + Win32 + 1 + Application + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_1 + true + true + + + true + Base + true + + + fmx;IndySystem;DBXInterBaseDriver;DataSnapClient;DataSnapCommon;DataSnapServer;DataSnapProviderClient;DbxCommonDriver;dbxcds;DBXOracleDriver;CustomIPTransport;dsnap;fmxase;IndyCore;inetdbxpress;IPIndyImpl;bindcompfmx;rtl;dbrtl;DbxClientDriver;bindcomp;inetdb;xmlrtl;ibxpress;IndyProtocols;DBXMySQLDriver;soaprtl;bindengine;DBXInformixDriver;DBXFirebirdDriver;inet;fmxobj;DBXSybaseASADriver;fmxdae;dbexpress;DataSnapIndy10ServerTransport;$(DCC_UsePackage) + $(BDS)\bin\delphi_PROJECTICON.ico + System;Xml;Data;Datasnap;Web;Soap;Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;$(DCC_Namespace) + CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= + 1043 + None + lib + bin + + + dxdborRS16;cxLibraryRS16;dxLayoutControlRS16;dxPScxPivotGridLnkRS16;dxCoreRS16;cxExportRS16;dxBarRS16;cxSpreadSheetRS16;cxTreeListdxBarPopupMenuRS16;TeeDB;dxDBXServerModeRS16;dxPsPrVwAdvRS16;vclib;dxPSCoreRS16;cxPivotGridOLAPRS16;dxPScxTLLnkRS16;dxPScxGridLnkRS16;cxPageControlRS16;dxRibbonRS16;DBXSybaseASEDriver;vclimg;cxTreeListRS16;dxComnRS16;vcldb;dxADOServerModeRS16;vcldsnap;dxBarExtDBItemsRS16;DBXDb2Driver;vcl;DBXMSSQLDriver;cxDataRS16;cxBarEditItemRS16;dxDockingRS16;dxPSDBTeeChartRS16;cxPageControldxBarPopupMenuRS16;webdsnap;dxBarExtItemsRS16;dxPSLnksRS16;dxPSTeeChartRS16;adortl;dxPSdxLCLnkRS16;dxorgcRS16;dxWizardControlRS16;dxPScxExtCommonRS16;dxNavBarRS16;dxPSdxDBOCLnkRS16;cxSchedulerTreeBrowserRS16;Tee;DBXOdbcDriver;dxdbtrRS16;dxPScxSSLnkRS16;dxPScxCommonRS16;dxmdsRS16;dxPSPrVwRibbonRS16;cxGridRS16;cxEditorsRS16;TeeUI;vclactnband;dxServerModeRS16;bindcompvcl;cxPivotGridRS16;dxPScxSchedulerLnkRS16;dxPSdxDBTVLnkRS16;vclie;cxSchedulerRibbonStyleEventEditorRS16;cxSchedulerRS16;vcltouch;websnap;VclSmp;dxTabbedMDIRS16;DataSnapConnectors;dxPSdxOCLnkRS16;dsnapcon;dxPSdxFCLnkRS16;dxThemeRS16;dxPScxPCProdRS16;vclx;dxFlowChartRS16;dxGDIPlusRS16;dxBarDBNavRS16;$(DCC_UsePackage) + + + dxdborRS16;cxLibraryRS16;dxLayoutControlRS16;dxPScxPivotGridLnkRS16;dxCoreRS16;cxExportRS16;dxBarRS16;cxSpreadSheetRS16;cxTreeListdxBarPopupMenuRS16;TeeDB;dxDBXServerModeRS16;dxPsPrVwAdvRS16;vclib;inetdbbde;dxPSCoreRS16;cxPivotGridOLAPRS16;dxPScxTLLnkRS16;dxPScxGridLnkRS16;cxPageControlRS16;dxRibbonRS16;DBXSybaseASEDriver;vclimg;fmi;cxTreeListRS16;dxComnRS16;vcldb;dxADOServerModeRS16;vcldsnap;dxBarExtDBItemsRS16;X2CLGL;DBXDb2Driver;vcl;CloudService;DBXMSSQLDriver;CodeSiteExpressPkg;FmxTeeUI;cxDataRS16;cxBarEditItemRS16;dxDockingRS16;dxPSDBTeeChartRS16;cxPageControldxBarPopupMenuRS16;cxSchedulerGridRS16;webdsnap;X2CLMB;dxBarExtItemsRS16;dxPSLnksRS16;OmniThreadLibraryRuntimeXE2;dxtrmdRS16;dxPSTeeChartRS16;adortl;dxPSdxLCLnkRS16;madBasic_;dxorgcRS16;dxWizardControlRS16;dxPScxExtCommonRS16;vcldbx;dxNavBarRS16;dxPSdxDBOCLnkRS16;cxSchedulerTreeBrowserRS16;Tee;DBXOdbcDriver;dxdbtrRS16;madDisAsm_;svnui;dxPScxSSLnkRS16;dxPScxCommonRS16;dxmdsRS16;dxPSPrVwRibbonRS16;cxPivotGridChartRS16;cxGridRS16;cxEditorsRS16;FMXTee;TeeUI;vclactnband;dxServerModeRS16;bindcompvcl;cxPivotGridRS16;dxPScxSchedulerLnkRS16;dxPSdxDBTVLnkRS16;vclie;cxSchedulerRibbonStyleEventEditorRS16;cxSchedulerRS16;madExcept_;vcltouch;websnap;VclSmp;dxTabbedMDIRS16;DataSnapConnectors;dxPSdxOCLnkRS16;dsnapcon;dxPSdxFCLnkRS16;dxThemeRS16;dxPScxPCProdRS16;vclx;svn;dxFlowChartRS16;bdertl;VirtualTreesR;dxGDIPlusRS16;dxBarDBNavRS16;$(DCC_UsePackage) + true + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + 1033 + $(BDS)\bin\default_app.manifest + CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= + + + DEBUG;$(DCC_Define) + false + true + true + true + + + true + 1033 + false + + + false + RELEASE;$(DCC_Define) + 0 + false + + + + MainSource + + +
MainForm
+ dfm +
+ + + Cfg_2 + Base + + + Base + + + Cfg_1 + Base + +
+ + Delphi.Personality.12 + + + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1043 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + X2LogNamedPipeClient.dpr + + + JVCL Application and Form Components + JVCL Band Objects + JVCL BDE Components + JVCL Non-Visual Components + JVCL Visual Controls + JVCL Core Components + JVCL Encryption and Compression + JVCL Custom Controls + JVCL Database Components + JVCL Dialog Components + JVCL Docking Components + JVCL DotNet Controls + JVCL Globus Components + JVCL HMI Controls + JVCL Jans Components + JVCL Managed Threads + JVCL Multimedia and Image Components + JVCL Network Components + JVCL Page Style Components + JVCL Interpreter Components + JVCL Plugin Components + JVCL Print Preview Components + JVCL Runtime Design Components + JVCL Standard Controls + JVCL System Components + JVCL Time Framework + JVCL Wizard + JVCL XP Controls + + + + + False + True + + + 12 + + + +
diff --git a/NamedPipeClient/X2LogNamedPipeClient.res b/NamedPipeClient/X2LogNamedPipeClient.res new file mode 100644 index 0000000000000000000000000000000000000000..c287ee9863dccfc9aa3b7e6b7563332879c2b5b1 GIT binary patch literal 298600 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 literal 0 HcmV?d00001 diff --git a/NamedPipeClient/source/MainFrm.dfm b/NamedPipeClient/source/MainFrm.dfm new file mode 100644 index 0000000..b9ae385 --- /dev/null +++ b/NamedPipeClient/source/MainFrm.dfm @@ -0,0 +1,27 @@ +object MainForm: TMainForm + Left = 0 + Top = 0 + Caption = 'X'#178'Log Named Pipe Client' + ClientHeight = 443 + ClientWidth = 552 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + OldCreateOrder = False + OnCreate = FormCreate + PixelsPerInch = 96 + TextHeight = 13 + object mmoLog: TMemo + Left = 0 + Top = 0 + Width = 552 + Height = 443 + Align = alClient + ReadOnly = True + ScrollBars = ssVertical + TabOrder = 0 + end +end diff --git a/NamedPipeClient/source/MainFrm.pas b/NamedPipeClient/source/MainFrm.pas new file mode 100644 index 0000000..e0d0f07 --- /dev/null +++ b/NamedPipeClient/source/MainFrm.pas @@ -0,0 +1,243 @@ +unit MainFrm; + +interface +uses + Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, + Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls; + + +type + TMainForm = class(TForm) + mmoLog: TMemo; + + procedure FormCreate(Sender: TObject); + private + FClientThread: TThread; + + procedure DoMessage(Sender: TObject; Msg: TStream); + end; + + +implementation +uses + System.SyncObjs, + + X2Log.Intf; + + +{$R *.dfm} + + +type + TClientMessageEvent = procedure(Sender: TObject; Msg: TStream) of object; + + TClientThread = class(TThread) + private + FTerminateEvent: TEvent; + FPipe: THandle; + FOverlappedRead: TOverlapped; + FReadBuffer: array[0..4095] of Byte; + FMessage: TMemoryStream; + FOnMessage: TClientMessageEvent; + protected + procedure Execute; override; + procedure TerminatedSet; override; + + procedure ReadMessage; + procedure HandleMessage; + + procedure DoMessage; + public + constructor Create; + destructor Destroy; override; + + property OnMessage: TClientMessageEvent read FOnMessage write FOnMessage; + end; + + +{ TMainForm } +procedure TMainForm.FormCreate(Sender: TObject); +begin + FClientThread := TClientThread.Create; + (FClientThread as TClientThread).OnMessage := DoMessage; +end; + + +procedure TMainForm.DoMessage(Sender: TObject; Msg: TStream); + + function ReadString: string; + var + size: Cardinal; + + begin + Msg.ReadBuffer(size, SizeOf(cardinal)); + if size > 0 then + begin + SetLength(Result, size); + Msg.ReadBuffer(Result[1], size * SizeOf(Char)); + end else + Result := ''; + end; + +var + level: TX2LogLevel; + logMsg: string; + detail: string; + +begin + Msg.ReadBuffer(level, SizeOf(TX2LogLevel)); + logMsg := ReadString; + detail := ReadString; + + mmoLog.Lines.Add(logMsg + ' (' + detail + ')'); +end; + + +const + FILE_WRITE_ATTRIBUTES = $0100; + +{ TClientThread } +constructor TClientThread.Create; +begin + FTerminateEvent := TEvent.Create(nil, True, False, ''); + FMessage := TMemoryStream.Create; + + inherited Create(False); +end; + +destructor TClientThread.Destroy; +begin + FreeAndNil(FMessage); + FreeAndNil(FTerminateEvent); + + inherited Destroy; +end; + + +procedure TClientThread.Execute; +var + mode: Cardinal; + readEvent: TEvent; + events: array[0..1] of THandle; + waitResult: Cardinal; + bytesTransferred: Cardinal; + +begin + while not Terminated do + begin + FPipe := CreateFile('\\.\pipe\X2LogTest', GENERIC_READ or FILE_WRITE_ATTRIBUTES, + 0, nil, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0); + + if FPipe = INVALID_HANDLE_VALUE then + begin + if GetLastError = ERROR_PIPE_BUSY then + begin + if not WaitNamedPipe('\\.\pipe\X2LogTest', 5000) then + exit; + end else + RaiseLastOSError; + end else + break; + end; + + if Terminated then + exit; + + mode := PIPE_READMODE_MESSAGE; + if not SetNamedPipeHandleState(FPipe, mode, nil, nil) then + exit; + + readEvent := TEvent.Create(nil, False, False, ''); + events[0] := FTerminateEvent.Handle; + events[1] := readEvent.Handle; + + FOverlappedRead.hEvent := readEvent.Handle; + ReadMessage; + + while not Terminated do + begin + waitResult := WaitForMultipleObjects(Length(events), @events, False, INFINITE); + + case waitResult of + WAIT_OBJECT_0: + { Terminated } + break; + + WAIT_OBJECT_0 + 1: + { Read event completed } + if GetOverlappedResult(FPipe, FOverlappedRead, bytesTransferred, False) then + begin + FMessage.WriteBuffer(FReadBuffer[0], bytesTransferred); + HandleMessage; + ReadMessage; + end else + begin + if GetLastError = ERROR_MORE_DATA then + begin + FMessage.WriteBuffer(FReadBuffer[0], bytesTransferred); + ReadMessage; + end else + break; + end; + end; + end; + + CloseHandle(FPipe); +end; + + +procedure TClientThread.ReadMessage; +var + bytesRead: Cardinal; + lastError: Cardinal; + +begin + while True do + begin + if ReadFile(FPipe, FReadBuffer, SizeOf(FReadBuffer), bytesRead, @FOverlappedRead) then + begin + { Immediate result } + FMessage.WriteBuffer(FReadBuffer[0], bytesRead); + HandleMessage; + end else + begin + { More data, pending I/O or an actual error } + lastError := GetLastError; + + if lastError = ERROR_IO_PENDING then + break + else if lastError = ERROR_MORE_DATA then + FMessage.WriteBuffer(FReadBuffer[0], SizeOf(FReadBuffer)) + else + break; + end; + end; +end; + + +procedure TClientThread.HandleMessage; +begin + if FMessage.Size > 0 then + begin + FMessage.Position := 0; + Synchronize(DoMessage); + FMessage.Clear; + end; +end; + + +procedure TClientThread.TerminatedSet; +begin + inherited TerminatedSet; + + FTerminateEvent.SetEvent; +end; + + +procedure TClientThread.DoMessage; +begin + if Assigned(FOnMessage) then + FOnMessage(Self, FMessage); +end; + +end. diff --git a/Test/X2LogTest.dpr b/Test/X2LogTest.dpr new file mode 100644 index 0000000..ff3104f --- /dev/null +++ b/Test/X2LogTest.dpr @@ -0,0 +1,27 @@ +program X2LogTest; + +uses + Forms, + MainFrm in 'source\MainFrm.pas' {MainForm}, + X2Log.Intf in '..\X2Log.Intf.pas', + X2Log in '..\X2Log.pas', + X2Log.Observer.Event in '..\X2Log.Observer.Event.pas', + X2Log.Observer.Custom in '..\X2Log.Observer.Custom.pas', + X2Log.Exception.Default in '..\X2Log.Exception.Default.pas', + X2Log.Exception.madExcept in '..\X2Log.Exception.madExcept.pas', + X2Log.Observer.LogFile in '..\X2Log.Observer.LogFile.pas', + X2Log.Constants in '..\X2Log.Constants.pas', + X2Log.Observer.NamedPipe in '..\X2Log.Observer.NamedPipe.pas', + X2Log.Observer.CustomThreaded in '..\X2Log.Observer.CustomThreaded.pas'; + +{$R *.res} + +var + MainForm: TMainForm; + +begin + Application.Initialize; + Application.MainFormOnTaskbar := True; + Application.CreateForm(TMainForm, MainForm); + Application.Run; +end. diff --git a/Test/X2LogTest.dproj b/Test/X2LogTest.dproj new file mode 100644 index 0000000..b34f1bf --- /dev/null +++ b/Test/X2LogTest.dproj @@ -0,0 +1,201 @@ + + + {e601c684-e576-44d0-b94c-9a32de0c82c4} + Debug + DCC32 + X2LogTest.exe + X2LogTest.dpr + VCL + 13.4 + True + Debug + Win32 + 1 + Application + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_1 + true + true + + + true + Base + true + + + true + Cfg_2 + true + true + + + $(BDS)\bin\delphi_PROJECTICON.ico + bin + None + lib + Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace) + CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= + 1043 + + + X2LogTest_Icon.ico + $(BDS)\bin\default_app.manifest + + + true + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + 1033 + $(BDS)\bin\default_app.manifest + + + 7.0 + False + False + 0 + RELEASE;$(DCC_Define) + + + true + $(BDS)\bin\default_app.manifest + 1033 + + + 7.0 + DEBUG;$(DCC_Define) + + + $(BDS)\bin\default_app.manifest + true + 1033 + + + Delphi.Personality.12 + + + + + False + True + False + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1043 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + JVCL Application and Form Components + JVCL Band Objects + JVCL BDE Components + JVCL Non-Visual Components + JVCL Visual Controls + JVCL Core Components + JVCL Encryption and Compression + JVCL Custom Controls + JVCL Database Components + JVCL Dialog Components + JVCL Docking Components + JVCL DotNet Controls + JVCL Globus Components + JVCL HMI Controls + JVCL Jans Components + JVCL Managed Threads + JVCL Multimedia and Image Components + JVCL Network Components + JVCL Page Style Components + JVCL Interpreter Components + JVCL Plugin Components + JVCL Print Preview Components + JVCL Runtime Design Components + JVCL Standard Controls + JVCL System Components + JVCL Time Framework + JVCL Wizard + JVCL XP Controls + + + X2LogTest.dpr + + + + False + True + + + 12 + + + + MainSource + + +

MainForm
+ + + + + + + + + + + + + Cfg_2 + Base + + + Base + + + Cfg_1 + Base + + + + + + diff --git a/Test/X2LogTest.res b/Test/X2LogTest.res new file mode 100644 index 0000000000000000000000000000000000000000..c287ee9863dccfc9aa3b7e6b7563332879c2b5b1 GIT binary patch literal 298600 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 literal 0 HcmV?d00001 diff --git a/Test/source/MainFrm.dfm b/Test/source/MainFrm.dfm new file mode 100644 index 0000000..672e37f --- /dev/null +++ b/Test/source/MainFrm.dfm @@ -0,0 +1,155 @@ +object MainForm: TMainForm + Left = 0 + Top = 0 + Caption = 'X'#178'Log Test' + ClientHeight = 515 + ClientWidth = 611 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + OldCreateOrder = False + Position = poScreenCenter + OnCreate = FormCreate + OnDestroy = FormDestroy + PixelsPerInch = 96 + TextHeight = 13 + object pcObservers: TPageControl + AlignWithMargins = True + Left = 8 + Top = 113 + Width = 595 + Height = 361 + Margins.Left = 8 + Margins.Top = 8 + Margins.Right = 8 + Margins.Bottom = 8 + ActivePage = tsNamedPipe + Align = alClient + TabOrder = 0 + OnChange = pcObserversChange + object tsEvent: TTabSheet + Caption = 'Event Observer ' + object mmoEvent: TMemo + AlignWithMargins = True + Left = 8 + Top = 8 + Width = 571 + Height = 317 + Margins.Left = 8 + Margins.Top = 8 + Margins.Right = 8 + Margins.Bottom = 8 + Align = alClient + ReadOnly = True + ScrollBars = ssVertical + TabOrder = 0 + end + end + object tsFile: TTabSheet + Caption = 'File Observer' + ImageIndex = 1 + end + object tsNamedPipe: TTabSheet + Caption = 'Named Pipe Observer' + ImageIndex = 2 + end + end + object pnlButtons: TPanel + AlignWithMargins = True + Left = 8 + Top = 482 + Width = 595 + Height = 25 + Margins.Left = 8 + Margins.Top = 0 + Margins.Right = 8 + Margins.Bottom = 8 + Align = alBottom + BevelOuter = bvNone + TabOrder = 1 + object btnClose: TButton + Left = 520 + Top = 0 + Width = 75 + Height = 25 + Align = alRight + Cancel = True + Caption = 'Close' + TabOrder = 0 + end + end + object GroupBox1: TGroupBox + AlignWithMargins = True + Left = 8 + Top = 8 + Width = 595 + Height = 97 + Margins.Left = 8 + Margins.Top = 8 + Margins.Right = 8 + Margins.Bottom = 0 + Align = alTop + Caption = ' Dispatch ' + TabOrder = 2 + DesignSize = ( + 595 + 97) + object lblMessage: TLabel + Left = 16 + Top = 32 + Width = 46 + Height = 13 + Caption = 'Message:' + end + object lblException: TLabel + Left = 16 + Top = 59 + Width = 51 + Height = 13 + Caption = 'Exception:' + end + object edtMessage: TEdit + Left = 92 + Top = 29 + Width = 402 + Height = 21 + Anchors = [akLeft, akTop, akRight] + TabOrder = 0 + Text = 'Hello world!' + OnKeyDown = edtMessageKeyDown + end + object btnSend: TButton + Left = 500 + Top = 29 + Width = 75 + Height = 21 + Anchors = [akLeft, akTop, akRight] + Caption = '&Send' + TabOrder = 1 + OnClick = btnSendClick + end + object edtException: TEdit + Left = 92 + Top = 56 + Width = 402 + Height = 21 + Anchors = [akLeft, akTop, akRight] + TabOrder = 2 + Text = 'Horrible things are happening.' + OnKeyDown = edtExceptionKeyDown + end + object btnException: TButton + Left = 500 + Top = 56 + Width = 75 + Height = 21 + Anchors = [akLeft, akTop, akRight] + Caption = '&Send' + TabOrder = 3 + OnClick = btnExceptionClick + end + end +end diff --git a/Test/source/MainFrm.pas b/Test/source/MainFrm.pas new file mode 100644 index 0000000..9eb5948 --- /dev/null +++ b/Test/source/MainFrm.pas @@ -0,0 +1,167 @@ +unit MainFrm; + +interface +uses + System.Classes, + Vcl.ComCtrls, + Vcl.Controls, + Vcl.ExtCtrls, + Vcl.Forms, + Vcl.StdCtrls, + + X2Log.Intf; + + +type + TMainForm = class(TForm) + btnClose: TButton; + btnSend: TButton; + edtMessage: TEdit; + GroupBox1: TGroupBox; + lblMessage: TLabel; + mmoEvent: TMemo; + pcObservers: TPageControl; + pnlButtons: TPanel; + tsEvent: TTabSheet; + tsFile: TTabSheet; + lblException: TLabel; + edtException: TEdit; + btnException: TButton; + tsNamedPipe: TTabSheet; + + procedure FormCreate(Sender: TObject); + procedure FormDestroy(Sender: TObject); + procedure pcObserversChange(Sender: TObject); + procedure btnSendClick(Sender: TObject); + procedure edtExceptionKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); + procedure edtMessageKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); + procedure btnExceptionClick(Sender: TObject); + private + FLog: IX2Log; + FObserver: IX2LogObserver; + protected + procedure InitObserver; + + procedure DoLog(Sender: TObject; Level: TX2LogLevel; const Msg, Details: string); + end; + + +implementation +uses + System.SysUtils, + Winapi.Windows, + + X2Log, + X2Log.Constants, + X2Log.Exception.madExcept, + X2Log.Observer.Event, + X2Log.Observer.LogFile, + X2Log.Observer.NamedPipe; + + +{$R *.dfm} + + +{ TMainForm } +procedure TMainForm.FormCreate(Sender: TObject); +begin + SetLogResourceString(@LogLevelVerbose, 'Uitgebreid'); + SetLogResourceString(@LogLevelInfo, 'Informatie'); + SetLogResourceString(@LogLevelWarning, 'Waarschuwing'); + SetLogResourceString(@LogLevelError, 'Fout'); + + FLog := TX2Log.Create; + FLog.SetExceptionStrategy(TX2LogmadExceptExceptionStrategy.Create); + + pcObservers.ActivePageIndex := 0; + InitObserver; +end; + + +procedure TMainForm.FormDestroy(Sender: TObject); +begin + FLog := nil; +end; + + +procedure TMainForm.InitObserver; +var + activePage: TTabSheet; + +begin + if Assigned(FObserver) then + begin + FLog.Detach(FObserver); + FObserver := nil; + end; + + activePage := pcObservers.ActivePage; + + if activePage = tsEvent then + FObserver := TX2LogEventObserver.Create(DoLog) + else if activePage = tsFile then + FObserver := TX2LogFileObserver.CreateInProgramData('X2LogTest\Test.log'); + + if activePage = tsNamedPipe then + begin + FObserver := TX2LogNamedPipeObserver.Create('X2LogTest'); + end else + begin + + end; + + if Assigned(FObserver) then + FLog.Attach(FObserver); +end; + + +procedure TMainForm.DoLog(Sender: TObject; Level: TX2LogLevel; const Msg, Details: string); +begin + mmoEvent.Lines.Add(GetLogLevelText(Level) + ': ' + Msg + ' (' + Details + ')'); +end; + + +procedure TMainForm.edtMessageKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); +begin + if Key = VK_RETURN then + begin + btnException.Click; + Key := 0; + end; +end; + + +procedure TMainForm.edtExceptionKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); +begin + if Key = VK_RETURN then + begin + btnException.Click; + Key := 0; + end; +end; + +procedure TMainForm.pcObserversChange(Sender: TObject); +begin + InitObserver; +end; + + +procedure TMainForm.btnSendClick(Sender: TObject); +begin + FLog.Info(edtMessage.Text); +end; + + +procedure TMainForm.btnExceptionClick(Sender: TObject); +begin + try + { Throw an actual exception, don't just create it, to allow + strategies like madExcept to do their stack trace } + raise EAbort.Create(edtException.Text); + except + on E:Exception do + FLog.Exception(E); + end; +end; + +end. diff --git a/X2Log.Constants.pas b/X2Log.Constants.pas new file mode 100644 index 0000000..ffc0546 --- /dev/null +++ b/X2Log.Constants.pas @@ -0,0 +1,89 @@ +unit X2Log.Constants; + +interface +uses + X2Log.Intf; + + +resourcestring + LogLevelVerbose = 'Verbose'; + LogLevelInfo = 'Info'; + LogLevelWarning = 'Warning'; + LogLevelError = 'Error'; + + + { + X2Log.Observer.LogFile + } + + { Date format used to determine the file name of detail files } + LogFileNameDateFormat = 'ddmmyyyy_hhnn'; + + { Date format used in log files } + LogFileLineDateFormat = 'dd-mm-yy hh:nn'; + + { The text added to the message if details are stored externally } + LogFileLineDetails = ' (details: %s)'; + + + + function GetLogLevelText(ALogLevel: TX2LogLevel): string; + + function GetLogResourceString(AResourceString: Pointer): string; + procedure SetLogResourceString(AResourceString: Pointer; const AValue: string); + + +implementation +uses + System.Generics.Collections, + System.SysUtils; + + +var + LogResourceStringMap: TDictionary; + + + +function GetLogLevelText(ALogLevel: TX2LogLevel): string; +begin + case ALogLevel of + TX2LogLevel.Verbose: Result := GetLogResourceString(@LogLevelVerbose); + TX2LogLevel.Info: Result := GetLogResourceString(@LogLevelInfo); + TX2LogLevel.Warning: Result := GetLogResourceString(@LogLevelWarning); + TX2LogLevel.Error: Result := GetLogResourceString(@LogLevelError); + end; +end; + + +function GetLogResourceString(AResourceString: Pointer): string; +begin + TMonitor.Enter(LogResourceStringMap); + try + if LogResourceStringMap.ContainsKey(AResourceString) then + Result := LogResourceStringMap[AResourceString] + else + Result := LoadResString(AResourceString); + finally + TMonitor.Exit(LogResourceStringMap); + end; +end; + + +procedure SetLogResourceString(AResourceString: Pointer; const AValue: string); +begin + TMonitor.Enter(LogResourceStringMap); + try + LogResourceStringMap.AddOrSetValue(AResourceString, AValue); + finally + TMonitor.Exit(LogResourceStringMap); + end; +end; + + +initialization + LogResourceStringMap := TDictionary.Create; + +finalization + FreeAndNil(LogResourceStringMap); + +end. diff --git a/X2Log.Exception.Default.pas b/X2Log.Exception.Default.pas new file mode 100644 index 0000000..2c1d5be --- /dev/null +++ b/X2Log.Exception.Default.pas @@ -0,0 +1,30 @@ +unit X2Log.Exception.Default; + +interface +uses + System.SysUtils, + + X2Log.Intf; + + +type + TX2LogDefaultExceptionStrategy = class(TInterfacedObject, IX2LogExceptionStrategy) + public + { IX2LogExceptionStrategy } + procedure Execute(AException: Exception; var AMessage: string; var ADetails: string); virtual; + end; + + +implementation + + +{ TX2LogDefaultExceptionStrategy } +procedure TX2LogDefaultExceptionStrategy.Execute(AException: Exception; var AMessage, ADetails: string); +begin + if Length(AMessage) > 0 then + AMessage := AMessage + ': '; + + AMessage := AMessage + AException.Message; +end; + +end. diff --git a/X2Log.Exception.madExcept.pas b/X2Log.Exception.madExcept.pas new file mode 100644 index 0000000..e15a9c5 --- /dev/null +++ b/X2Log.Exception.madExcept.pas @@ -0,0 +1,35 @@ +unit X2Log.Exception.madExcept; + +interface +uses + System.SysUtils, + + X2Log.Intf, + X2Log.Exception.Default; + + +type + TX2LogmadExceptExceptionStrategy = class(TX2LogDefaultExceptionStrategy) + public + { IX2LogExceptionStrategy } + procedure Execute(AException: Exception; var AMessage: string; var ADetails: string); override; + end; + + +implementation +uses + madExcept; + + +{ TX2LogmadExceptExceptionStrategy } +procedure TX2LogmadExceptExceptionStrategy.Execute(AException: Exception; var AMessage, ADetails: string); +begin + inherited Execute(AException, AMessage, ADetails); + + if Length(ADetails) > 0 then + ADetails := ADetails + #13#10; + + ADetails := ADetails + madExcept.CreateBugReport(etNormal, AException); +end; + +end. diff --git a/X2Log.Intf.pas b/X2Log.Intf.pas new file mode 100644 index 0000000..34ca6b4 --- /dev/null +++ b/X2Log.Intf.pas @@ -0,0 +1,45 @@ +unit X2Log.Intf; + +interface +uses + System.SysUtils; + +type + TX2LogLevel = (Verbose, Info, Warning, Error); + + + IX2LogMethods = interface + ['{1949E8DC-6DC5-43DC-B678-55CF8274E79D}'] + procedure Log(ALevel: TX2LogLevel; const AMessage: string; const ADetails: string = ''); + end; + + + IX2LogObserver = interface(IX2LogMethods) + ['{CBC5C18E-84EE-43F4-8DBE-C66D06FCDE74}'] + end; + + + IX2LogExceptionStrategy = interface + ['{C0B7950E-BE0A-4A21-A7C5-F8322FD4E205}'] + procedure Execute(AException: Exception; var AMessage: string; var ADetails: string); + end; + + + IX2Log = interface(IX2LogMethods) + ['{A6FF38F9-EDA8-4C76-9C95-2C0317560D78}'] + procedure Attach(AObserver: IX2LogObserver); + procedure Detach(AObserver: IX2LogObserver); + + procedure SetExceptionStrategy(AStrategy: IX2LogExceptionStrategy); + + procedure Verbose(const AMessage: string; const ADetails: string = ''); + procedure Info(const AMessage: string; const ADetails: string = ''); + procedure Warning(const AMessage: string; const ADetails: string = ''); + procedure Error(const AMessage: string; const ADetails: string = ''); + procedure Exception(AException: Exception; const AMessage: string = ''; const ADetails: string = ''); + end; + + +implementation + +end. diff --git a/X2Log.Observer.Custom.pas b/X2Log.Observer.Custom.pas new file mode 100644 index 0000000..2b8284f --- /dev/null +++ b/X2Log.Observer.Custom.pas @@ -0,0 +1,52 @@ +unit X2Log.Observer.Custom; + +interface +uses + Classes, + SysUtils, + + X2Log.Intf; + + +const + X2LogLevelsAll = [Low(TX2LogLevel)..High(TX2LogLevel)]; + X2LogLevelsDefault = X2LogLevelsAll - [Verbose]; + +type + TX2LogLevels = set of TX2LogLevel; + + TX2LogCustomObserver = class(TInterfacedObject, IX2LogObserver) + private + FLogLevels: TX2LogLevels; + protected + procedure DoLog(ALevel: TX2LogLevel; const AMessage: string; const ADetails: string = ''); virtual; abstract; + + { IX2LogObserver } + procedure Log(ALevel: TX2LogLevel; const AMessage: string; const ADetails: string = ''); virtual; + + property LogLevels: TX2LogLevels read FLogLevels; + public + constructor Create(ALogLevels: TX2LogLevels = X2LogLevelsDefault); + end; + + +implementation + + +{ TX2LogCustomObserver } +constructor TX2LogCustomObserver.Create(ALogLevels: TX2LogLevels); +begin + inherited Create; + + FLogLevels := ALogLevels; +end; + + +procedure TX2LogCustomObserver.Log(ALevel: TX2LogLevel; const AMessage, ADetails: string); +begin + if ALevel in LogLevels then + DoLog(ALevel, AMessage, ADetails); +end; + +end. + diff --git a/X2Log.Observer.CustomThreaded.pas b/X2Log.Observer.CustomThreaded.pas new file mode 100644 index 0000000..75a5419 --- /dev/null +++ b/X2Log.Observer.CustomThreaded.pas @@ -0,0 +1,235 @@ +unit X2Log.Observer.CustomThreaded; + +interface +uses + System.Classes, + System.Generics.Collections, + System.SyncObjs, + + X2Log.Intf, + X2Log.Observer.Custom; + + +type + TX2LogObserverWorkerThread = class; + + + TX2LogCustomThreadedObserver = class(TX2LogCustomObserver) + private + FWorkerThread: TX2LogObserverWorkerThread; + protected + function CreateWorkerThread: TX2LogObserverWorkerThread; virtual; abstract; + + procedure DoLog(ALevel: TX2LogLevel; const AMessage: string; const ADetails: string = ''); override; + + property WorkerThread: TX2LogObserverWorkerThread read FWorkerThread; + public + constructor Create(ALogLevels: TX2LogLevels = X2LogLevelsDefault); + destructor Destroy; override; + end; + + + TX2LogQueueEntry = class(TPersistent) + private + FDetails: string; + FLevel: TX2LogLevel; + FMessage: string; + public + constructor Create(ALevel: TX2LogLevel; const AMessage: string; const ADetails: string); overload; + constructor Create(AEntry: TX2LogQueueEntry); overload; + + procedure Assign(Source: TPersistent); override; + + property Details: string read FDetails; + property Level: TX2LogLevel read FLevel; + property Message: string read FMessage; + end; + + + TX2LogObserverWorkerThread = class(TThread) + private + FFileName: string; + FLogQueue: TObjectQueue; + FLogQueueSignal: TEvent; + protected + procedure Execute; override; + procedure TerminatedSet; override; + + procedure Setup; virtual; + procedure Cleanup; virtual; + + procedure WaitForEntry; virtual; + procedure ProcessEntry(AEntry: TX2LogQueueEntry); virtual; abstract; + + property FileName: string read FFileName; + property LogQueue: TObjectQueue read FLogQueue; + property LogQueueSignal: TEvent read FLogQueueSignal; + public + constructor Create; + destructor Destroy; override; + + procedure Log(ALevel: TX2LogLevel; const AMessage: string; const ADetails: string = ''); + end; + + +implementation +uses + System.SysUtils; + + +{ TX2LogCustomThreadedObserver } +constructor TX2LogCustomThreadedObserver.Create(ALogLevels: TX2LogLevels); +begin + inherited Create(ALogLevels); + + FWorkerThread := CreateWorkerThread; +end; + + +destructor TX2LogCustomThreadedObserver.Destroy; +begin + FreeAndNil(FWorkerThread); + + inherited Destroy; +end; + + +procedure TX2LogCustomThreadedObserver.DoLog(ALevel: TX2LogLevel; const AMessage, ADetails: string); +begin + WorkerThread.Log(ALevel, AMessage, ADetails); +end; + + + +{ TX2LogQueueEntry } +constructor TX2LogQueueEntry.Create(ALevel: TX2LogLevel; const AMessage: string; const ADetails: string); +begin + inherited Create; + + FLevel := ALevel; + FMessage := AMessage; + FDetails := ADetails; +end; + + +constructor TX2LogQueueEntry.Create(AEntry: TX2LogQueueEntry); +begin + inherited Create; + + Assign(AEntry); +end; + + +procedure TX2LogQueueEntry.Assign(Source: TPersistent); +var + entrySource: TX2LogQueueEntry; + +begin + if Source is TX2LogQueueEntry then + begin + entrySource := TX2LogQueueEntry(Source); + + FLevel := entrySource.Level; + FMessage := entrySource.Message; + FDetails := entrySource.Details; + end else + inherited Assign(Source); +end; + + +{ TX2LogObserverWorkerThread } +constructor TX2LogObserverWorkerThread.Create; +begin + FLogQueueSignal := TEvent.Create(nil, False, False, ''); + FLogQueue := TObjectQueue.Create(True); + + inherited Create(False); +end; + + +destructor TX2LogObserverWorkerThread.Destroy; +begin + inherited Destroy; + + FreeAndNil(FLogQueue); + FreeAndNil(FLogQueueSignal); +end; + + +procedure TX2LogObserverWorkerThread.Log(ALevel: TX2LogLevel; const AMessage, ADetails: string); +begin + TMonitor.Enter(LogQueue); + try + LogQueue.Enqueue(TX2LogQueueEntry.Create(ALevel, AMessage, ADetails)); + finally + TMonitor.Exit(LogQueue); + end; + + LogQueueSignal.SetEvent; +end; + + +procedure TX2LogObserverWorkerThread.Execute; +var + entry: TX2LogQueueEntry; + +begin + Setup; + try + while not Terminated do + begin + WaitForEntry; + + if Terminated then + break; + + entry := nil; + TMonitor.Enter(LogQueue); + try + if LogQueue.Count > 0 then + entry := LogQueue.Extract; + finally + TMonitor.Exit(LogQueue); + end; + + if Assigned(entry) then + try + ProcessEntry(entry); + finally + FreeAndNil(entry); + end; + end; + finally + Cleanup; + end; +end; + + +procedure TX2LogObserverWorkerThread.Setup; +begin +end; + + +procedure TX2LogObserverWorkerThread.Cleanup; +begin +end; + + +procedure TX2LogObserverWorkerThread.WaitForEntry; +begin + case LogQueueSignal.WaitFor(INFINITE) of + wrAbandoned, + wrError: + Terminate; + end; +end; + + +procedure TX2LogObserverWorkerThread.TerminatedSet; +begin + LogQueueSignal.SetEvent; + + inherited TerminatedSet; +end; + +end. diff --git a/X2Log.Observer.Event.pas b/X2Log.Observer.Event.pas new file mode 100644 index 0000000..fa7e297 --- /dev/null +++ b/X2Log.Observer.Event.pas @@ -0,0 +1,50 @@ +unit X2Log.Observer.Event; + +interface +uses + X2Log.Intf, + X2Log.Observer.Custom; + + +type + TX2LogEvent = procedure(Sender: TObject; Level: TX2LogLevel; const Msg, Details: string) of object; + + + TX2LogEventObserver = class(TX2LogCustomObserver) + private + FOnLog: TX2LogEvent; + protected + procedure DoLog(ALevel: TX2LogLevel; const AMessage: string; const ADetails: string = ''); override; + public + constructor Create(ALogLevels: TX2LogLevels = X2LogLevelsDefault); overload; + constructor Create(AOnLog: TX2LogEvent; ALogLevels: TX2LogLevels = X2LogLevelsDefault); overload; + + property OnLog: TX2LogEvent read FOnLog write FOnLog; + end; + + +implementation + + +{ TX2LogEventObserver } +constructor TX2LogEventObserver.Create(ALogLevels: TX2LogLevels); +begin + inherited Create(ALogLevels); +end; + + +constructor TX2LogEventObserver.Create(AOnLog: TX2LogEvent; ALogLevels: TX2LogLevels); +begin + Create(ALogLevels); + + FOnLog := AOnLog; +end; + + +procedure TX2LogEventObserver.DoLog(ALevel: TX2LogLevel; const AMessage, ADetails: string); +begin + if Assigned(FOnLog) then + FOnLog(Self, ALevel, AMessage, ADetails); +end; + +end. diff --git a/X2Log.Observer.LogFile.pas b/X2Log.Observer.LogFile.pas new file mode 100644 index 0000000..7740ad4 --- /dev/null +++ b/X2Log.Observer.LogFile.pas @@ -0,0 +1,185 @@ +unit X2Log.Observer.LogFile; + +interface +uses + System.Classes, + System.Generics.Collections, + System.SyncObjs, + + X2Log.Intf, + X2Log.Observer.Custom, + X2Log.Observer.CustomThreaded; + + +type + TX2LogFileObserver = class(TX2LogCustomThreadedObserver) + private + FFileName: string; + protected + function CreateWorkerThread: TX2LogObserverWorkerThread; override; + public + constructor Create(const AFileName: string; ALogLevels: TX2LogLevels = X2LogLevelsDefault); + constructor CreateInProgramData(const AFileName: string; ALogLevels: TX2LogLevels = X2LogLevelsDefault); + constructor CreateInUserAppData(const AFileName: string; ALogLevels: TX2LogLevels = X2LogLevelsDefault); + end; + + +implementation +uses + System.IOUtils, + System.SysUtils, + System.Win.ComObj, + Winapi.SHFolder, + Winapi.Windows, + + X2Log.Constants; + + +type + TX2LogFileWorkerThread = class(TX2LogObserverWorkerThread) + private + FFileName: string; + protected + procedure ProcessEntry(AEntry: TX2LogQueueEntry); override; + + property FileName: string read FFileName; + public + constructor Create(const AFileName: string); + end; + + + +{ TX2LogFileObserver } +constructor TX2LogFileObserver.Create(const AFileName: string; ALogLevels: TX2LogLevels); +begin + FFileName := AFileName; + + inherited Create(ALogLevels); +end; + + +constructor TX2LogFileObserver.CreateInProgramData(const AFileName: string; ALogLevels: TX2LogLevels); +var + path: PWideChar; + +begin + GetMem(path, MAX_PATH); + try + OleCheck(SHGetFolderPath(0, CSIDL_COMMON_APPDATA, 0, SHGFP_TYPE_CURRENT, path)); + Create(IncludeTrailingPathDelimiter(path) + AFileName, ALogLevels); + finally + FreeMem(path); + end; +end; + + +constructor TX2LogFileObserver.CreateInUserAppData(const AFileName: string; ALogLevels: TX2LogLevels); +var + path: PWideChar; + +begin + GetMem(path, MAX_PATH); + try + OleCheck(SHGetFolderPath(0, CSIDL_APPDATA, 0, SHGFP_TYPE_CURRENT, path)); + Create(IncludeTrailingPathDelimiter(path) + AFileName, ALogLevels); + finally + FreeMem(path); + end; +end; + + +function TX2LogFileObserver.CreateWorkerThread: TX2LogObserverWorkerThread; +begin + Result := TX2LogFileWorkerThread.Create(FFileName); +end; + + +{ TX2LogFileWorkerThread } +constructor TX2LogFileWorkerThread.Create(const AFileName: string); +begin + FFileName := AFileName; + + inherited Create; +end; + + +procedure TX2LogFileWorkerThread.ProcessEntry(AEntry: TX2LogQueueEntry); +var + baseReportFileName: string; + errorMsg: string; + detailsExtension: string; + detailsFile: THandle; + detailsFileStream: THandleStream; + detailsWriter: TStreamWriter; + detailsFileName: string; + detailsNumber: Integer; + writer: TStreamWriter; + +begin + ForceDirectories(ExtractFilePath(FileName)); + errorMsg := AEntry.Message; + + if Length(AEntry.Details) > 0 then + begin + detailsExtension := ExtractFileExt(FileName); + baseReportFileName := ChangeFileExt(FileName, '_' + FormatDateTime(GetLogResourceString(@LogFileNameDateFormat), Now)); + detailsFileName := baseReportFileName + detailsExtension; + detailsNumber := 0; + + if ForceDirectories(ExtractFilePath(detailsFileName)) then + begin + repeat + { TFileStream lacks the ability to create a file only when it does not exist } + detailsFile := CreateFile(PChar(detailsFileName), GENERIC_READ or GENERIC_WRITE, + FILE_SHARE_READ or FILE_SHARE_WRITE, nil, CREATE_NEW, + FILE_ATTRIBUTE_NORMAL, 0); + + if detailsFile = INVALID_HANDLE_VALUE then + begin + if GetLastError = ERROR_FILE_EXISTS then + begin + { Generate a new file name } + Inc(detailsNumber); + detailsFileName := Format('%s_%d%s', [baseReportFileName, detailsNumber, + detailsExtension]); + end else + break; + end else + begin + { Details file succesfully generated } + try + detailsFileStream := THandleStream.Create(detailsFile); + try + detailsWriter := TStreamWriter.Create(detailsFileStream, TEncoding.ANSI); + try + detailsWriter.Write(AEntry.Details); + finally + FreeAndNil(detailsWriter); + end; + finally + FreeAndNil(detailsFileStream); + end; + finally + CloseHandle(detailsFile); + end; + + // ErrorLogs.Add(reportFileName); + + errorMsg := errorMsg + Format(GetLogResourceString(@LogFileLineDetails), [ExtractFileName(detailsFileName)]); + break; + end; + until False; + end; + end; + + { Append line to log file } + writer := TFile.AppendText(FileName); + try + writer.WriteLine('[' + FormatDateTime(GetLogResourceString(@LogFileLineDateFormat), Now) + '] ' + + GetLogLevelText(AEntry.Level) + ': ' + errorMsg); + finally + FreeAndNil(writer); + end; +end; + +end. diff --git a/X2Log.Observer.NamedPipe.pas b/X2Log.Observer.NamedPipe.pas new file mode 100644 index 0000000..39f96ad --- /dev/null +++ b/X2Log.Observer.NamedPipe.pas @@ -0,0 +1,422 @@ +unit X2Log.Observer.NamedPipe; + +interface +uses + X2Log.Intf, + X2Log.Observer.Custom, + X2Log.Observer.CustomThreaded; + + +type + TX2LogNamedPipeObserver = class(TX2LogCustomThreadedObserver) + private + FPipeName: string; + protected + function CreateWorkerThread: TX2LogObserverWorkerThread; override; + public + constructor Create(const APipeName: string; ALogLevels: TX2LogLevels = X2LogLevelsDefault); + end; + + +implementation +uses + System.Generics.Collections, + System.SyncObjs, + System.SysUtils, + Winapi.Windows; + + +type + EX2LogSilentException = class(Exception); + EX2LogPipeDisconnected = class(EX2LogSilentException); + + TX2LogNamedPipeClientState = (Listening, Connected, Writing); + + TX2LogNamedPipeClient = class(TObject) + private + FOverlapped: TOverlapped; + FPipe: THandle; + FState: TX2LogNamedPipeClientState; + FOverlappedEvent: TEvent; + FWriteQueue: TObjectQueue; + FWriteBuffer: Pointer; + FWriteBufferSize: Integer; + protected + function DoSend(AEntry: TX2LogQueueEntry): Boolean; + procedure ClearWriteBuffer; + public + constructor Create(APipe: THandle); + destructor Destroy; override; + + procedure Send(AEntry: TX2LogQueueEntry); + procedure SendNext; + + procedure Disconnect; + + property Pipe: THandle read FPipe; + property Overlapped: TOverlapped read FOverlapped; + property OverlappedEvent: TEvent read FOverlappedEvent; + property State: TX2LogNamedPipeClientState read FState write FState; + end; + + + TX2LogNamedPipeWorkerThread = class(TX2LogObserverWorkerThread) + private + FClients: TObjectList; + FPipeName: string; + protected + + procedure WaitForEntry; override; + procedure ProcessEntry(AEntry: TX2LogQueueEntry); override; + procedure ProcessClientEvent(AClientIndex: Integer); + + procedure AddListener; + procedure RemoveClient(AClientIndex: Integer); + procedure Setup; override; + procedure Cleanup; override; + + property Clients: TObjectList read FClients; + property PipeName: string read FPipeName; + public + constructor Create(const APipeName: string); + destructor Destroy; override; + end; + + +{ TX2LogNamedPipeObserver } +constructor TX2LogNamedPipeObserver.Create(const APipeName: string; ALogLevels: TX2LogLevels); +begin + FPipeName := APipeName; + + inherited Create(ALogLevels); +end; + + +function TX2LogNamedPipeObserver.CreateWorkerThread: TX2LogObserverWorkerThread; +begin + Result := TX2LogNamedPipeWorkerThread.Create(FPipeName); +end; + + +{ TX2LogNamedPipeClient } +constructor TX2LogNamedPipeClient.Create(APipe: THandle); +begin + inherited Create; + + FPipe := APipe; + FState := Listening; + + FOverlappedEvent := TEvent.Create(nil, False, False, ''); + FOverlapped.hEvent := FOverlappedEvent.Handle; +end; + + +destructor TX2LogNamedPipeClient.Destroy; +begin + FreeAndNil(FOverlappedEvent); + + if FPipe <> INVALID_HANDLE_VALUE then + DisconnectNamedPipe(FPipe); + + ClearWriteBuffer; + + inherited Destroy; +end; + + +procedure TX2LogNamedPipeClient.Send(AEntry: TX2LogQueueEntry); +begin + if not Assigned(FWriteBuffer) then + DoSend(AEntry) + else + begin + if not Assigned(FWriteQueue) then + FWriteQueue := TObjectQueue.Create(True); + + FWriteQueue.Enqueue(TX2LogQueueEntry.Create(AEntry)); + end; +end; + + +procedure TX2LogNamedPipeClient.SendNext; +var + entry: TX2LogQueueEntry; + +begin + ClearWriteBuffer; + + while FWriteQueue.Count > 0 do + begin + entry := FWriteQueue.Extract; + try + { Returns False when IO is pending } + if not DoSend(entry) then + break; + finally + FreeAndNil(entry); + end; + end; +end; + + +procedure TX2LogNamedPipeClient.Disconnect; +begin + if FPipe <> INVALID_HANDLE_VALUE then + begin + CancelIo(FPipe); + DisconnectNamedPipe(FPipe); + + FPipe := INVALID_HANDLE_VALUE; + end; +end; + + +function TX2LogNamedPipeClient.DoSend(AEntry: TX2LogQueueEntry): Boolean; + + procedure AppendToBuffer(var APointer: PByte; const ASource; ASize: Cardinal); overload; inline; + begin + Move(ASource, APointer^, ASize); + Inc(APointer, ASize); + end; + + procedure AppendToBuffer(var APointer: PByte; const ASource: string); overload; inline; + var + sourceLength: Cardinal; + + begin + sourceLength := Length(ASource); + AppendToBuffer(APointer, sourceLength, SizeOf(Cardinal)); + AppendToBuffer(APointer, PChar(ASource)^, sourceLength * SizeOf(Char)); + end; + + +var + bytesWritten: Cardinal; + bufferPointer: PByte; + lastError: Cardinal; + +begin + ClearWriteBuffer; + + FWriteBufferSize := SizeOf(TX2LogLevel) + + SizeOf(Cardinal) + (Length(AEntry.Message) * SizeOf(Char)) + + SizeOf(Cardinal) + (Length(AEntry.Details) * SizeOf(Char)); + + GetMem(FWriteBuffer, FWriteBufferSize); + + bufferPointer := FWriteBuffer; + AppendToBuffer(bufferPointer, AEntry.Level, SizeOf(TX2LogLevel)); + AppendToBuffer(bufferPointer, AEntry.Message); + AppendToBuffer(bufferPointer, AEntry.Details); + + Result := WriteFile(Pipe, FWriteBuffer^, FWriteBufferSize, bytesWritten, @Overlapped); + if not Result then + begin + lastError := GetLastError; + if lastError in [ERROR_NO_DATA, ERROR_PIPE_NOT_CONNECTED] then + raise EX2LogPipeDisconnected.Create('Client disconnected'); + + if lastError = ERROR_IO_PENDING then + State := Writing + else + begin + ClearWriteBuffer; + RaiseLastOSError; + end; + end else + begin + ClearWriteBuffer; + State := Connected; + end; +end; + + +procedure TX2LogNamedPipeClient.ClearWriteBuffer; +begin + if Assigned(FWriteBuffer) then + begin + FreeMem(FWriteBuffer, FWriteBufferSize); + FWriteBuffer := nil; + end; +end; + + + +{ TX2LogNamedPipeWorkerThread } +constructor TX2LogNamedPipeWorkerThread.Create(const APipeName: string); +begin + FPipeName := APipeName; + FClients := TObjectList.Create(True); + + inherited Create; +end; + + +destructor TX2LogNamedPipeWorkerThread.Destroy; +begin + inherited Destroy; + + FreeAndNil(FClients); +end; + + +procedure TX2LogNamedPipeWorkerThread.Setup; +begin + inherited Setup; + + AddListener; +end; + + +procedure TX2LogNamedPipeWorkerThread.Cleanup; +var + client: TX2LogNamedPipeClient; + +begin + for client in Clients do + client.Disconnect; + + inherited Cleanup; +end; + + +procedure TX2LogNamedPipeWorkerThread.WaitForEntry; +var + eventHandles: array of THandle; + clientIndex: Integer; + waitResult: Cardinal; + +begin + repeat + SetLength(eventHandles, Clients.Count + 1); + for clientIndex := 0 to Pred(Clients.Count) do + eventHandles[clientIndex] := Clients[clientIndex].OverlappedEvent.Handle; + + eventHandles[Clients.Count] := LogQueueSignal.Handle; + + waitResult := WaitForMultipleObjects(Length(eventHandles), @eventHandles[0], False, INFINITE); + if waitResult in [WAIT_OBJECT_0..WAIT_OBJECT_0 + Pred(High(eventHandles))] then + begin + { Connect or write I/O completed } + clientIndex := waitResult - WAIT_OBJECT_0; + if (clientIndex >= 0) and (clientIndex < Clients.Count) then + ProcessClientEvent(clientIndex); + end else if waitResult = Cardinal(WAIT_OBJECT_0 + High(eventHandles)) then + begin + { Entry queued } + break; + end else if waitResult in [WAIT_ABANDONED_0..WAIT_ABANDONED_0 + High(eventHandles)] then + begin + { Client event abandoned } + clientIndex := waitResult - WAIT_ABANDONED_0; + if (clientIndex >= 0) and (clientIndex < Clients.Count) then + RemoveClient(clientIndex) + else if clientIndex = Clients.Count then + Terminate; + end else if waitResult = WAIT_FAILED then + RaiseLastOSError; + until False; +end; + + +procedure TX2LogNamedPipeWorkerThread.ProcessEntry(AEntry: TX2LogQueueEntry); +var + clientIndex: Integer; + client: TX2LogNamedPipeClient; + +begin + { Broadcast to connected clients } + for clientIndex := Pred(Clients.Count) downto 0 do + begin + client := Clients[clientIndex]; + + if client.State <> Listening then + try + client.Send(AEntry); + except + on E:EX2LogPipeDisconnected do + RemoveClient(clientIndex); + end; + end; +end; + + +procedure TX2LogNamedPipeWorkerThread.ProcessClientEvent(AClientIndex: Integer); +var + client: TX2LogNamedPipeClient; + bytesTransferred: Cardinal; + +begin + client := Clients[AClientIndex]; + + case client.State of + Listening: + { Client connected } + if GetOverlappedResult(client.Pipe, client.Overlapped, bytesTransferred, False) then + begin + client.State := Connected; + AddListener; + end else + RemoveClient(AClientIndex); + + Writing: + { Write operation completed } + if GetOverlappedResult(client.Pipe, client.Overlapped, bytesTransferred, False) and + (bytesTransferred > 0) then + begin + try + client.SendNext; + except + on E:EX2LogPipeDisconnected do + RemoveClient(AClientIndex); + end; + end else + RemoveClient(AClientIndex); + end; +end; + + +procedure TX2LogNamedPipeWorkerThread.AddListener; +const + BufferSize = 4096; + DefaultTimeout = 5000; + +var + pipe: THandle; + client: TX2LogNamedPipeClient; + +begin + pipe := CreateNamedPipe(PChar('\\.\pipe\' + PipeName), PIPE_ACCESS_OUTBOUND or FILE_FLAG_OVERLAPPED, + PIPE_TYPE_MESSAGE or PIPE_READMODE_MESSAGE or PIPE_WAIT, PIPE_UNLIMITED_INSTANCES, + BufferSize, BufferSize, DefaultTimeout, nil); + + if pipe <> INVALID_HANDLE_VALUE then + begin + client := TX2LogNamedPipeClient.Create(pipe); + + if not ConnectNamedPipe(client.Pipe, @client.Overlapped) then + begin + case GetLastError of + ERROR_IO_PENDING: + Clients.Add(client); + + ERROR_PIPE_CONNECTED: + begin + client.State := Connected; + Clients.Add(client); + end; + else + { Error occured } + FreeAndNil(client); + end; + end; + end; +end; + + +procedure TX2LogNamedPipeWorkerThread.RemoveClient(AClientIndex: Integer); +begin + Clients.Delete(AClientIndex); +end; + +end. diff --git a/X2Log.groupproj b/X2Log.groupproj new file mode 100644 index 0000000..3c6d543 --- /dev/null +++ b/X2Log.groupproj @@ -0,0 +1,48 @@ + + + {66C17964-1E71-4A50-A5F4-D04EB6A833D3} + + + + + + + + + + + Default.Personality.12 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/X2Log.pas b/X2Log.pas new file mode 100644 index 0000000..cd5da64 --- /dev/null +++ b/X2Log.pas @@ -0,0 +1,134 @@ +unit X2Log; + +interface +uses + System.Classes, + System.Generics.Collections, + System.SysUtils, + + X2Log.Intf; + + +type + TX2Log = class(TInterfacedObject, IX2Log, IX2LogMethods) + private + FExceptionStrategy: IX2LogExceptionStrategy; + FObservers: TList; + private + property ExceptionStrategy: IX2LogExceptionStrategy read FExceptionStrategy; + property Observers: TList read FObservers; + public + constructor Create; + destructor Destroy; override; + + { IX2Log } + procedure Attach(AObserver: IX2LogObserver); + procedure Detach(AObserver: IX2LogObserver); + + procedure SetExceptionStrategy(AStrategy: IX2LogExceptionStrategy); + + { IX2LogMethods } + procedure Log(ALevel: TX2LogLevel; const AMessage: string; const ADetails: string = ''); + + procedure Verbose(const AMessage: string; const ADetails: string = ''); + procedure Info(const AMessage: string; const ADetails: string = ''); + procedure Warning(const AMessage: string; const ADetails: string = ''); + procedure Error(const AMessage: string; const ADetails: string = ''); + procedure Exception(AException: Exception; const AMessage: string = ''; const ADetails: string = ''); + end; + + +implementation +uses + X2Log.Exception.Default; + + +{ TX2Log } +constructor TX2Log.Create; +begin + inherited Create; + + FObservers := TList.Create; + SetExceptionStrategy(nil); +end; + + +destructor TX2Log.Destroy; +begin + FreeAndNil(FObservers); + + inherited Destroy; +end; + + +procedure TX2Log.Attach(AObserver: IX2LogObserver); +begin + { Explicit cast ensures we're getting the same pointer in Attach and Detach + if, for example, the implementing interface is a descendant of IX2LogObserver } + Observers.Add(AObserver as IX2LogObserver); +end; + + +procedure TX2Log.Detach(AObserver: IX2LogObserver); +begin + Observers.Remove(AObserver as IX2LogObserver); +end; + + +procedure TX2Log.SetExceptionStrategy(AStrategy: IX2LogExceptionStrategy); +begin + if Assigned(AStrategy) then + FExceptionStrategy := AStrategy + else + FExceptionStrategy := TX2LogDefaultExceptionStrategy.Create; +end; + + +procedure TX2Log.Log(ALevel: TX2LogLevel; const AMessage, ADetails: string); +var + observer: IX2LogObserver; + +begin + for observer in Observers do + observer.Log(ALevel, AMessage, ADetails); +end; + + +procedure TX2Log.Verbose(const AMessage, ADetails: string); +begin + Log(TX2LogLevel.Verbose, AMessage, ADetails); +end; + + +procedure TX2Log.Info(const AMessage, ADetails: string); +begin + Log(TX2LogLevel.Info, AMessage, ADetails); +end; + + +procedure TX2Log.Warning(const AMessage, ADetails: string); +begin + Log(TX2LogLevel.Warning, AMessage, ADetails); +end; + + +procedure TX2Log.Error(const AMessage, ADetails: string); +begin + Log(TX2LogLevel.Error, AMessage, ADetails); +end; + + +procedure TX2Log.Exception(AException: Exception; const AMessage, ADetails: string); +var + msg: string; + details: string; + +begin + msg := AMessage; + details := ADetails; + + ExceptionStrategy.Execute(AException, msg, details); + Log(TX2LogLevel.Error, msg, details); +end; + +end.