614 lines
21 KiB
ObjectPascal
614 lines
21 KiB
ObjectPascal
(* ***** BEGIN LICENSE BLOCK *****
|
|
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
|
*
|
|
* The contents of this file are subject to the Mozilla Public License Version
|
|
* 1.1 (the "License"); you may not use this file except in compliance with
|
|
* the License. You may obtain a copy of the License at
|
|
* http://www.mozilla.org/MPL/
|
|
*
|
|
* Software distributed under the License is distributed on an "AS IS" basis,
|
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
|
* for the specific language governing rights and limitations under the
|
|
* License.
|
|
*
|
|
* The Original Code is mozilla.org.
|
|
*
|
|
* The Initial Developer of the Original Code is
|
|
* Netscape Communications Corpotation.
|
|
* Portions created by the Initial Developer are Copyright (C) 1998
|
|
* the Initial Developer. All Rights Reserved.
|
|
*
|
|
* Contributor(s):
|
|
* Takanori Itou <necottie@nesitive.net>
|
|
*
|
|
* Alternatively, the contents of this file may be used under the terms of
|
|
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
|
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
|
* in which case the provisions of the GPL or the LGPL are applicable instead
|
|
* of those above. If you wish to allow use of your version of this file only
|
|
* under the terms of either the GPL or the LGPL, and not to allow others to
|
|
* use your version of this file under the terms of the MPL, indicate your
|
|
* decision by deleting the provisions above and replace them with the notice
|
|
* and other provisions required by the GPL or the LGPL. If you do not delete
|
|
* the provisions above, a recipient may use your version of this file under
|
|
* the terms of any one of the MPL, the GPL or the LGPL.
|
|
*
|
|
* ***** END LICENSE BLOCK ***** *)
|
|
unit nsXPCOMGlue;
|
|
|
|
{$MACRO on}
|
|
|
|
{$IFNDEF FPC_HAS_CONSTREF}
|
|
{$DEFINE constref:=const}
|
|
{$ENDIF}
|
|
|
|
interface
|
|
|
|
uses
|
|
nsXPCOM, nsTypes, nsGeckoStrings, SysUtils;
|
|
|
|
const
|
|
(*
|
|
* Original code: mozilla/xpcom/components/nsIServiceManager.idl
|
|
*)
|
|
NS_XPCOM_STARTUP_OBSERVER_ID = 'xpcom-startup';
|
|
NS_XPCOM_SHUTDOWN_OBSERVER_ID = 'xpcom-shutdown';
|
|
NS_XPCOM_AUTOREGISTRATION_OBSERVER_ID = 'xpcom-autoregistration';
|
|
|
|
(*
|
|
* Original code: mozilla/xpcom/glue/nsMemory.h
|
|
*)
|
|
NS_MEMORY_CONTRACTID = '@mozilla.org/xpcom/memory-service;1';
|
|
NS_MEMORY_CLASSNAME = 'Global Memory Service';
|
|
NS_MEMORY_CID: TGUID = '{30a04e40-38e7-11d4-8cf5-0060b0fc14a3}';
|
|
|
|
(*
|
|
* Original code: mozilla/xpcom/io/nsDirectoryServiceDefs.h
|
|
* Rev: 1.27
|
|
*)
|
|
(**
|
|
* Defines the property names for directories available from
|
|
* nsIDirectoryService. These dirs are always available even if no
|
|
* nsIDirectoryServiceProviders have been registered with the service.
|
|
* Application level keys are defined in nsAppDirectoryServiceDefs.h.
|
|
*
|
|
* Keys whose definition ends in "DIR" or "FILE" return a single nsIFile (or
|
|
* subclass). Keys whose definition ends in "LIST" return an nsISimpleEnumerator
|
|
* which enumerates a list of file objects.
|
|
*
|
|
* Defines listed in this file are FROZEN. This list may grow.
|
|
*)
|
|
NS_OS_HOME_DIR = 'Home';
|
|
NS_OS_TEMP_DIR = 'TmpD';
|
|
NS_OS_CURRENT_WORKING_DIR = 'CurWorkD';
|
|
NS_OS_DESKTOP_DIR = 'Desk';
|
|
NS_OS_CURRENT_PROCESS_DIR = 'CurProcD';
|
|
NS_XPCOM_CURRENT_PROCESS_DIR = 'XCurProcD';
|
|
NS_XPCOM_COMPONENT_DIR = 'ComsD';
|
|
NS_XPCOM_COMPONENT_DIR_LIST = 'ComsDL';
|
|
NS_XPCOM_COMPONENT_REGISTRY_FILE = 'ComRegF';
|
|
NS_XPCOM_XPTI_REGISTRY_FILE = 'XptiRegF';
|
|
NS_XPCOM_LIBRARY_FILE = 'XpcomLib';
|
|
NS_GRE_DIR = 'GreD';
|
|
NS_GRE_COMPONENT_DIR = 'GreComsD';
|
|
NS_WIN_WINDOWS_DIR = 'WinD';
|
|
NS_WIN_HOME_DIR = NS_OS_HOME_DIR;
|
|
NS_WIN_DESKTOP_DIR = 'DeskV';// virtual folder at the root of the namespace
|
|
NS_WIN_PROGRAMS_DIR = 'Progs';
|
|
NS_WIN_CONTROLS_DIR = 'Cntls';
|
|
NS_WIN_PRINTERS_DIR = 'Prnts';
|
|
NS_WIN_PERSONAL_DIR = 'Pers';
|
|
NS_WIN_FAVORITES_DIR = 'Favs';
|
|
NS_WIN_STARTUP_DIR = 'Strt';
|
|
NS_WIN_RECENT_DIR = 'Rcnt';
|
|
NS_WIN_SEND_TO_DIR = 'SndTo';
|
|
NS_WIN_BITBUCKET_DIR = 'Buckt';
|
|
NS_WIN_STARTMENU_DIR = 'Strt';
|
|
NS_WIN_DESKTOP_DIRECTORY = 'DeskP';// file sys dir which physically stores objects on desktop
|
|
NS_WIN_DRIVES_DIR = 'Drivs';
|
|
NS_WIN_NETWORK_DIR = 'NetW';
|
|
NS_WIN_NETHOOD_DIR = 'netH';
|
|
NS_WIN_FONTS_DIR = 'Fnts';
|
|
NS_WIN_TEMPLATES_DIR = 'Tmpls';
|
|
NS_WIN_COMMON_STARTMENU_DIR = 'CmStrt';
|
|
NS_WIN_COMMON_PROGRAMS_DIR = 'CmPrgs';
|
|
NS_WIN_COMMON_STARTUP_DIR = 'CmStrt';
|
|
NS_WIN_COMMON_DESKTOP_DIRECTORY = 'CmDeskP';
|
|
NS_WIN_APPDATA_DIR = 'AppData';
|
|
NS_WIN_PRINTHOOD = 'PrntHd';
|
|
NS_WIN_COOKIES_DIR = 'CookD';
|
|
(* Deprecated *)
|
|
NS_OS_DRIVE_DIR = 'DrvD';
|
|
|
|
(*
|
|
* Original Code: mozilla/xpcom/io/nsAppDirectoryServiceDefs.h
|
|
* Revision: 1.16
|
|
*)
|
|
NS_APP_APPLICATION_REGISTRY_FILE = 'AppRegF';
|
|
NS_APP_APPLICATION_REGISTRY_DIR = 'AppRegD';
|
|
NS_APP_DEFAULTS_50_DIR = 'DefRt'; // The root dir of all defaults dirs
|
|
NS_APP_PREF_DEFAULTS_50_DIR = 'PrfDef';
|
|
NS_APP_PROFILE_DEFAULTS_50_DIR = 'profDef'; // The profile defaults of the "current"
|
|
// locale. Should be first choice.
|
|
NS_APP_PROFILE_DEFAULTS_NLOC_50_DIR = 'ProfDefNoLoc'; // The profile defaults of the "default"
|
|
// installed locale. Second choice
|
|
// when above is not available.
|
|
NS_APP_USER_PROFILES_ROOT_DIR = 'DefProfRt'; // The dir where user profile dirs get created.
|
|
NS_APP_RES_DIR = 'ARes';
|
|
NS_APP_CHROME_DIR = 'AChrom';
|
|
NS_APP_PLUGINS_DIR = 'APlugns'; // Deprecated - use NS_APP_PLUGINS_DIR_LIST
|
|
NS_APP_SEARCH_DIR = 'SrchPlugns';
|
|
NS_APP_CHROME_DIR_LIST = 'AChromeDL';
|
|
NS_APP_PLUGINS_DIR_LIST = 'APluginsDL';
|
|
NS_SHARED = 'SHARED';
|
|
NS_APP_PREFS_50_DIR = 'PrefD'; // Directory which contains user prefs
|
|
NS_APP_PREFS_50_FILE = 'PrefF';
|
|
NS_APP_PREFS_DEFAULTS_DIR_LIST = 'PrefDL';
|
|
NS_APP_USER_PROFILE_50_DIR = 'ProfD';
|
|
NS_APP_USER_CHROME_DIR = 'UChrm';
|
|
NS_APP_LOCALSTORE_50_FILE = 'LclSt';
|
|
NS_APP_HISTORY_50_FILE = 'UHist';
|
|
NS_APP_USER_PANELS_50_FILE = 'UPnls';
|
|
NS_APP_USER_MIMETYPES_50_FILE = 'UMimTyp';
|
|
NS_APP_CACHE_PARENT_DIR = 'cachePDir';
|
|
NS_APP_BOOKMARKS_50_FILE = 'BMarks';
|
|
NS_APP_DOWNLOADS_50_FILE = 'DLoads';
|
|
NS_APP_SEARCH_50_FILE = 'SrchF';
|
|
NS_APP_MAIL_50_DIR = 'MailD';
|
|
NS_APP_IMAP_MAIL_50_DIR = 'IMapMD';
|
|
NS_APP_NEWS_50_DIR = 'NewsD';
|
|
NS_APP_MESSENGER_FOLDER_CACHE_50_DIR = 'MFCaD';
|
|
NS_APP_INSTALL_CLEANUP_DIR = 'XPIClnupD'; //location of xpicleanup.dat xpicleanup.exe
|
|
NS_APP_STORAGE_50_FILE = 'UStor';
|
|
|
|
procedure NS_CreateInstance(const CID, IID: TGUID; out Intf); overload;
|
|
procedure NS_CreateInstance(ContractID: PAnsiChar; constref IID: TGUID; out Intf); overload;
|
|
function NS_GetWeakReference(Instance: nsISupports): nsIWeakReference;
|
|
procedure NS_GetInterface(Source: nsISupports; constref IID: TGUID; out Instance);
|
|
procedure NS_GetService(const CID, IID: TGUID; out Intf); overload;
|
|
procedure NS_GetService(ContractID: PAnsiChar; constref IID: TGUID; out Intf); overload;
|
|
function NS_GetSpecialDirectory(const specialDirName: PAnsiChar): nsIFile;
|
|
|
|
const
|
|
NS_PREFLOCALIZEDSTRING_CID: TGUID = '{064d9cee-1dd2-11b2-83e3-d25ab0193c26}';
|
|
NS_PREFLOCALIZEDSTRING_CONTRACTID = '@mozilla.org/pref-localizedstring;1';
|
|
NS_PREFLOCALIZEDSTRING_CLASSNAME = 'Pref LocalizedString';
|
|
|
|
NS_PREFSERVICE_CID: TGUID = '{1cd91b88-1dd2-11b2-92e1-ed22ed298000}';
|
|
NS_PREFSERVICE_CONTRACTID = '@mozilla.org/preferences-service;1';
|
|
NS_PREFSERVICE_CLASSNAME = 'Preferences Server';
|
|
NS_PREFSERVICE_RESET_TOPIC_ID = 'prefservice:before-reset';
|
|
|
|
STATUS_UNKNOWN=0;
|
|
STATUS_ACCEPTED=1;
|
|
STATUS_DOWNGRADED=2;
|
|
STATUS_FLAGGED=3;
|
|
STATUS_REJECTED=4;
|
|
POLICY_UNKNOWN=0;
|
|
POLICY_NONE=1;
|
|
POLICY_NO_CONSENT=2;
|
|
POLICY_IMPLICIT_CONSENT=3;
|
|
POLICY_EXPLICIT_CONSENT=4;
|
|
POLICY_NO_II=5;
|
|
|
|
NS_COOKIEPROMPTSERVICE_CONTRACTID = '@mozilla.org/embedcomp/cookieprompt-service;1';
|
|
|
|
NS_WINDOWWATCHER_CONTRACTID = '@mozilla.org/embedcomp/window-watcher;1';
|
|
|
|
NS_WEBBROWSER_CID: TGUID = '{f1eac761-87e9-11d3-af80-00a024ffc08c}';
|
|
NS_WEBBROWSER_CONTRACTID = '@mozilla.org/embedding/browser/nsWebBrowser;1';
|
|
|
|
STATUS_SCRIPT = $00000001;
|
|
STATUS_SCRIPT_DEFAULT = $00000002;
|
|
STATUS_LINK = $00000003;
|
|
CHROME_DEFAULT = $00000001;
|
|
CHROME_WINDOW_BORDERS = $00000002;
|
|
CHROME_WINDOW_CLOSE = $00000004;
|
|
CHROME_WINDOW_RESIZE = $00000008;
|
|
CHROME_MENUBAR = $00000010;
|
|
CHROME_TOOLBAR = $00000020;
|
|
CHROME_LOCATIONBAR = $00000040;
|
|
CHROME_STATUSBAR = $00000080;
|
|
CHROME_PERSONAL_TOOLBAR = $00000100;
|
|
CHROME_SCROLLBARS = $00000200;
|
|
CHROME_TITLEBAR = $00000400;
|
|
CHROME_EXTRA = $00000800;
|
|
CHROME_WITH_SIZE = $00001000;
|
|
CHROME_WITH_POSITION = $00002000;
|
|
CHROME_WINDOW_MIN = $00004000;
|
|
CHROME_WINDOW_POPUP = $00008000;
|
|
CHROME_WINDOW_RAISED = $02000000;
|
|
CHROME_WINDOW_LOWERED = $04000000;
|
|
CHROME_CENTER_SCREEN = $08000000;
|
|
CHROME_DEPENDENT = $10000000;
|
|
CHROME_MODAL = $20000000;
|
|
CHROME_OPENAS_DIALOG = $40000000;
|
|
CHROME_OPENAS_CHROME = $80000000;
|
|
CHROME_ALL = $00000ffe;
|
|
|
|
SETUP_ALLOW_PLUGINS = 1;
|
|
SETUP_ALLOW_JAVASCRIPT = 2;
|
|
SETUP_ALLOW_META_REDIRECTS = 3;
|
|
SETUP_ALLOW_SUBFRAMES = 4;
|
|
SETUP_ALLOW_IMAGES = 5;
|
|
SETUP_FOCUS_DOC_BEFORE_CONTENT = 6;
|
|
SETUP_USE_GLOBAL_HISTORY = 256;
|
|
SETUP_IS_CHROME_WRAPPER = 7;
|
|
|
|
PRINTPREVIEW_GOTO_PAGENUM = 0;
|
|
PRINTPREVIEW_PREV_PAGE = 1;
|
|
PRINTPREVIEW_NEXT_PAGE = 2;
|
|
PRINTPREVIEW_HOME = 3;
|
|
PRINTPREVIEW_END = 4;
|
|
|
|
DIM_FLAGS_POSITION = 1;
|
|
DIM_FLAGS_SIZE_INNER = 2;
|
|
DIM_FLAGS_SIZE_OUTER = 4;
|
|
|
|
CONTEXT_NONE = 0;
|
|
CONTEXT_LINK = 1;
|
|
CONTEXT_IMAGE = 2;
|
|
CONTEXT_DOCUMENT = 4;
|
|
CONTEXT_TEXT = 8;
|
|
CONTEXT_INPUT = 16;
|
|
CONTEXT_BACKGROUND_IMAGE = 32;
|
|
|
|
STATE_START = $00000001;
|
|
STATE_REDIRECTING = $00000002;
|
|
STATE_TRANSFERRING = $00000004;
|
|
STATE_NEGOTIATING = $00000008;
|
|
STATE_STOP = $00000010;
|
|
STATE_IS_REQUEST = $00010000;
|
|
STATE_IS_DOCUMENT = $00020000;
|
|
STATE_IS_NETWORK = $00040000;
|
|
STATE_IS_WINDOW = $00080000;
|
|
STATE_IS_INSECURE = $00000004;
|
|
STATE_IS_BROKEN = $00000001;
|
|
STATE_IS_SECURE = $00000002;
|
|
STATE_SECURE_HIGH = $00040000;
|
|
STATE_SECURE_MED = $00010000;
|
|
STATE_SECURE_LOW = $00020000;
|
|
|
|
NOTIFY_STATE_REQUEST = $00000001;
|
|
NOTIFY_STATE_DOCUMENT = $00000002;
|
|
NOTIFY_STATE_NETWORK = $00000004;
|
|
NOTIFY_STATE_WINDOW = $00000008;
|
|
NOTIFY_STATE_ALL = $0000000f;
|
|
NOTIFY_PROGRESS = $00000010;
|
|
NOTIFY_STATUS = $00000020;
|
|
NOTIFY_SECURITY = $00000040;
|
|
NOTIFY_LOCATION = $00000080;
|
|
NOTIFY_ALL = $000000ff;
|
|
|
|
type
|
|
TWeakReference = class;
|
|
TSupportsWeakReference = class;
|
|
|
|
TWeakReference = class(TInterfacedObject, nsIWeakReference)
|
|
private
|
|
FSupports: TSupportsWeakReference;
|
|
public
|
|
constructor Create(supports: TSupportsWeakReference);
|
|
destructor Destroy; override;
|
|
procedure QueryReferent(constref uuid: TGUID; out Intf); safecall;
|
|
end;
|
|
|
|
TSupportsWeakReference = class(TInterfacedObject, nsISupportsWeakReference)
|
|
private
|
|
FProxy: TWeakReference;
|
|
public
|
|
destructor Destroy; override;
|
|
function GetWeakReference: nsIWeakReference; safecall;
|
|
end;
|
|
|
|
{ IDirectoryServiceProvider }
|
|
|
|
IDirectoryServiceProvider = class(TInterfacedObject,
|
|
nsIDirectoryServiceProvider)
|
|
private
|
|
FCacheParentDir: UTF8String;
|
|
FProfileDir: UTF8String;
|
|
procedure SetCacheDir(const AValue: UTF8String);
|
|
procedure SetProfileDir(const AValue: UTF8String);
|
|
public
|
|
function GetFile(const prop: PAnsiChar; out persistent: PRBool): nsIFile; safecall;
|
|
property CacheParentDir: UTF8String read FCacheParentDir write SetCacheDir;
|
|
property ProfileDir: UTF8String read FProfileDir write SetProfileDir;
|
|
end;
|
|
|
|
EGeckoException = class (Exception);
|
|
EGeckoError = class(EGeckoException); //Gecko error. It is an error.
|
|
EGeckoHint = class(EGeckoException); //Gecko Hint. It does not necessary means an error. They could be hidden.
|
|
|
|
function NS_NewSupportsWeakReferenceDelegate(aTarget: nsISupports): nsISupportsWeakReference;
|
|
|
|
resourcestring
|
|
SGetComponentManagerError = 'Cannot get the Component Manager.';
|
|
SGetServiceManagerError = 'Cannot get the Service Manager.';
|
|
SCreateInstanceError = 'Cannot get the instance of CID ''%s.'' ';
|
|
SGetServiceError = 'Cannot get the service of CID ''%s.'' ';
|
|
SNoSuchSpecialDir = 'Cannot get the Special Directory ''%s.'' ';
|
|
SNoSuchInterface = 'Cannot get the Interface ''%s.'' ';
|
|
|
|
var
|
|
GeckoEngineDirectoryService: IDirectoryServiceProvider;
|
|
|
|
implementation
|
|
|
|
uses
|
|
nsMemory, nsError, nsInit {$IFDEF MSWINDOWS} ,Windows {$ENDIF};
|
|
|
|
var
|
|
sCompMgr: nsIComponentManager = nil;
|
|
sSrvMgr: nsIServiceManager = nil;
|
|
|
|
|
|
procedure NS_CreateInstance(const CID, IID: TGUID; out Intf);
|
|
var
|
|
rv: nsresult;
|
|
begin
|
|
rv := NS_OK;
|
|
if not Assigned(sCompMgr) then
|
|
rv := NS_GetComponentManager(sCompMgr);
|
|
if NS_FAILED(rv) or not Assigned(sCompMgr) then
|
|
raise EGeckoError.CreateRes(PResStringRec(@SGetComponentManagerError));
|
|
|
|
try
|
|
sCompMgr.CreateInstance(CID, nil, IID, Intf);
|
|
except
|
|
raise EGeckoError.CreateResFmt(PResStringRec(@SCreateInstanceError), [GUIDToString(CID)]);
|
|
end;
|
|
end;
|
|
|
|
procedure NS_CreateInstance(ContractID: PAnsiChar; constref IID: TGUID; out Intf);
|
|
var
|
|
rv: nsresult;
|
|
begin
|
|
rv := NS_OK;
|
|
if not Assigned(sCompMgr) then
|
|
rv := NS_GetComponentManager(sCompMgr);
|
|
if NS_FAILED(rv) or not Assigned(sCompMgr) then
|
|
raise EGeckoError.CreateRes(PResStringRec(@SGetComponentManagerError));
|
|
|
|
try
|
|
sCompMgr.CreateInstanceByContractID(ContractID, nil, IID, Intf);
|
|
except
|
|
raise EGeckoError.CreateResFmt(PResStringRec(@SCreateInstanceError), [String(ContractID)]);
|
|
end;
|
|
end;
|
|
|
|
procedure NS_GetService(const CID, IID: TGUID; out Intf);
|
|
var
|
|
rv: nsresult;
|
|
begin
|
|
rv := NS_OK;
|
|
if not Assigned(sSrvMgr) then
|
|
rv := NS_GetServiceManager(sSrvMgr);
|
|
if NS_FAILED(rv) or not Assigned(sSrvMgr) then
|
|
raise EGeckoError.CreateRes(PResStringRec(@SGetServiceManagerError));
|
|
|
|
try
|
|
sSrvMgr.GetService(CID, IID, Intf);
|
|
except
|
|
raise EGeckoError.CreateResFmt(PResStringRec(@SGetServiceError), [GUIDToString(CID)]);
|
|
end;
|
|
end;
|
|
|
|
procedure NS_GetService(ContractID: PAnsiChar; constref IID: TGUID; out Intf);
|
|
var
|
|
rv: nsresult;
|
|
begin
|
|
rv := NS_OK;
|
|
if not Assigned(sSrvMgr) then
|
|
rv := NS_GetServiceManager(sSrvMgr);
|
|
if NS_FAILED(rv) or not Assigned(sSrvMgr) then
|
|
raise EGeckoError.CreateRes(PResStringRec(@SGetServiceManagerError));
|
|
|
|
try
|
|
sSrvMgr.GetServiceByContractID(ContractID, IID, Intf);
|
|
except
|
|
raise EGeckoError.CreateResFmt(PResStringRec(@SGetServiceError), [ContractID]);
|
|
end;
|
|
end;
|
|
|
|
function NS_GetSpecialDirectory(const specialDirName: PAnsiChar): nsIFile;
|
|
var
|
|
serv: nsIProperties;
|
|
const
|
|
NS_DIRECTORY_SERVICE_CID: TGUID = '{f00152d0-b40b-11d3-8c9c-000064657374}';
|
|
begin
|
|
NS_GetService(NS_DIRECTORY_SERVICE_CID, nsIProperties, serv);
|
|
|
|
try
|
|
serv.Get(specialDirName, nsIFile, Result);
|
|
except
|
|
raise EGeckoError.CreateResFmt(PResStringRec(@SNoSuchSpecialDir), [specialDirName]);
|
|
end;
|
|
end;
|
|
|
|
constructor TWeakReference.Create(supports: TSupportsWeakReference);
|
|
begin
|
|
inherited Create;
|
|
FSupports := supports;
|
|
end;
|
|
|
|
destructor TWeakReference.Destroy;
|
|
begin
|
|
if Assigned(FSupports) then
|
|
FSupports.FProxy := nil;
|
|
inherited;
|
|
end;
|
|
|
|
procedure TWeakReference.QueryReferent(constref uuid: TGUID; out Intf);
|
|
var
|
|
rv: nsresult;
|
|
begin
|
|
rv := FSupports.QueryInterface(uuid, Intf);
|
|
if NS_FAILED(rv) then begin
|
|
//This is not a catastrophic error, so no exception is needed.
|
|
//In example the uuid {DDE39DE0-E4E0-11DA-8AD9-0800200C9A66} request
|
|
//for a nsIWebProgressListener2. Just answering nothing does not
|
|
//produce an "error".
|
|
{$IFDEF DEBUG}
|
|
OutputDebugString('Missing interface in TWeakReference.QueryReferent '+GUIDToString(uuid));
|
|
{$ENDIF}
|
|
//raise EGeckoError.Create('QueryReference Error');
|
|
//System.Error(reIntfCastError);
|
|
end;
|
|
end;
|
|
|
|
destructor TSupportsWeakReference.Destroy;
|
|
begin
|
|
if Assigned(FProxy) then
|
|
FProxy.FSupports := nil;
|
|
inherited;
|
|
end;
|
|
|
|
function TSupportsWeakReference.GetWeakReference: nsIWeakReference;
|
|
begin
|
|
if not Assigned(FProxy) then
|
|
FProxy := TWeakReference.Create(Self);
|
|
|
|
if NS_FAILED(FProxy.QueryInterface(nsIWeakReference, Result)) then
|
|
System.Error(reIntfCastError);
|
|
end;
|
|
|
|
function NS_GetWeakReference(Instance: nsISupports): nsIWeakReference;
|
|
var
|
|
factory: nsISupportsWeakReference;
|
|
begin
|
|
if Assigned(Instance) then
|
|
try
|
|
factory := Instance as nsISupportsWeakReference;
|
|
Result := factory.GetWeakReference();
|
|
except
|
|
Result := nil;
|
|
end;
|
|
end;
|
|
|
|
procedure NS_GetInterface(Source: nsISupports; constref IID: TGUID; out Instance);
|
|
var
|
|
factory: nsIInterfaceRequestor;
|
|
begin
|
|
if Assigned(Source) then
|
|
try
|
|
factory := Source as nsIInterfaceRequestor;
|
|
factory.GetInterface(IID, Instance);
|
|
except
|
|
raise EGeckoError.CreateResFmt(PResStringRec(@SNoSuchInterface), [GUIDToString(IID)]);
|
|
end else
|
|
System.Error(reInvalidPtr);
|
|
end;
|
|
|
|
type
|
|
TSupportsWeakReferenceInternal = class;
|
|
TWeakReferenceInternal = class;
|
|
|
|
TSupportsWeakReferenceInternal = class(TInterfacedObject,
|
|
nsISupportsWeakReference)
|
|
FTarget: nsISupports;
|
|
FProxy: TWeakReferenceInternal;
|
|
constructor Create(ATarget: nsISupports);
|
|
destructor Destroy; override;
|
|
function getWeakReference: nsIWeakReference; safecall;
|
|
end;
|
|
|
|
TWeakReferenceInternal = class(TInterfacedObject,
|
|
nsIWeakReference)
|
|
FReferent: TSupportsWeakReferenceInternal;
|
|
constructor Create(aReferent: TSupportsWeakReferenceInternal);
|
|
destructor Destroy; override;
|
|
procedure QueryReferent(constref iid: TGUID; out Intf); safecall;
|
|
end;
|
|
|
|
function NS_NewSupportsWeakReferenceDelegate(aTarget: nsISupports): nsISupportsWeakReference;
|
|
begin
|
|
Result := TSupportsWeakReferenceInternal.Create(aTarget);
|
|
end;
|
|
|
|
constructor TSupportsWeakReferenceInternal.Create(ATarget: nsISupports);
|
|
begin
|
|
inherited Create;
|
|
FTarget := ATarget;
|
|
// FProxy := nil; // non-initialized value set to zero
|
|
end;
|
|
|
|
destructor TSupportsWeakReferenceInternal.Destroy;
|
|
begin
|
|
if Assigned(FProxy) then
|
|
FProxy.FReferent := nil;
|
|
inherited;
|
|
end;
|
|
|
|
function TSupportsWeakReferenceInternal.getWeakReference: nsIWeakReference;
|
|
begin
|
|
if not Assigned(FProxy) then
|
|
begin
|
|
FProxy := TWeakReferenceInternal.Create(Self);
|
|
end;
|
|
|
|
Result := FProxy;
|
|
end;
|
|
|
|
constructor TWeakReferenceInternal.Create(aReferent: TSupportsWeakReferenceInternal);
|
|
begin
|
|
inherited Create;
|
|
|
|
FReferent := aReferent;
|
|
end;
|
|
|
|
destructor TWeakReferenceInternal.Destroy;
|
|
begin
|
|
if Assigned(FReferent) then
|
|
FReferent.FProxy := nil;
|
|
|
|
inherited;
|
|
end;
|
|
|
|
procedure TWeakReferenceInternal.QueryReferent(constref iid: TGUID; out intf);
|
|
begin
|
|
if not Supports(FReferent.FTarget, iid, intf) then
|
|
System.Error(reIntfCastError);
|
|
end;
|
|
|
|
{ IDirectoryServiceProvider }
|
|
|
|
procedure IDirectoryServiceProvider.SetCacheDir(const AValue: UTF8String);
|
|
begin
|
|
if FCacheParentDir=AValue then exit;
|
|
FCacheParentDir:=AValue;
|
|
end;
|
|
|
|
procedure IDirectoryServiceProvider.SetProfileDir(const AValue: UTF8String);
|
|
begin
|
|
if FProfileDir=AValue then exit;
|
|
FProfileDir:=AValue;
|
|
end;
|
|
|
|
function IDirectoryServiceProvider.GetFile(const prop: PAnsiChar; out
|
|
persistent: PRBool): nsIFile; safecall;
|
|
var
|
|
Local: nsILocalFile;
|
|
begin
|
|
persistent:=true; //Only ask one time for each directory, it will be remembered
|
|
//by the Gecko engine while running.
|
|
if prop = 'ProfD' then //Profile directory
|
|
begin
|
|
if FProfileDir<>'' then
|
|
begin
|
|
NS_NewLocalFile(NewString(FProfileDir).AString,false,Local);
|
|
Local.QueryInterface(nsILocalFile,Result);
|
|
end;
|
|
end else
|
|
if prop = 'cachePDir' then //Cache directory
|
|
begin
|
|
if FCacheParentDir<>'' then
|
|
begin
|
|
NS_NewLocalFile(NewString(FCacheParentDir).AString,false,Local);
|
|
Local.QueryInterface(nsILocalFile,Result);
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
end.
|