mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-12-11 16:32:59 +00:00
139 lines
4.9 KiB
HTML
139 lines
4.9 KiB
HTML
<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
|
|
<html>
|
|
<head>
|
|
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
|
<meta name="GENERATOR" content="Mozilla/4.61 [en] (X11; U; Linux 2.0.36 i686) [Netscape]">
|
|
</head>
|
|
<body>
|
|
|
|
<center>
|
|
<h2>
|
|
Component Loaders</h2></center>
|
|
|
|
<center>Brendan Eich <<a href="mailto:brendan@mozilla.org">brendan@mozilla.org</a>>
|
|
<br>John Bandauer <<a href="mailto:jband@netscape.com">jband@netscape.com</a>>
|
|
<br>Mike McCabe <<a href="mailto:mccabe@netscape.com">mccabe@netscape.com</a>>
|
|
<br>Mike Shaver <<a href="mailto:shaver@mozilla.org">shaver@mozilla.org</a>>
|
|
<br>Suresh Duddi <<a href="mailto:dp@netscape.com">dp@netscape.com</a>></center>
|
|
|
|
<h3>
|
|
Scope of document</h3>
|
|
|
|
<ul>
|
|
<li>
|
|
Component Developers</li>
|
|
|
|
<li>
|
|
Clients of XPCOM (for information only)</li>
|
|
</ul>
|
|
|
|
<h3>
|
|
Why Component Loaders</h3>
|
|
Currently XPCOM requires all component to be packaged in dlls and uses
|
|
the dynamic loading mechanism available with each platform to accomplish
|
|
instantiation of component. This method doesn't blend well with say components
|
|
written in java or javascript and packaged different from a dll. Hence
|
|
the proposal for Component Loaders.
|
|
<br>
|
|
<h3>
|
|
Component Loaders</h3>
|
|
XPCOM in its simplest form can be viewed as creating instances of objects
|
|
given a PROGID or ClassID. How it does this instantiation is specific to
|
|
XPCOM and opaque to clients of XPCOM.
|
|
<p>Internally XPCOM maps the passed in PROGID to a CID and then the CID
|
|
maps into a dll name. XPCOM loads the dll assuming the dynamic loading
|
|
mechanism to create a factory. Then, asks the factory to create a particular
|
|
instance. Here are roughly the steps involved:
|
|
<ol>
|
|
<li>
|
|
CreateInstance(..., PROGID,...)</li>
|
|
|
|
<li>
|
|
Map PROGID to CID</li>
|
|
|
|
<li>
|
|
Map CID to Dll</li>
|
|
|
|
<li>
|
|
factory = Dynamicall Load Dll to create Factory</li>
|
|
|
|
<li>
|
|
Use Factory to create object instance</li>
|
|
</ol>
|
|
The proposal for Component Loaders is to get XPCOM to delegate the loading
|
|
to a component loader:
|
|
<ul>
|
|
<li>
|
|
CreateInstance(..., PROGID,...)</li>
|
|
|
|
<li>
|
|
Map PROGID to CID</li>
|
|
|
|
<li>
|
|
<font color="#990000">Map CID to ComponentType</font></li>
|
|
|
|
<li>
|
|
<font color="#990000">If ComponentType is Dll</font></li>
|
|
|
|
<ul>
|
|
<li>
|
|
factory = Dynamically Load Dll to create Factory</li>
|
|
</ul>
|
|
|
|
<li>
|
|
<font color="#990000">else</font></li>
|
|
|
|
<ul>
|
|
<li>
|
|
<font color="#990000">ComponentLoaderServicePROGID = "<i>component://Netscape/XPCOM/component-loader&type=</i>"
|
|
+ ComponentType</font></li>
|
|
|
|
<li>
|
|
<font color="#990000">loaderInstance = GetService(..., ComponentLoaderServicePROGID,...)</font></li>
|
|
|
|
<li>
|
|
<font color="#990000">factory = loaderInstance->CreateFactory(..., componentLocation,...)</font></li>
|
|
</ul>
|
|
|
|
<li>
|
|
Use Factory to create object instance</li>
|
|
|
|
<h4>
|
|
Format of ComponentType</h4>
|
|
ComponentType is assumed to be mimetype.
|
|
<h4>
|
|
Component Registration</h4>
|
|
Registration of components in Dlls wont change. ComponentType of Dll is
|
|
assumed here. To facilitate registration of components with specifc component
|
|
types, the component manager will provide the following API:
|
|
<p><tt><font color="#990000">RegisterComponentWithType(const nsCID &aClass,</font></tt>
|
|
<br><tt><font color="#990000">
|
|
const char *aClassName,</font></tt>
|
|
<br><tt><font color="#990000">
|
|
const char *aProgID,</font></tt>
|
|
<br><tt><font color="#990000">
|
|
const char *ComponentType,</font></tt>
|
|
<br><tt><font color="#990000">
|
|
const char *ComponentLocation,</font></tt>
|
|
<br><tt><font color="#990000">
|
|
PRBool aReplace,</font></tt>
|
|
<br><tt><font color="#990000">
|
|
PRBool aPersist);</font></tt>
|
|
<br>
|
|
<br>
|
|
<h4>
|
|
Component Loader Service Registration</h4>
|
|
Since the loader is just another component with a special progid, there
|
|
is no special registration of the component loader. Component Loaders
|
|
use either the RegisterComponent() api if they are a dll (most common)
|
|
or use RegisterComponentWithType() api if they are themselves of a particular
|
|
type (very rare).</ul>
|
|
|
|
<h3>
|
|
Autoregistration of non Dll Components and Component Loaders</h3>
|
|
TBD
|
|
<br>
|
|
<hr WIDTH="100%">
|
|
</body>
|
|
</html>
|