 -*- Mode: Text; tab-width: 4; indent-tabs-mode: nil -*-

 The contents of this file are subject to the Netscape Public License
 Version 1.0 (the "NPL"); you may not use this file except in
 compliance with the NPL.  You may obtain a copy of the NPL at
 http://www.mozilla.org/NPL/

 Software distributed under the NPL is distributed on an "AS IS" basis,
 WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
 for the specific language governing rights and limitations under the
 NPL.

 The Initial Developer of this code under the NPL is Netscape
 Communications Corporation.  Portions created by Netscape are
 Copyright (C) 1998 Netscape Communications Corporation.  All Rights
 Reserved.


-----------------------------------------------------------------------
        Netscape Navigator Unix Plugin Architecture V 0.9
-----------------------------------------------------------------------
Wed May 15 23:28:24 PDT 1996				dp@netscape.com


This document describes the architecture of the unix plugins.
This would help developers write their own plugins and interface them
with netscape.



Intended Audience
----------------------------------------------------------------------
        - Plugin developers on unix platforms

This assumes that the developer is aware of when and why a plugin is
required.



Platforms currently supported
----------------------------------------------------------------------
        - SunOS 4.1.3 and above
        - Solaris 5.3
        - Solaris 5.4
        - IRIX 5.2 and above
        - OSF1 V2.0 alpha and above
	- HPUX 09.* 10.*
	- Linux 1.2 (ELF)

Plugins require one of the following versions of the a unix navigator
	- Atlas Release
	- 3.0 browser



Contents
----------------------------------------------------------------------
        - General architecture of Netscape Unix Plugins SDK
        - How to write a plugin
        - Sample Text plugin
	- How to run the sample text plugin
	- Trouble Shooting the sample text plugin
        - Do's and Dont's
	- Resources


General architecture of Netscape Unix Plugins SDK
----------------------------------------------------------------------

----------------------------------------------------------------------
               |                         |
               |                         |
Netscape       |         Wrapper         |             Plugin Developer
Navigator      |         npunix.c        |             npshell.c
               |                         |
Talks with the | Implements function     |  Can ignore the existence of
the plugin via | tables as required      |  functions tables and call NPN_*()
wrapper code   | by the navigator's      |  functions to call the navigator
in npunix.c    | plugin interface and    |  and implement NPP_* functions
               | provides plugin         |  to hookup to the navigator.
               | developers with a       |
               | std. set of functions   |
               |                         |
               | WONT NEED TO EDIT THIS. | FILL UP functions in npshell.c
               | NEED TO COMPILE WITH    | and write many more...
               | THIS.                   |
----------------------------------------------------------------------

The plugin in the unix platform is implemented as a dynamically loadable
module (.so) The navigator searches for these dynamically loadable modules
in the list of directories as specified by the environment variable
NPX_PLUGIN_PATH. This variable can be set to a ':' separated list of
directories. The default path if this environment variable is not set
is "/usr/local/lib/netscape/plugins/:$HOME/.netscape/plugins/"

        NOTE: On SunOS4.1.3, if there are any non-loadable modules in
              any of the directories specified by NPX_PLUGIN_PATH, then
              the dlopen() library call exits rather than giving an error.
              thus causing the navigator to terminate.

The navigator detect which MIME types are recognized by a plugin by calling
NPP_GetMIMEDescription() in npshell.c (via NP_GetMIMEDescription() in
npunix.c). From then on, whenever it detect data of the
particular MIME type, it loads the plugin and creates instances of the
corresponding plugin object. Before creating the first plugin instance
the navigator will call NPP_Initialize() in npshell.c (via NP_Initialize()
in npunix.c). Also after the last plugin instance has been destroyed,
the navigator will call NPP_Shutdown() in npshell.c (via NP_Shutdown()
in npunix.c)


How to write a plugin
----------------------------------------------------------------------
        1. Fill up all the necessary functions in npshell.c
           To hook up and talk with the navigator. Refer to
           "The plugin API" for more information on these
           functions.

        2. Add new functions/files as required by your plugin.
           Use npapi.h for a description of data structures passed
           between the navigator and the plugin code.

        3. Compile the plugin code with npunix.c, npshell.c into
           a platform specific dynamically loadable module.

        4. Install the dynamically loadable module in NPX_PLUGIN_PATH,
	   "/usr/local/lib/netscape/plugins/:$HOME/.netscape/plugins/"
	   by default.

        5. Start the navigator. From now on, whenever the MIME type
           of interest to the plugin is encountered, the navigator
           will call the appropriate functions in the plugin.


Sample Text plugin
----------------------------------------------------------------------
As an example, here is a text plugin. This plugin is intended only to
demonstrate how plugin developers can write plugins. The text plugin
operates on MIME type and extension "text/plain;.txt"
So whenever the navigator gets data with mime type "text/plain"
(or) needs to display a file with the extension ".txt", it passes the
data over to the plugin code as discussed by the Plugin API. The text
plugin creates a scrolled window using motif and displays the data
it received in the window. All code that is specific to the text
plugin is ifdeffed TEXT_PLUGIN in npshell.c


How to run the sample text plugin
----------------------------------------------------------------------
        1. Compile the text plugin code to get a libtextplugin.so
        2. Make a directory say, $HOME/.netscape/plugins

                mkdir $HOME/.netscape/plugins

        3. Copy the libtextplugin.so to that directory

                cp libtextplugin.so $HOME/.netscape/plugins

        4. Set NPX_PLUGIN_PATH to that directory

            for csh:
                setenv NPX_PLUGIN_PATH $HOME/.netscape/plugins
            for ksh/sh:
                NPX_PLUGIN_PATH=$HOME/.netscape/plugins; export NPX_PLUGIN_PATH

        5. Invoke the netscape that is plugin enabled. In the location
           field type in the file URL address of Test1.html
            e.g if Test1.html was found in /home/dp/plugins/SDK/Test.html
                the URL to use would be
                file:/home/dp/plugins/SDK/Test1.html

	Result:
		You will see a page with a motif Multiline Text Widget
		that shows the contents of file Test.txt

		You might get some debug prints in stderr. To turn them
		off, compile your plugin without defining PLUGIN_TRACE.
		This change can be made in the makefile.

Trouble Shooting the sample text plugin
----------------------------------------------------------------------
If you dont see the text plugin,

        (a) See if the file Test1.txt is accessible using a http address

        (b) Check if the server returns "text/plain" as the mime type for
            http access to Test1.txt

	(c) Select Options->General Preferences->Helpers (if available)
	    in the browser and ensure that for the mime-type text/plain,
	    the Sample Text Plugin is enabled.

	(d) LINUX ELF: if you are writing a plugin for Linux that uses
	    the Motif library, that plugin will need to be linked statically
	    against Motif.  The reason for this is that the Mozilla executable
	    is itself compiled statically against Motif (since most Linux users
	    don't have libXm.so at all); and therefore, the Motif symbols are
	    not accessible to plugins.

	The test/ directory has a few plugin tests that you could run
	to verify if things are ok. Each test is a html file and explains
	how to run the test and verify the result.

            

Do's and Dont's
----------------------------------------------------------------------
        - INSTALL YOUR OWN EVENT HANDLERS FOR THE PLUGIN WINDOW TO
          GET EVENTS.
          Netscape Navigator uses Xt/Motif for its display. Plugins
          can use them and install their own event handlers for their
          window.

        - DONT USE WorkProcs IN Xt.
          WorkProcs will not be called.

        - USE THE X RESOURCE NAME SPACE WITH CARE.
          plugins and netscape share the same X resources space.
          So be sure your plugin gets it resources separately.
          The navigator resources do not follow a pattern although
          we eventually will. Until then, chose unique names that
          are not used by the navigator for its X resources for
          X resources and names of widgets used by plugins.

        - TAKE CARE WHEN INSTALLING TIMERS TO GET IDLE CYCLES.
          Plugins installing TIMERS to get idle cycles (e.g for doing
          some animation as long as the plugin is in view) by using the
          XtAppAddTimeOut() should take care to not install 0 interval
          timer callbacks. If they do, then the network events will never
          happen.



Resources
----------------------------------------------------------------------
A collection of resources that will be helpful in plugin development.
This collection is as of 15 May 1996.

http://home.netscape.com/comprod/development_partners/plugin_api/index.html
ftp://ftp.netscape.com/pub/navigator/sdk/
	- SDK is available here.

http://home.netscape.com/eng/mozilla/2.0/handbook/plugins/index.html
	- Plugin development handbook.

http://cgi.netscape.com/eng/mozilla/2.0/extensions/info.cgi
	- Default plugin will take you here.

snews://secnews.netscape.com/netscape.devs-plugins
	- Secure news group for netscape developement partners. All plugin
	  related discussion happens here. To enroll into this contact
	  developer relations at http://developer.netscape.com
