123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122 |
- unit singleinstance;
- {
- This file is part of the Free Component Library (FCL)
- Copyright (c) 2015 by Ondrej Pokorny
- See the file COPYING.FPC, included in this distribution,
- for details about the copyright.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- **********************************************************************}
- {$mode objfpc}
- {$H+}
- interface
- uses
- SysUtils, Classes;
- type
- TBaseSingleInstance = class;
- //siServer: No other instance is running. The server is started.
- //siClient: There is another instance running. This instance is used as client.
- //siNotResponding: There is another instance running but it doesn't respond.
- TSingleInstanceStart = (siServer, siClient, siNotResponding);
- TSingleInstanceParamsEvent = procedure(Sender: TBaseSingleInstance; Params: TStringList) of object;
- TBaseSingleInstance = class(TComponent)
- private
- FStartResult: TSingleInstanceStart;
- FTimeOutMessages: Integer;
- FTimeOutWaitForInstances: Integer;
- FOnServerReceivedParams: TSingleInstanceParamsEvent;
- Protected
- function GetIsClient: Boolean; virtual; abstract;
- function GetIsServer: Boolean; virtual; abstract;
- function GetStartResult: TSingleInstanceStart; virtual;
- procedure DoServerReceivedParams(const aParamsDelimitedText: string);
- Procedure SetStartResult(AValue : TSingleInstanceStart);
- public
- constructor Create(aOwner: TComponent); override;
- destructor Destroy; override;
- public
- //call Start when you want to start single instance checking
- function Start: TSingleInstanceStart; virtual; abstract;
- //stop single instance server or client
- procedure Stop; virtual; abstract;
- //check and handle pending messages on server
- procedure ServerCheckMessages; virtual; abstract;
- //post cmd parameters from client to server
- procedure ClientPostParams; virtual; abstract;
- public
- property TimeOutMessages: Integer read FTimeOutMessages write FTimeOutMessages;
- property TimeOutWaitForInstances: Integer read FTimeOutWaitForInstances write FTimeOutWaitForInstances;
- property OnServerReceivedParams: TSingleInstanceParamsEvent read FOnServerReceivedParams write FOnServerReceivedParams;
- public
- property StartResult: TSingleInstanceStart read GetStartResult;
- property IsServer: Boolean read GetIsServer;
- property IsClient: Boolean read GetIsClient;
- end;
- TBaseSingleInstanceClass = class of TBaseSingleInstance;
- ESingleInstance = class(Exception);
- Var
- DefaultSingleInstanceClass : TBaseSingleInstanceClass = Nil;
- implementation
- { TBaseSingleInstance }
- constructor TBaseSingleInstance.Create(aOwner: TComponent);
- begin
- inherited Create(aOwner);
- FTimeOutMessages := 1000;
- FTimeOutWaitForInstances := 100;
- end;
- destructor TBaseSingleInstance.Destroy;
- begin
- Stop;
- inherited Destroy;
- end;
- procedure TBaseSingleInstance.DoServerReceivedParams(
- const aParamsDelimitedText: string);
- var
- xSL: TStringList;
- begin
- if not Assigned(FOnServerReceivedParams) then
- Exit;
- xSL := TStringList.Create;
- try
- xSL.DelimitedText := aParamsDelimitedText;
- FOnServerReceivedParams(Self, xSL);
- finally
- xSL.Free;
- end;
- end;
- function TBaseSingleInstance.GetStartResult: TSingleInstanceStart;
- begin
- Result := FStartResult;
- end;
- Procedure TBaseSingleInstance.SetStartResult(AValue : TSingleInstanceStart);
- begin
- FStartResult:=AValue;
- end;
- end.
|