blob: 447627cab4d4c6be9c58cf892a50d73876691715 (
plain) (
tree)
|
|
{* UltraStar Deluxe - Karaoke Game
*
* UltraStar Deluxe is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
* file distributed with this source distribution.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* 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. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*
* $URL: https://ultrastardx.svn.sourceforge.net/svnroot/ultrastardx/trunk/src/base/UMain.pas $
* $Id: UMain.pas 1629 2009-03-07 22:30:04Z k-m_schindler $
*}
unit UPlugin;
interface
{$IFDEF FPC}
{$MODE Delphi}
{$ENDIF}
{$I switches.inc}
uses UPluginDefines;
// a basic implementation of IPlugin
type
TPlugin = class(TInterfacedObject, IUS_Plugin)
protected
Status: TUS_PluginStatus;
Handle: TUS_Handle;
UniqueID: TUS_Handle;
Filename: WideString;
ErrorReason: WideString;
Info: TUS_PluginInfo;
procedure OnChangeStatus(Status: TUS_PluginStatus); virtual;
public
constructor Create(Handle: TUS_Handle; Filename: WideString); virtual;
function GetLoader: LongInt; virtual;
function GetStatus: TUS_PluginStatus; virtual;
procedure SetStatus(Status: TUS_PluginStatus); virtual;
function GetInfo: TUS_PluginInfo; virtual;
function Identify(Info: TUS_PluginInfo): boolean; virtual;
function GetHandle: TUS_Handle; virtual;
function GetUniqueID: TUS_Handle; virtual;
function GetFilename: WideString; virtual;
procedure Init; virtual; {$IFDEF HasInline}inline;{$ENDIF}
procedure DeInit; virtual; {$IFDEF HasInline}inline;{$ENDIF}
procedure SetError(Reason: WideString); virtual;
function GetErrorReason: WideString; virtual;
end;
implementation
uses UPluginManager, ULog;
constructor TPlugin.Create(Handle: TUS_Handle; Filename: WideString);
begin
inherited Create;
Self.Handle := Handle;
Self.Filename := Filename;
Self.Status := psNone;
Self.UniqueID := CalculateUSHash(Filename); //< this should be done another way ;) just for testing purposes
Self.Info.Version := US_VERSION_UNDEFINED;
end;
function TPlugin.GetLoader: LongInt;
begin
Result := US_LOADER_UNDEFINED;
end;
function TPlugin.GetStatus: TUS_PluginStatus;
begin
Result := Status;
end;
procedure TPlugin.SetStatus(Status: TUS_PluginStatus);
begin
// OnChangeStatus has to change the status attribut
OnChangeStatus(Status);
end;
function TPlugin.GetInfo: TUS_PluginInfo;
begin
Result := Info;
end;
function TPlugin.Identify(Info: TUS_PluginInfo): boolean;
begin
Result := false;
If (Self.Info.Version = US_VERSION_UNDEFINED) then
begin //first identify
If (Length(Info.Name) > 0) AND (Length(Info.Author) > 0) AND (Length(Info.PluginDesc) > 0) AND (Info.Version <> US_VERSION_UNDEFINED) then
begin
Self.Info := Info;
Result := true;
end
else
SetError('Identify called with incomplete info struct');
end
else
Log.LogWarn('Identify is called twice', Self.Info.Name);
end;
function TPlugin.GetHandle: TUS_Handle;
begin
Result := Handle;
end;
function TPlugin.GetUniqueID: TUS_Handle;
begin
Result := UniqueID;
end;
function TPlugin.GetFilename: WideString;
begin
Result := Filename;
end;
procedure TPlugin.Init; {$IFDEF HasInline}inline;{$ENDIF}
begin
if (Status = psWaitingInit) then
SetStatus(psInited);
end;
procedure TPlugin.DeInit; {$IFDEF HasInline}inline;{$ENDIF}
begin
if (Status = psInited) then
SetStatus(psDeInited);
end;
procedure TPlugin.SetError(Reason: WideString);
begin
ErrorReason := Reason;
SetStatus(psError);
PluginManager.ReportError(Handle);
Log.LogError(Filename + ': ' + Reason);
end;
function TPlugin.GetErrorReason: WideString;
begin
Result := ErrorReason;
end;
procedure TPlugin.OnChangeStatus(Status: TUS_PluginStatus);
begin
//do nothing here
//should be overwritten by the child classes
end;
end.
|