(* ***** 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 * * 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.