/usr/src/castle-game-engine-6.4/base/castleinterfaces.pas is in castle-game-engine-src 6.4+dfsg1-2.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 | {
Copyright 2007-2017 Michalis Kamburelis.
This file is part of "Castle Game Engine".
"Castle Game Engine" is free software; see the file COPYING.txt,
included in this distribution, for details about the copyright.
"Castle Game Engine" 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.
----------------------------------------------------------------------------
}
{$ifdef FPC} {$interfaces com} {$endif}
{ In FPC > 2.4.2, IInterface methods signature changed.
See
http://wiki.freepascal.org/User_Changes_Trunk#IInterface.QueryInterface.2C_._AddRef_and_._Release_definitions_have_been_changed }
{$ifdef VER2_0} {$define OLD_IINTERFACE_METHODS} {$endif}
{$ifdef VER2_2} {$define OLD_IINTERFACE_METHODS} {$endif}
{$ifdef VER2_4} {$define OLD_IINTERFACE_METHODS} {$endif}
{ IInterface methods are stdcall always with older FPC, or only on Windows
with newer FPC.
When IINTERFACE_STDCALL is not defined, it means to use cdecl. }
{$ifdef OLD_IINTERFACE_METHODS} {$define IINTERFACE_STDCALL} {$endif}
{$ifdef MSWINDOWS} {$define IINTERFACE_STDCALL} {$endif}
{ TODO: We should switch to use CORBA interfaces, instead of COM,
and then this unit, and classes inside, should not be needed anymore.
See http://michalis.ii.uni.wroc.pl/~michalis/modern_pascal_introduction/modern_pascal_introduction.html
about interfaces. }
{ Utilities for interfaces.
@deprecated
This unit will be removed at some point, and Castle Game Engine will use CORBA interfaces only. }
unit CastleInterfaces;
{$I castleconf.inc}
interface
uses Classes;
type
{ A class that can use interfaces and is not reference counted.
For COM-style interfaces, it's needed to descend from this to provide
dumb _AddRef and _Release implementations (that do nothing) and trivial
QueryInterface implementation.
See e.g. thread
[http://lists.freepascal.org/lists/fpc-devel/2007-November/012060.html]. }
TNonRefCountedInterfacedObject = class(TObject, IInterface)
protected
function _AddRef: Integer; {$ifdef IINTERFACE_STDCALL} stdcall {$else} cdecl {$endif};
function _Release: Integer; {$ifdef IINTERFACE_STDCALL} stdcall {$else} cdecl {$endif};
function QueryInterface({$ifdef OLD_IINTERFACE_METHODS} const {$else} constref {$endif} IID: TGUID; out Obj): Hresult; virtual; {$ifdef IINTERFACE_STDCALL} stdcall {$else} cdecl {$endif};
end;
{ A TPersistent descendant that can use interfaces and
is not reference counted. Analogous to TNonRefCountedInterfacedObject. }
TNonRefCountedInterfacedPersistent = class(TPersistent, IInterface)
protected
function _AddRef: Integer; {$ifdef IINTERFACE_STDCALL} stdcall {$else} cdecl {$endif};
function _Release: Integer; {$ifdef IINTERFACE_STDCALL} stdcall {$else} cdecl {$endif};
function QueryInterface({$ifdef OLD_IINTERFACE_METHODS} const {$else} constref {$endif} IID: TGUID; out Obj): Hresult; virtual; {$ifdef IINTERFACE_STDCALL} stdcall {$else} cdecl {$endif};
end;
implementation
{ TNonRefCountedInterfacedObject --------------------------------------------- }
function TNonRefCountedInterfacedObject._AddRef: Integer;
{$ifdef IINTERFACE_STDCALL} stdcall {$else} cdecl {$endif};
begin
Result := -1;
end;
function TNonRefCountedInterfacedObject._Release: Integer;
{$ifdef IINTERFACE_STDCALL} stdcall {$else} cdecl {$endif};
begin
Result := -1;
end;
function TNonRefCountedInterfacedObject.QueryInterface(
{$ifdef OLD_IINTERFACE_METHODS} const {$else} constref {$endif} IID: TGUID;
out Obj): Hresult;
{$ifdef IINTERFACE_STDCALL} stdcall {$else} cdecl {$endif};
begin
if GetInterface(IID, Obj) then
Result := S_OK else
Result := E_NOINTERFACE;
end;
{ TNonRefCountedInterfacedPersistent ----------------------------------------- }
function TNonRefCountedInterfacedPersistent._AddRef: Integer;
{$ifdef IINTERFACE_STDCALL} stdcall {$else} cdecl {$endif};
begin
Result := -1;
end;
function TNonRefCountedInterfacedPersistent._Release: Integer;
{$ifdef IINTERFACE_STDCALL} stdcall {$else} cdecl {$endif};
begin
Result := -1;
end;
function TNonRefCountedInterfacedPersistent.QueryInterface(
{$ifdef OLD_IINTERFACE_METHODS} const {$else} constref {$endif} IID: TGUID;
out Obj): Hresult;
{$ifdef IINTERFACE_STDCALL} stdcall {$else} cdecl {$endif};
begin
if GetInterface(IID, Obj) then
Result := S_OK else
Result := E_NOINTERFACE;
end;
end.
|