/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
 *
 * 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.
 */

////////////////////////////////////////////////////////////////////////////////
// INTERFACE TO NETSCAPE COMMUNICATOR PLUGINS (NEW C++ API).
//
// This superscedes the old plugin API (npapi.h, npupp.h), and 
// eliminates the need for glue files: npunix.c, npwin.cpp and npmac.cpp. 
// Correspondences to the old API are shown throughout the file.
////////////////////////////////////////////////////////////////////////////////

// XXX THIS HEADER IS A BETA VERSION OF THE NEW PLUGIN INTERFACE.
// USE ONLY FOR EXPERIMENTAL PURPOSES!

#ifndef nsIPlug_h___
#define nsIPlug_h___

#ifdef __OS2__
#pragma pack(1)
#endif

// XXX Move this XP_ defining stuff to xpcom or nspr... 

#if defined (__OS2__ ) || defined (OS2)
#	ifndef XP_OS2
#		define XP_OS2 1
#	endif /* XP_OS2 */
#endif /* __OS2__ */

#ifdef _WINDOWS
#	ifndef XP_WIN
#		define XP_WIN 1
#	endif /* XP_WIN */
#endif /* _WINDOWS */

#ifdef __MWERKS__
#	define _declspec __declspec
#	ifdef macintosh
#		ifndef XP_MAC
#			define XP_MAC 1
#		endif /* XP_MAC */
#	endif /* macintosh */
#	ifdef __INTEL__
#		undef NULL
#		ifndef XP_WIN
#			define XP_WIN 1
#		endif /* __INTEL__ */
#	endif /* XP_PC */
#endif /* __MWERKS__ */

#ifdef XP_MAC
	#include <Quickdraw.h>
	#include <Events.h>
#endif

#ifdef XP_UNIX
	#include <X11/Xlib.h>
	#include <X11/Xutil.h>
#endif

#ifdef XP_PC
	#include <windef.h>
#endif

#include "nsISupports.h"

////////////////////////////////////////////////////////////////////////////////

/* The OS/2 version of Netscape uses RC_DATA to define the
   mime types, file extentions, etc that are required.
   Use a vertical bar to seperate types, end types with \0.
   FileVersion and ProductVersion are 32bit ints, all other
   entries are strings the MUST be terminated wwith a \0.

AN EXAMPLE:

RCDATA NP_INFO_ProductVersion { 1,0,0,1,}

RCDATA NP_INFO_MIMEType    { "video/x-video|",
                             "video/x-flick\0" }
RCDATA NP_INFO_FileExtents { "avi|",
                             "flc\0" }
RCDATA NP_INFO_FileOpenName{ "MMOS2 video player(*.avi)|",
                             "MMOS2 Flc/Fli player(*.flc)\0" }

RCDATA NP_INFO_FileVersion       { 1,0,0,1 }
RCDATA NP_INFO_CompanyName       { "Netscape Communications\0" }
RCDATA NP_INFO_FileDescription   { "NPAVI32 Extension DLL\0"
RCDATA NP_INFO_InternalName      { "NPAVI32\0" )
RCDATA NP_INFO_LegalCopyright    { "Copyright Netscape Communications \251 1996\0"
RCDATA NP_INFO_OriginalFilename  { "NVAPI32.DLL" }
RCDATA NP_INFO_ProductName       { "NPAVI32 Dynamic Link Library\0" }

*/


/* RC_DATA types for version info - required */
#define NP_INFO_ProductVersion      1
#define NP_INFO_MIMEType            2
#define NP_INFO_FileOpenName        3
#define NP_INFO_FileExtents         4

/* RC_DATA types for version info - used if found */
#define NP_INFO_FileDescription     5
#define NP_INFO_ProductName         6

/* RC_DATA types for version info - optional */
#define NP_INFO_CompanyName         7
#define NP_INFO_FileVersion         8
#define NP_INFO_InternalName        9
#define NP_INFO_LegalCopyright      10
#define NP_INFO_OriginalFilename    11

#ifndef RC_INVOKED

////////////////////////////////////////////////////////////////////////////////
// Structures and definitions

#ifdef XP_MAC
#pragma options align=mac68k
#endif

typedef const char*     nsMIMEType;

struct nsByteRange {
    PRInt32             offset; 	/* negative offset means from the end */
    PRUint32            length;
    struct nsByteRange* next;
};

struct nsRect {
    PRUint16            top;
    PRUint16            left;
    PRUint16            bottom;
    PRUint16            right;
};

////////////////////////////////////////////////////////////////////////////////
// Unix specific structures and definitions

#ifdef XP_UNIX

#include <stdio.h>

/*
 * Callback Structures.
 *
 * These are used to pass additional platform specific information.
 */
enum NPPluginCallbackType {
    NPPluginCallbackType_SetWindow = 1,
    NPPluginCallbackType_Print
};

struct NPPluginAnyCallbackStruct {
    PRInt32     type;
};

struct NPPluginSetWindowCallbackStruct {
    PRInt32     type;
    Display*    display;
    Visual*     visual;
    Colormap    colormap;
    PRUint32    depth;
};

struct NPPluginPrintCallbackStruct {
    PRInt32     type;
    FILE*       fp;
};

#endif /* XP_UNIX */

////////////////////////////////////////////////////////////////////////////////

// List of variable names for which NPP_GetValue shall be implemented
enum NPPluginVariable {
    NPPluginVariable_NameString = 1,
    NPPluginVariable_DescriptionString,
    NPPluginVariable_WindowBool,        // XXX go away
    NPPluginVariable_TransparentBool,   // XXX go away?
    NPPluginVariable_JavaClass,         // XXX go away
    NPPluginVariable_WindowSize,
    NPPluginVariable_TimerInterval
    // XXX add MIMEDescription (for unix) (but GetValue is on the instance, not the class)
};

// List of variable names for which NPN_GetValue is implemented by Mozilla
enum NPPluginManagerVariable {
    NPPluginManagerVariable_XDisplay = 1,
    NPPluginManagerVariable_XtAppContext,
    NPPluginManagerVariable_NetscapeWindow,
    NPPluginManagerVariable_JavascriptEnabledBool,      // XXX prefs accessor api
    NPPluginManagerVariable_ASDEnabledBool,             // XXX prefs accessor api
    NPPluginManagerVariable_IsOfflineBool               // XXX prefs accessor api
};

////////////////////////////////////////////////////////////////////////////////

enum NPPluginType {
    NPPluginType_Embedded = 1,
    NPPluginType_Full
};

// XXX this can go away now
enum NPStreamType {
    NPStreamType_Normal = 1,
    NPStreamType_Seek,
    NPStreamType_AsFile,
    NPStreamType_AsFileOnly
};

#define NP_STREAM_MAXREADY	(((unsigned)(~0)<<1)>>1)

/*
 * The type of a NPWindow - it specifies the type of the data structure
 * returned in the window field.
 */
enum NPPluginWindowType {
    NPPluginWindowType_Window = 1,
    NPPluginWindowType_Drawable
};

struct NPPluginWindow {
    void*       window;         /* Platform specific window handle */
                                /* OS/2: x - Position of bottom left corner  */
                                /* OS/2: y - relative to visible netscape window */
    PRUint32    x;              /* Position of top left corner relative */
    PRUint32    y;              /*	to a netscape page.					*/
    PRUint32    width;          /* Maximum window size */
    PRUint32    height;
    nsRect      clipRect;       /* Clipping rectangle in port coordinates */
                                /* Used by MAC only.			  */
#ifdef XP_UNIX
    void*       ws_info;        /* Platform-dependent additonal data */
#endif /* XP_UNIX */
    NPPluginWindowType type;    /* Is this a window or a drawable? */
};

struct NPPluginFullPrint {
    PRBool      pluginPrinted;	/* Set TRUE if plugin handled fullscreen */
                                /*	printing							 */
    PRBool      printOne;       /* TRUE if plugin should print one copy  */
                                /*	to default printer					 */
    void*       platformPrint;  /* Platform-specific printing info */
};

struct NPPluginEmbedPrint {
    NPPluginWindow    window;
    void*       platformPrint;	/* Platform-specific printing info */
};

struct NPPluginPrint {
    NPPluginType      mode;     /* NP_FULL or NPPluginType_Embedded */
    union
    {
        NPPluginFullPrint     fullPrint;	/* if mode is NP_FULL */
        NPPluginEmbedPrint    embedPrint;	/* if mode is NPPluginType_Embedded */
    } print;
};

struct NPPluginEvent {

#if defined(XP_MAC)
    EventRecord* event;
    void*       window;

#elif defined(XP_PC)
    uint16      event;
    uint32      wParam;
    uint32      lParam;

#elif defined(XP_OS2)
    uint32      event;
    uint32      wParam;
    uint32      lParam;

#elif defined(XP_UNIX)
    XEvent      event;

#endif
};

#ifdef XP_MAC
typedef RgnHandle nsRegion;
#elif defined(XP_PC)
typedef HRGN nsRegion;
#elif defined(XP_UNIX)
typedef Region nsRegion;
#else
typedef void *nsRegion;
#endif

////////////////////////////////////////////////////////////////////////////////
// Mac-specific structures and definitions.

#ifdef XP_MAC

struct NPPort {
    CGrafPtr    port;   /* Grafport */
    PRInt32     portx;  /* position inside the topmost window */
    PRInt32     porty;
};

/*
 *  Non-standard event types that can be passed to HandleEvent
 */
#define getFocusEvent           (osEvt + 16)
#define loseFocusEvent          (osEvt + 17)
#define adjustCursorEvent       (osEvt + 18)
#define menuCommandEvent		(osEvt + 19)

#endif /* XP_MAC */

////////////////////////////////////////////////////////////////////////////////
// Error and Reason Code definitions

enum NPPluginError {
    NPPluginError_Base = 0,
    NPPluginError_NoError = 0,
    NPPluginError_GenericError,
    NPPluginError_InvalidInstanceError,
    NPPluginError_InvalidFunctableError,
    NPPluginError_ModuleLoadFailedError,
    NPPluginError_OutOfMemoryError,
    NPPluginError_InvalidPluginError,
    NPPluginError_InvalidPluginDirError,
    NPPluginError_IncompatibleVersionError,
    NPPluginError_InvalidParam,
    NPPluginError_InvalidUrl,
    NPPluginError_FileNotFound,
    NPPluginError_NoData,
    NPPluginError_StreamNotSeekable
};

#define NPCallFailed( code ) ((code) != NPPluginError_NoError)

enum NPPluginReason {
    NPPluginReason_Base = 0,
    NPPluginReason_Done = 0,
    NPPluginReason_NetworkErr,
    NPPluginReason_UserBreak,
    NPPluginReason_NoReason
};

////////////////////////////////////////////////////////////////////////////////
// Classes
////////////////////////////////////////////////////////////////////////////////

class NPIStream;                        // base class for all streams

// Classes that must be implemented by the plugin DLL:
class NPIPlugin;                        // plugin class (MIME-type handler)
class NPILiveConnectPlugin;             // subclass of NPIPlugin (see nsILCPlg.h)
class NPIPluginInstance;                // plugin instance
class NPIPluginStream;                  // stream to receive data from the browser

// Classes that are implemented by the browser:
class NPIPluginManager;                 // minimum browser requirements
class NPIPluginManagerStream;           // stream to send data to the browser
class NPIPluginInstancePeer;            // parts of NPIPluginInstance implemented by the browser
class NPILiveConnectPluginInstancePeer; // subclass of NPIPluginInstancePeer (see nsILCPlg.h)
class NPIPluginStreamPeer;              // parts of NPIPluginStream implemented by the browser
class NPISeekablePluginStreamPeer;      // seekable subclass of NPIPluginStreamPeer

//       Plugin DLL Side                Browser Side
//
//         
//       +-----------+                 +-----------------------+
//       | Plugin /  |                 | Plugin Manager        |
//       | LC Plugin |                 |                       |
//       +-----------+                 +-----------------------+
//            ^                               ^
//            |                               |
//            |                        +-----------------------+
//            |                        | Plugin Manager Stream |
//            |                        +-----------------------+
//            |
//            |
//       +-----------------+   peer    +-----------------------+
//       | Plugin Instance |---------->| Plugin Instance Peer  |
//       |                 |           | / LC Plugin Inst Peer |
//       +-----------------+           +-----------------------+
//
//       +-----------------+   peer    +-----------------------+
//       | Plugin Stream   |---------->| Plugin Stream Peer /  |
//       |                 |           | Seekable P Stream Peer|
//       +-----------------+           +-----------------------+

////////////////////////////////////////////////////////////////////////////////
// This is the main entry point to the plugin's DLL. The plugin manager finds
// this symbol and calls it to create the plugin class. Once the plugin object
// is returned to the plugin manager, instances on the page are created by 
// calling NPIPlugin::NewInstance.

// (Corresponds to NPP_Initialize.)
extern "C" NS_EXPORT NPPluginError
NP_CreatePlugin(NPIPluginManager* mgr, NPIPlugin* *result);

////////////////////////////////////////////////////////////////////////////////
// Plugin Stream Interface
// This base class is shared by both the plugin and the plugin manager.

class NPIStream : public nsISupports {
public:

    // The Release method on NPIPlugin corresponds to NPP_DestroyStream.
    
    // (Corresponds to NPP_WriteReady.)
    NS_IMETHOD_(PRInt32)
    WriteReady(void) = 0;

    // (Corresponds to NPP_Write and NPN_Write.)
    NS_IMETHOD_(PRInt32)
    Write(PRInt32 len, const char* buffer) = 0;

};

#define NP_ISTREAM_IID                               \
{ /* 5d852ef0-a1bc-11d1-85b1-00805f0e4dfe */         \
    0x5d852ef0,                                      \
    0xa1bc,                                          \
    0x11d1,                                          \
    {0x85, 0xb1, 0x00, 0x80, 0x5f, 0x0e, 0x4d, 0xfe} \
}

////////////////////////////////////////////////////////////////////////////////
// THINGS THAT MUST BE IMPLEMENTED BY THE PLUGIN...
////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////
// Plugin Interface
// This is the minimum interface plugin developers need to support in order to
// implement a plugin. The plugin manager may QueryInterface for more specific 
// plugin types, e.g. NPILiveConnectPlugin.

class NPIPlugin : public nsISupports {
public:

    // The Release method on NPIPlugin corresponds to NPP_Shutdown.

    // The old NPP_New call has been factored into two plugin instance methods:
    //
    // NewInstance -- called once, after the plugin instance is created. This 
    // method is used to initialize the new plugin instance (although the actual
    // plugin instance object will be created by the plugin manager).
    //
    // NPIPluginInstance::Start -- called when the plugin instance is to be
    // started. This happens in two circumstances: (1) after the plugin instance
    // is first initialized, and (2) after a plugin instance is returned to
    // (e.g. by going back in the window history) after previously being stopped
    // by the Stop method. 

    NS_IMETHOD_(NPPluginError)
    NewInstance(NPIPluginInstancePeer* peer, NPIPluginInstance* *result) = 0;

    // (Corresponds to NPP_GetMIMEDescription.)
    NS_IMETHOD_(const char*)
    GetMIMEDescription(void) = 0;

};

#define NP_IPLUGIN_IID                               \
{ /* 8a623430-a1bc-11d1-85b1-00805f0e4dfe */         \
    0x8a623430,                                      \
    0xa1bc,                                          \
    0x11d1,                                          \
    {0x85, 0xb1, 0x00, 0x80, 0x5f, 0x0e, 0x4d, 0xfe} \
}

////////////////////////////////////////////////////////////////////////////////
// Plugin Instance Interface

// (Corresponds to NPP object.)
class NPIPluginInstance : public nsISupports {
public:

    // The Release method on NPIPluginInstance corresponds to NPP_Destroy.

    // See comment for NPIPlugin::NewInstance, above.
    NS_IMETHOD_(NPPluginError)
    Start(void) = 0;

    // The old NPP_Destroy call has been factored into two plugin instance 
    // methods:
    //
    // Stop -- called when the plugin instance is to be stopped (e.g. by 
    // displaying another plugin manager window, causing the page containing 
    // the plugin to become removed from the display).
    //
    // Release -- called once, before the plugin instance peer is to be 
    // destroyed. This method is used to destroy the plugin instance.

    NS_IMETHOD_(NPPluginError)
    Stop(void) = 0;

    // (Corresponds to NPP_SetWindow.)
    NS_IMETHOD_(NPPluginError)
    SetWindow(NPPluginWindow* window) = 0;

    // (Corresponds to NPP_NewStream.)
    NS_IMETHOD_(NPPluginError)
    NewStream(NPIPluginStreamPeer* peer, NPIPluginStream* *result) = 0;

    // (Corresponds to NPP_Print.)
    NS_IMETHOD_(void)
    Print(NPPluginPrint* platformPrint) = 0;

    // (Corresponds to NPP_HandleEvent.)
    // Note that for Unix and Mac the NPPluginEvent structure is different
    // from the old NPEvent structure -- it's no longer the native event
    // record, but is instead a struct. This was done for future extensibility,
    // and so that the Mac could receive the window argument too. For Windows
    // and OS2, it's always been a struct, so there's no change for them.
    NS_IMETHOD_(PRInt16)
    HandleEvent(NPPluginEvent* event) = 0;

    // (Corresponds to NPP_URLNotify.)
    NS_IMETHOD_(void)
    URLNotify(const char* url, const char* target,
              NPPluginReason reason, void* notifyData) = 0;

    // (Corresponds to NPP_GetValue.)
    NS_IMETHOD_(NPPluginError)
    GetValue(NPPluginVariable variable, void *value) = 0;

    // (Corresponds to NPP_SetValue.)
    NS_IMETHOD_(NPPluginError)
    SetValue(NPPluginManagerVariable variable, void *value) = 0;

};

#define NP_IPLUGININSTANCE_IID                       \
{ /* b62f3a10-a1bc-11d1-85b1-00805f0e4dfe */         \
    0xb62f3a10,                                      \
    0xa1bc,                                          \
    0x11d1,                                          \
    {0x85, 0xb1, 0x00, 0x80, 0x5f, 0x0e, 0x4d, 0xfe} \
}

////////////////////////////////////////////////////////////////////////////////
// Plugin Stream Interface

class NPIPluginStream : public NPIStream {
public:

    // (Corresponds to NPP_NewStream's stype return parameter.)
    NS_IMETHOD_(NPStreamType)
    GetStreamType(void) = 0;

    // (Corresponds to NPP_StreamAsFile.)
    NS_IMETHOD_(void)
    AsFile(const char* fname) = 0;

};

#define NP_IPLUGINSTREAM_IID                         \
{ /* e7a97340-a1bc-11d1-85b1-00805f0e4dfe */         \
    0xe7a97340,                                      \
    0xa1bc,                                          \
    0x11d1,                                          \
    {0x85, 0xb1, 0x00, 0x80, 0x5f, 0x0e, 0x4d, 0xfe} \
}

////////////////////////////////////////////////////////////////////////////////
// THINGS IMPLEMENTED BY THE BROWSER...
////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////
// Plugin Manager Interface
// This interface defines the minimum set of functionality that a plugin
// manager will support if it implements plugins. Plugin implementations can
// QueryInterface to determine if a plugin manager implements more specific 
// APIs for the plugin to use.

class NPIPluginManager : public nsISupports {
public:

    // (Corresponds to NPN_ReloadPlugins.)
    NS_IMETHOD_(void)
    ReloadPlugins(PRBool reloadPages) = 0;

    // (Corresponds to NPN_MemAlloc.)
    NS_IMETHOD_(void*)
    MemAlloc(PRUint32 size) = 0;

    // (Corresponds to NPN_MemFree.)
    NS_IMETHOD_(void)
    MemFree(void* ptr) = 0;

    // (Corresponds to NPN_MemFlush.)
    NS_IMETHOD_(PRUint32)
    MemFlush(PRUint32 size) = 0;

};

#define NP_IPLUGINMANAGER_IID                        \
{ /* f10b9600-a1bc-11d1-85b1-00805f0e4dfe */         \
    0xf10b9600,                                      \
    0xa1bc,                                          \
    0x11d1,                                          \
    {0x85, 0xb1, 0x00, 0x80, 0x5f, 0x0e, 0x4d, 0xfe} \
}

////////////////////////////////////////////////////////////////////////////////
// Plugin Instance Peer Interface

enum NPTagType {
    NPTagType_Unknown,
    NPTagType_Embed,
    NPTagType_Object,
    NPTagType_Applet
};

class NPIPluginInstancePeer : public nsISupports {
public:

    NS_IMETHOD_(NPIPlugin*)
    GetClass(void) = 0;

    // (Corresponds to NPP_New's MIMEType argument.)
    NS_IMETHOD_(nsMIMEType)
    GetMIMEType(void) = 0;

    // (Corresponds to NPP_New's mode argument.)
    NS_IMETHOD_(NPPluginType)
    GetMode(void) = 0;

    // Get a ptr to the paired list of attribute names and values,
    // returns the length of the array.
    //
    // Each name or value is a null-terminated string.
    NS_IMETHOD_(NPPluginError)
    GetAttributes(PRUint16& n, const char*const*& names, const char*const*& values) = 0;

    // Get the value for the named attribute.  Returns null
    // if the attribute was not set.
    NS_IMETHOD_(const char*)
    GetAttribute(const char* name) = 0;

    // Get a ptr to the paired list of parameter names and values,
    // returns the length of the array.
    //
    // Each name or value is a null-terminated string.
    NS_IMETHOD_(NPPluginError)
    GetParameters(PRUint16& n, const char*const*& names, const char*const*& values) = 0;

    // Get the value for the named parameter.  Returns null
    // if the parameter was not set.
    NS_IMETHOD_(const char*)
    GetParameter(const char* name) = 0;

    // Get the complete text of the HTML tag that was
    // used to instantiate this plugin
    NS_IMETHOD_(const char *)
    GetTagText(void) = 0;

    // Get the type of the HTML tag that was used ot instantiate this
    // plugin.  Currently supported tags are EMBED, OBJECT and APPLET.
    NS_IMETHOD_(NPTagType) 
    GetTagType(void) = 0;

    NS_IMETHOD_(NPIPluginManager*)
    GetPluginManager(void) = 0;

    // (Corresponds to NPN_GetURL and NPN_GetURLNotify.)
    //   notifyData: When present, URLNotify is called passing the notifyData back
    //          to the client. When NULL, this call behaves like NPN_GetURL.
    // New arguments:
    //   altHost: An IP-address string that will be used instead of the host
    //          specified in the URL. This is used to prevent DNS-spoofing attacks.
    //          Can be defaulted to NULL meaning use the host in the URL.
    //   referrer: 
    //   forceJSEnabled: Forces JavaScript to be enabled for 'javascript:' URLs,
    //          even if the user currently has JavaScript disabled. 
    NS_IMETHOD_(NPPluginError)
    GetURL(const char* url, const char* target, void* notifyData = NULL,
           const char* altHost = NULL, const char* referrer = NULL,
           PRBool forceJSEnabled = PR_FALSE) = 0;

    // (Corresponds to NPN_PostURL and NPN_PostURLNotify.)
    //   notifyData: When present, URLNotify is called passing the notifyData back
    //          to the client. When NULL, this call behaves like NPN_GetURL.
    // New arguments:
    //   altHost: An IP-address string that will be used instead of the host
    //          specified in the URL. This is used to prevent DNS-spoofing attacks.
    //          Can be defaulted to NULL meaning use the host in the URL.
    //   referrer: 
    //   forceJSEnabled: Forces JavaScript to be enabled for 'javascript:' URLs,
    //          even if the user currently has JavaScript disabled. 
    //   postHeaders: A string containing post headers.
    //   postHeadersLength: The length of the post headers string.
    NS_IMETHOD_(NPPluginError)
    PostURL(const char* url, const char* target, PRUint32 bufLen, 
            const char* buf, PRBool file, void* notifyData = NULL,
            const char* altHost = NULL, const char* referrer = NULL,
            PRBool forceJSEnabled = PR_FALSE,
            PRUint32 postHeadersLength = 0, const char* postHeaders = NULL) = 0;

    // (Corresponds to NPN_NewStream.)
    NS_IMETHOD_(NPPluginError)
    NewStream(nsMIMEType type, const char* target,
              NPIPluginManagerStream* *result) = 0;

    // (Corresponds to NPN_Status.)
    NS_IMETHOD_(void)
    ShowStatus(const char* message) = 0;

    // (Corresponds to NPN_UserAgent.)
    NS_IMETHOD_(const char*)
    UserAgent(void) = 0;

    // (Corresponds to NPN_GetValue.)
    NS_IMETHOD_(NPPluginError)
    GetValue(NPPluginManagerVariable variable, void *value) = 0;

    // (Corresponds to NPN_SetValue.)
    NS_IMETHOD_(NPPluginError)
    SetValue(NPPluginVariable variable, void *value) = 0;

    ////////////////////////////////////////////////////////////////////////////
    // XXX Only used by windowless plugin instances?...

    // (Corresponds to NPN_InvalidateRect.)
    NS_IMETHOD_(void)
    InvalidateRect(nsRect *invalidRect) = 0;

    // (Corresponds to NPN_InvalidateRegion.)
    NS_IMETHOD_(void)
    InvalidateRegion(nsRegion invalidRegion) = 0;

    // (Corresponds to NPN_ForceRedraw.)
    NS_IMETHOD_(void)
    ForceRedraw(void) = 0;
    
    // New top-level window handling calls for Mac:
    
    NS_IMETHOD_(void)
    RegisterWindow(void* window) = 0;
    
    NS_IMETHOD_(void)
    UnregisterWindow(void* window) = 0;

	// Menu ID allocation calls for Mac:
    NS_IMETHOD_(PRInt16)
	AllocateMenuID(PRBool isSubmenu) = 0;

};

#define NP_IPLUGININSTANCEPEER_IID                   \
{ /* 15c75de0-a1bd-11d1-85b1-00805f0e4dfe */         \
    0x15c75de0,                                      \
    0xa1bd,                                          \
    0x11d1,                                          \
    {0x85, 0xb1, 0x00, 0x80, 0x5f, 0x0e, 0x4d, 0xfe} \
}

////////////////////////////////////////////////////////////////////////////////
// Plugin Manager Stream Interface

class NPIPluginManagerStream : public NPIStream {
public:

    // (Corresponds to NPStream's url field.)
    NS_IMETHOD_(const char*)
    GetURL(void) = 0;

    // (Corresponds to NPStream's end field.)
    NS_IMETHOD_(PRUint32)
    GetEnd(void) = 0;

    // (Corresponds to NPStream's lastmodified field.)
    NS_IMETHOD_(PRUint32)
    GetLastModified(void) = 0;

    // (Corresponds to NPStream's notifyData field.)
    NS_IMETHOD_(void*)
    GetNotifyData(void) = 0;

};

#define NP_IPLUGINMANAGERSTREAM_IID                  \
{ /* 30c24560-a1bd-11d1-85b1-00805f0e4dfe */         \
    0x30c24560,                                      \
    0xa1bd,                                          \
    0x11d1,                                          \
    {0x85, 0xb1, 0x00, 0x80, 0x5f, 0x0e, 0x4d, 0xfe} \
}

////////////////////////////////////////////////////////////////////////////////
// Plugin Stream Peer Interface
// A plugin stream peer is passed to a plugin instance's NewStream call in 
// order to indicate that a new stream is to be created and be read by the
// plugin instance.

class NPIPluginStreamPeer : public nsISupports {
public:

    // (Corresponds to NPStream's url field.)
    NS_IMETHOD_(const char*)
    GetURL(void) = 0;

    // (Corresponds to NPStream's end field.)
    NS_IMETHOD_(PRUint32)
    GetEnd(void) = 0;

    // (Corresponds to NPStream's lastmodified field.)
    NS_IMETHOD_(PRUint32)
    GetLastModified(void) = 0;

    // (Corresponds to NPStream's notifyData field.)
    NS_IMETHOD_(void*)
    GetNotifyData(void) = 0;

    // (Corresponds to NPP_DestroyStream's reason argument.)
    NS_IMETHOD_(NPPluginReason)
    GetReason(void) = 0;

    // (Corresponds to NPP_NewStream's MIMEType argument.)
    NS_IMETHOD_(nsMIMEType)
    GetMIMEType(void) = 0;

    NS_IMETHOD_(PRUint32)
    GetContentLength(void) = 0;

    NS_IMETHOD_(PRUint32)
    GetHeaderFieldCount(void) = 0;

    NS_IMETHOD_(const char*)
    GetHeaderFieldKey(PRUint32 index) = 0;

    NS_IMETHOD_(const char*)
    GetHeaderField(PRUint32 index) = 0;

};

#define NP_IPLUGINSTREAMPEER_IID                     \
{ /* 38278eb0-a1bd-11d1-85b1-00805f0e4dfe */         \
    0x38278eb0,                                      \
    0xa1bd,                                          \
    0x11d1,                                          \
    {0x85, 0xb1, 0x00, 0x80, 0x5f, 0x0e, 0x4d, 0xfe} \
}

////////////////////////////////////////////////////////////////////////////////
// Seekable Plugin Stream Peer Interface
// The browser implements this subclass of plugin stream peer if a stream
// is seekable. Plugins can query interface for this type, and call the 
// RequestRead method to seek to a particular position in the stream.

class NPISeekablePluginStreamPeer : public NPIPluginStreamPeer {
public:

    // QueryInterface for this class corresponds to NPP_NewStream's 
    // seekable argument.

    // (Corresponds to NPN_RequestRead.)
    NS_IMETHOD_(NPPluginError)
    RequestRead(nsByteRange* rangeList) = 0;

};

#define NP_ISEEKABLEPLUGINSTREAMPEER_IID             \
{ /* f55c8250-a73e-11d1-85b1-00805f0e4dfe */         \
    0xf55c8250,                                      \
    0xa73e,                                          \
    0x11d1,                                          \
    {0x85, 0xb1, 0x00, 0x80, 0x5f, 0x0e, 0x4d, 0xfe} \
}                                                    \

////////////////////////////////////////////////////////////////////////////////

#ifdef XP_MAC
#pragma options align=reset
#endif

#endif /* RC_INVOKED */
#ifdef __OS2__
#pragma pack()
#endif

#endif /* nsIPlug_h___ */
