diff --git a/mozilla/modules/plugin/base/src/Makefile b/mozilla/modules/plugin/base/src/Makefile
index 5d054a68240..8a986c0018b 100644
--- a/mozilla/modules/plugin/base/src/Makefile
+++ b/mozilla/modules/plugin/base/src/Makefile
@@ -31,6 +31,9 @@ CPPSRCS = \
nsPluginHostImpl.cpp \
nsPluginFactory.cpp \
ns4xPlugin.cpp \
+ ns4xPluginInstance.cpp \
+ ns4xPluginStream.cpp \
+ nsPluginInstancePeer.cpp \
$(NULL)
REQUIRES = raptor plugin java xpcom
diff --git a/mozilla/modules/plugin/base/src/makefile.win b/mozilla/modules/plugin/base/src/makefile.win
index fcdaec4c366..46de9b2cb6e 100644
--- a/mozilla/modules/plugin/base/src/makefile.win
+++ b/mozilla/modules/plugin/base/src/makefile.win
@@ -35,6 +35,9 @@ OBJS = \
.\$(OBJDIR)\nsPluginHostImpl.obj \
.\$(OBJDIR)\nsPluginFactory.obj \
.\$(OBJDIR)\ns4xPlugin.obj \
+ .\$(OBJDIR)\ns4xPluginInstance.obj \
+ .\$(OBJDIR)\ns4xPluginStream.obj \
+ .\$(OBJDIR)\nsPluginInstancePeer.obj \
$(NULL)
LINCS= \
diff --git a/mozilla/modules/plugin/base/src/ns4xPlugin.cpp b/mozilla/modules/plugin/base/src/ns4xPlugin.cpp
index c0de5348bde..896582d05ad 100644
--- a/mozilla/modules/plugin/base/src/ns4xPlugin.cpp
+++ b/mozilla/modules/plugin/base/src/ns4xPlugin.cpp
@@ -21,7 +21,8 @@
#include "xp_core.h"
#include "nsplugin.h"
#include "ns4xPlugin.h"
-//#include "ns4xPluginInstance.h"
+#include "nsIPluginStream.h"
+#include "ns4xPluginInstance.h"
////////////////////////////////////////////////////////////////////////
@@ -34,7 +35,9 @@ typedef NPError (*NP_PLUGINSHUTDOWN)();
////////////////////////////////////////////////////////////////////////
NPNetscapeFuncs ns4xPlugin::CALLBACKS;
-nsIPluginManager * ns4xPlugin::mManager;
+nsIPluginManager * ns4xPlugin::mPluginManager;
+nsINetworkManager * ns4xPlugin::mNetworkManager;
+nsIMalloc * ns4xPlugin::mMalloc;
void
ns4xPlugin::CheckClassInitialized(void)
@@ -44,7 +47,9 @@ ns4xPlugin::CheckClassInitialized(void)
if (initialized)
return;
- mManager = nsnull;
+ mPluginManager = nsnull;
+ mNetworkManager = nsnull;
+ mMalloc = nsnull;
// XXX It'd be nice to make this const and initialize it
// statically...
@@ -53,25 +58,25 @@ ns4xPlugin::CheckClassInitialized(void)
CALLBACKS.geturl = NewNPN_GetURLProc(_geturl);
CALLBACKS.posturl = NewNPN_PostURLProc(_posturl);
-// CALLBACKS.requestread = NewNPN_RequestReadProc(_requestread);
-// CALLBACKS.newstream = NewNPN_NewStreamProc(_newstream);
-// CALLBACKS.write = NewNPN_WriteProc(_write);
-// CALLBACKS.destroystream = NewNPN_DestroyStreamProc(_destroystream);
-// CALLBACKS.status = NewNPN_StatusProc(_status);
-// CALLBACKS.uagent = NewNPN_UserAgentProc(_useragent);
-// CALLBACKS.memalloc = NewNPN_MemAllocProc(_memalloc);
-// CALLBACKS.memfree = NewNPN_MemFreeProc(_memfree);
-// CALLBACKS.memflush = NewNPN_MemFlushProc(_memflush);
-// CALLBACKS.reloadplugins = NewNPN_ReloadPluginsProc(_reloadplugins);
-// CALLBACKS.getJavaEnv = NewNPN_GetJavaEnvProc(_getJavaEnv);
+ CALLBACKS.requestread = NewNPN_RequestReadProc(_requestread);
+ CALLBACKS.newstream = NewNPN_NewStreamProc(_newstream);
+ CALLBACKS.write = NewNPN_WriteProc(_write);
+ CALLBACKS.destroystream = NewNPN_DestroyStreamProc(_destroystream);
+ CALLBACKS.status = NewNPN_StatusProc(_status);
+ CALLBACKS.uagent = NewNPN_UserAgentProc(_useragent);
+ CALLBACKS.memalloc = NewNPN_MemAllocProc(_memalloc);
+ CALLBACKS.memfree = NewNPN_MemFreeProc(_memfree);
+ CALLBACKS.memflush = NewNPN_MemFlushProc(_memflush);
+ CALLBACKS.reloadplugins = NewNPN_ReloadPluginsProc(_reloadplugins);
+ CALLBACKS.getJavaEnv = NewNPN_GetJavaEnvProc(_getJavaEnv);
// CALLBACKS.getJavaPeer = NewNPN_GetJavaPeerProc(_getJavaPeer);
CALLBACKS.geturlnotify = NewNPN_GetURLNotifyProc(_geturlnotify);
CALLBACKS.posturlnotify = NewNPN_PostURLNotifyProc(_posturlnotify);
-// CALLBACKS.getvalue = NewNPN_GetValueProc(_getvalue);
-// CALLBACKS.setvalue = NewNPN_SetValueProc(_setvalue);
-// CALLBACKS.invalidaterect = NewNPN_InvalidateRectProc(_invalidaterect);
-// CALLBACKS.invalidateregion = NewNPN_InvalidateRegionProc(_invalidateregion);
-// CALLBACKS.forceredraw = NewNPN_ForceRedrawProc(_forceredraw);
+ CALLBACKS.getvalue = NewNPN_GetValueProc(_getvalue);
+ CALLBACKS.setvalue = NewNPN_SetValueProc(_setvalue);
+ CALLBACKS.invalidaterect = NewNPN_InvalidateRectProc(_invalidaterect);
+ CALLBACKS.invalidateregion = NewNPN_InvalidateRegionProc(_invalidateregion);
+ CALLBACKS.forceredraw = NewNPN_ForceRedrawProc(_forceredraw);
initialized = TRUE;
};
@@ -83,13 +88,14 @@ ns4xPlugin::ns4xPlugin(NPPluginFuncs* callbacks)
{
NS_INIT_REFCNT();
memcpy((void*) &fCallbacks, (void*) callbacks, sizeof(fCallbacks));
- mManager = nsnull;
}
ns4xPlugin::~ns4xPlugin(void)
{
- NS_IF_RELEASE(mManager);
+ NS_IF_RELEASE(mPluginManager);
+ NS_IF_RELEASE(mNetworkManager);
+ NS_IF_RELEASE(mMalloc);
}
@@ -102,6 +108,8 @@ NS_IMPL_RELEASE(ns4xPlugin);
static NS_DEFINE_IID(kILiveConnectPluginIID, NS_ILIVECONNECTPLUGIN_IID);
static NS_DEFINE_IID(kIPluginIID, NS_IPLUGIN_IID);
static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID);
+static NS_DEFINE_IID(kIWindowlessPluginInstancePeerIID, NS_IWINDOWLESSPLUGININSTANCEPEER_IID);
+static NS_DEFINE_IID(kISeekablePluginStreamPeerIID, NS_ISEEKABLEPLUGINSTREAMPEER_IID);
nsresult
ns4xPlugin::QueryInterface(const nsIID& iid, void** instance)
@@ -109,20 +117,28 @@ ns4xPlugin::QueryInterface(const nsIID& iid, void** instance)
if (instance == NULL)
return NS_ERROR_NULL_POINTER;
- if (iid.Equals(kIPluginIID) ||
- iid.Equals(kISupportsIID)) {
- *instance = (void*) this;
+ if (iid.Equals(kIPluginIID))
+ {
+ *instance = (void *)(nsIPlugin *)this;
AddRef();
return NS_OK;
}
- if (iid.Equals(kILiveConnectPluginIID)) {
+ if (iid.Equals(kILiveConnectPluginIID))
+ {
// Check the 4.x plugin callbacks to see if it supports
// LiveConnect...
if (fCallbacks.javaClass == NULL)
return NS_NOINTERFACE;
- *instance = (void*) this;
+ *instance = (void *)(nsILiveConnectPlugin *)this;
+ AddRef();
+ return NS_OK;
+ }
+
+ if (iid.Equals(kISupportsIID))
+ {
+ *instance = (void *)(nsISupports *)this;
AddRef();
return NS_OK;
}
@@ -200,7 +216,7 @@ nsresult ns4xPlugin :: CreateInstance(nsISupports *aOuter,
nsISupports *inst;
inst = nsnull;
-// inst = (nsISupports *)(nsIPluginInstance *)new ns4xPluginInstance();
+ inst = (nsISupports *)(nsIPluginInstance *)new ns4xPluginInstance(&fCallbacks);
if (inst == NULL) {
return NS_ERROR_OUT_OF_MEMORY;
@@ -223,20 +239,33 @@ nsresult ns4xPlugin :: LockFactory(PRBool aLock)
}
static NS_DEFINE_IID(kIPluginManagerIID, NS_IPLUGINMANAGER_IID);
+static NS_DEFINE_IID(kINetworkManagerIID, NS_INETWORKMANAGER_IID);
+static NS_DEFINE_IID(kIMallocIID, NS_IMALLOC_IID);
nsresult
ns4xPlugin::Initialize(nsISupports* browserInterfaces)
{
- if (nsnull == mManager)
- return browserInterfaces->QueryInterface(kIPluginManagerIID, (void **)&mManager);
- else
- return NS_OK;
+ nsresult rv = NS_OK;
+
+ if (nsnull == mPluginManager)
+ rv = browserInterfaces->QueryInterface(kIPluginManagerIID, (void **)&mPluginManager);
+
+ if (nsnull == mNetworkManager)
+ rv = browserInterfaces->QueryInterface(kINetworkManagerIID, (void **)&mNetworkManager);
+
+ if (nsnull == mMalloc)
+ rv = browserInterfaces->QueryInterface(kIMallocIID, (void **)&mMalloc);
+
+ return rv;
}
nsresult
ns4xPlugin::Shutdown(void)
{
- NS_IF_RELEASE(mManager);
+ NS_IF_RELEASE(mPluginManager);
+ NS_IF_RELEASE(mNetworkManager);
+ NS_IF_RELEASE(mMalloc);
+
return NS_OK;
}
@@ -262,7 +291,7 @@ ns4xPlugin::SetValue(nsPluginVariable variable, void *value)
nsresult
ns4xPlugin::GetJavaClass(jclass *resultingClass)
{
- *resultingClass = fCallbacks.javaClass;
+ *resultingClass = (jclass)fCallbacks.javaClass;
return NS_OK;
}
@@ -277,29 +306,12 @@ ns4xPlugin::_geturl(NPP npp, const char* relativeURL, const char* target)
nsIPluginInstancePeer* peer = (nsIPluginInstancePeer*) npp->ndata;
NS_ASSERTION(peer != NULL, "null peer");
- NS_ASSERTION(mManager != NULL, "null manager");
+ NS_ASSERTION(mNetworkManager != NULL, "null manager");
if (peer == NULL)
return NS_ERROR_UNEXPECTED; // XXX
-#if 0
- nsURLInfo urlinfo;
- urlinfo.version = nsURLInfo_Version;
- urlinfo.url = relativeURL;
- urlinfo.target = target;
- urlinfo.notifyData = nsnull;
- urlinfo.altHost = nsnull;
- urlinfo.referrer = nsnull;
- urlinfo.forceJSEnabled = PR_FALSE;
- urlinfo.postData = nsnull;
- urlinfo.postDataLength = 0;
- urlinfo.postHeaders = nsnull;
- urlinfo.postHeadersLength = 0;
- urlinfo.postFile = PR_FALSE;
-
- return mManager->FetchURL(peer, &urlinfo);
-#endif
- return NS_OK;
+ return mNetworkManager->GetURL(peer, relativeURL, target);
}
nsresult NP_EXPORT
@@ -309,29 +321,13 @@ ns4xPlugin::_geturlnotify(NPP npp, const char* relativeURL, const char* target,
nsIPluginInstancePeer* peer = (nsIPluginInstancePeer*) npp->ndata;
NS_ASSERTION(peer != NULL, "null peer");
- NS_ASSERTION(mManager != NULL, "null manager");
+ NS_ASSERTION(mNetworkManager != NULL, "null manager");
if (peer == NULL)
return NS_ERROR_UNEXPECTED; // XXX
-#if 0
- nsURLInfo urlinfo;
- urlinfo.version = nsURLInfo_Version;
- urlinfo.url = relativeURL;
- urlinfo.target = target;
- urlinfo.notifyData = notifyData;
- urlinfo.altHost = nsnull;
- urlinfo.referrer = nsnull;
- urlinfo.forceJSEnabled = PR_FALSE;
- urlinfo.postData = nsnull;
- urlinfo.postDataLength = 0;
- urlinfo.postHeaders = nsnull;
- urlinfo.postHeadersLength = 0;
- urlinfo.postFile = PR_FALSE;
-
- return mManager->FetchURL(peer, &urlinfo);
-#endif
- return NS_OK;
+ return mNetworkManager->GetURL(peer, relativeURL, target,
+ notifyData);
}
@@ -343,29 +339,13 @@ ns4xPlugin::_posturlnotify(NPP npp, const char* relativeURL, const char *target,
nsIPluginInstancePeer* peer = (nsIPluginInstancePeer*) npp->ndata;
NS_ASSERTION(peer != NULL, "null peer");
- NS_ASSERTION(mManager != NULL, "null manager");
+ NS_ASSERTION(mNetworkManager != NULL, "null manager");
if (peer == NULL)
return NS_ERROR_UNEXPECTED; // XXX
-#if 0
- nsURLInfo urlinfo;
- urlinfo.version = nsURLInfo_Version;
- urlinfo.url = relativeURL;
- urlinfo.target = target;
- urlinfo.notifyData = notifyData;
- urlinfo.altHost = nsnull;
- urlinfo.referrer = nsnull;
- urlinfo.forceJSEnabled = PR_FALSE;
- urlinfo.postData = buf;
- urlinfo.postDataLength = len;
- urlinfo.postHeaders = nsnull;
- urlinfo.postHeadersLength = 0;
- urlinfo.postFile = file;
-
- return mManager->FetchURL(peer, &urlinfo);
-#endif
- return NS_OK;
+ return mNetworkManager->PostURL(peer, relativeURL, target,
+ len, buf, file, notifyData);
}
@@ -376,49 +356,32 @@ ns4xPlugin::_posturl(NPP npp, const char* relativeURL, const char *target, uint3
nsIPluginInstancePeer* peer = (nsIPluginInstancePeer*) npp->ndata;
NS_ASSERTION(peer != NULL, "null peer");
- NS_ASSERTION(mManager != NULL, "null manager");
+ NS_ASSERTION(mNetworkManager != NULL, "null manager");
if (peer == NULL)
return NS_ERROR_UNEXPECTED; // XXX
-#if 0
- nsURLInfo urlinfo;
- urlinfo.version = nsURLInfo_Version;
- urlinfo.url = relativeURL;
- urlinfo.target = target;
- urlinfo.notifyData = nsnull;
- urlinfo.altHost = nsnull;
- urlinfo.referrer = nsnull;
- urlinfo.forceJSEnabled = PR_FALSE;
- urlinfo.postData = buf;
- urlinfo.postDataLength = len;
- urlinfo.postHeaders = nsnull;
- urlinfo.postHeadersLength = 0;
- urlinfo.postFile = file;
-
- return mManager->FetchURL(peer, &urlinfo);
-#endif
- return NS_OK;
+ return mNetworkManager->PostURL(peer, relativeURL, target,
+ len, buf, file);
}
-#if 0
-
////////////////////////////////////////////////////////////////////////
/**
* A little helper class used to wrap up plugin manager streams (that is,
* streams from the plugin to the browser).
*/
-class ns4xStreamWrapper {
+class ns4xStreamWrapper
+{
protected:
- NPIPluginManagerStream* fStream;
- NPStream fNPStream;
+ nsIOutputStream *fStream;
+ NPStream fNPStream;
public:
- ns4xStreamWrapper(NPIPluginManagerStream* stream);
+ ns4xStreamWrapper(nsIOutputStream* stream);
~ns4xStreamWrapper();
- NPIPluginManagerStream*
+ nsIOutputStream*
GetStream(void);
NPStream*
@@ -427,11 +390,12 @@ public:
};
};
-ns4xStreamWrapper::ns4xStreamWrapper(NPIPluginManagerStream* stream)
+ns4xStreamWrapper::ns4xStreamWrapper(nsIOutputStream* stream)
: fStream(stream)
{
- PR_ASSERT(stream != NULL);
- fStream->AddRef();
+ NS_ASSERTION(stream != NULL, "bad stream");
+
+ NS_ADDREF(fStream);
memset(&fNPStream, 0, sizeof(fNPStream));
fNPStream.ndata = (void*) this;
@@ -439,15 +403,13 @@ ns4xStreamWrapper::ns4xStreamWrapper(NPIPluginManagerStream* stream)
ns4xStreamWrapper::~ns4xStreamWrapper(void)
{
- if (fStream != NULL)
- fStream->Release();
+ NS_IF_RELEASE(fStream);
}
-NPIPluginManagerStream*
+nsIOutputStream*
ns4xStreamWrapper::GetStream(void)
{
- if (fStream != NULL)
- fStream->AddRef();
+ NS_IF_ADDREF(fStream);
return fStream;
}
@@ -466,194 +428,205 @@ ns4xPlugin::_newstream(NPP npp, NPMIMEType type, const char* window, NPStream* *
return NS_ERROR_UNEXPECTED; // XXX
nsresult error;
- nsIPluginStream* stream;
+ nsIOutputStream* stream;
if ((error = peer->NewStream((const char*) type, window, &stream))
- != NPPluginError_NoError)
- return (NPError) error;
+ != NS_OK)
+ return error;
ns4xStreamWrapper* wrapper = new ns4xStreamWrapper(stream);
- if (wrapper == NULL) {
- stream->Release();
- return NPERR_OUT_OF_MEMORY_ERROR;
+ if (wrapper == NULL)
+ {
+ NS_RELEASE(stream);
+ return NS_ERROR_OUT_OF_MEMORY;
}
(*result) = wrapper->GetNPStream();
- return NPERR_NO_ERROR;
+ return NS_OK;
}
-
-
int32 NP_EXPORT
ns4xPlugin::_write(NPP npp, NPStream *pstream, int32 len, void *buffer)
{
ns4xStreamWrapper* wrapper = (ns4xStreamWrapper*) npp->ndata;
- PR_ASSERT(wrapper != NULL);
+
+ NS_ASSERTION(wrapper != NULL, "null wrapper");
+
if (wrapper == NULL)
return 0;
- NPIPluginManagerStream* stream = wrapper->GetStream();
- PRUint32 count = 0;
- while (count < ((PRUint32) len)) {
- PRUint32 ready = stream->WriteReady();
- ready = (ready > ((PRUint32) len)) ? ((PRUint32) len) : ready;
+ nsIOutputStream* stream = wrapper->GetStream();
- PRUint32 written = stream->Write(ready, ((const char*) buffer) + count);
- count += written;
- }
+ PRInt32 count = 0;
+ nsresult rv = stream->Write((char *)buffer, 0, len, &count);
- stream->Release();
+ NS_RELEASE(stream);
return count;
}
-
-
-NPError NP_EXPORT
+nsresult NP_EXPORT
ns4xPlugin::_destroystream(NPP npp, NPStream *pstream, NPError reason)
{
ns4xStreamWrapper* wrapper = (ns4xStreamWrapper*) npp->ndata;
- PR_ASSERT(wrapper != NULL);
+
+ NS_ASSERTION(wrapper != NULL, "null wrapper");
+
if (wrapper == NULL)
return 0;
- // This will release the wrapped NPIPluginManagerStream.
+ // This will release the wrapped nsIOutputStream.
delete wrapper;
- return NPERR_NO_ERROR;
+ return NS_OK;
}
-
-
void NP_EXPORT
ns4xPlugin::_status(NPP npp, const char *message)
{
- NPIPluginInstancePeer* peer = (NPIPluginInstancePeer*) npp->ndata;
- PR_ASSERT(peer != NULL);
+ nsIPluginInstancePeer* peer = (nsIPluginInstancePeer*) npp->ndata;
+
+ NS_ASSERTION(peer != NULL, "null peer");
+
if (peer == NULL)
return;
peer->ShowStatus(message);
}
-
-
void NP_EXPORT
ns4xPlugin::_memfree (void *ptr)
{
- thePluginManager->MemFree(ptr);
+ mMalloc->Free(ptr);
}
-
-
uint32 NP_EXPORT
ns4xPlugin::_memflush(uint32 size)
{
- return thePluginManager->MemFlush(size);
+ mMalloc->HeapMinimize();
+
+ return 0;
}
-
-
void NP_EXPORT
ns4xPlugin::_reloadplugins(NPBool reloadPages)
{
- thePluginManager->ReloadPlugins(reloadPages);
+ mPluginManager->ReloadPlugins(reloadPages);
}
-
-
void NP_EXPORT
ns4xPlugin::_invalidaterect(NPP npp, NPRect *invalidRect)
{
- NPIPluginInstancePeer* peer = (NPIPluginInstancePeer*) npp->ndata;
- PR_ASSERT(peer != NULL);
+ nsIPluginInstancePeer* peer = (nsIPluginInstancePeer*) npp->ndata;
+
+ NS_ASSERTION(peer != NULL, "null peer");
+
if (peer == NULL)
return;
- // XXX nsRect & NPRect are structurally equivalent
- peer->InvalidateRect((nsRect*) invalidRect);
+ nsIWindowlessPluginInstancePeer *wpeer;
+
+ if (NS_OK == peer->QueryInterface(kIWindowlessPluginInstancePeerIID, (void **)&wpeer))
+ {
+ // XXX nsRect & NPRect are structurally equivalent
+ wpeer->InvalidateRect((nsPluginRect *)invalidRect);
+ NS_RELEASE(wpeer);
+ }
}
-
-
void NP_EXPORT
ns4xPlugin::_invalidateregion(NPP npp, NPRegion invalidRegion)
{
- NPIPluginInstancePeer* peer = (NPIPluginInstancePeer*) npp->ndata;
- PR_ASSERT(peer != NULL);
+ nsIPluginInstancePeer* peer = (nsIPluginInstancePeer*) npp->ndata;
+
+ NS_ASSERTION(peer != NULL, "null peer");
+
if (peer == NULL)
return;
- // XXX nsRegion & NPRegion are typedef'd to the same thing
- peer->InvalidateRegion((nsRegion*) invalidRegion);
+ nsIWindowlessPluginInstancePeer *wpeer;
+
+ if (NS_OK == peer->QueryInterface(kIWindowlessPluginInstancePeerIID, (void **)&wpeer))
+ {
+ // XXX nsRegion & NPRegion are typedef'd to the same thing
+ wpeer->InvalidateRegion((nsPluginRegion*) invalidRegion);
+ NS_RELEASE(wpeer);
+ }
}
-
-
void NP_EXPORT
ns4xPlugin::_forceredraw(NPP npp)
{
- NPIPluginInstancePeer* peer = (NPIPluginInstancePeer*) npp->ndata;
- PR_ASSERT(peer != NULL);
+ nsIPluginInstancePeer* peer = (nsIPluginInstancePeer*) npp->ndata;
+
+ NS_ASSERTION(peer != NULL, "null peer");
+
if (peer == NULL)
return;
- peer->ForceRedraw();
+ nsIWindowlessPluginInstancePeer *wpeer;
+
+ if (NS_OK == peer->QueryInterface(kIWindowlessPluginInstancePeerIID, (void **)&wpeer))
+ {
+ wpeer->ForceRedraw();
+ NS_RELEASE(wpeer);
+ }
}
-
-
-NPError NP_EXPORT
+nsresult NP_EXPORT
ns4xPlugin::_getvalue(NPP npp, NPNVariable variable, void *result)
{
- NPIPluginInstancePeer* peer = (NPIPluginInstancePeer*) npp->ndata;
- PR_ASSERT(peer != NULL);
+ nsIPluginInstancePeer* peer = (nsIPluginInstancePeer*) npp->ndata;
+
+ NS_ASSERTION(peer != NULL, "null peer");
+
if (peer == NULL)
- return NPERR_INVALID_PLUGIN_ERROR; // XXX
+ return NS_ERROR_FAILURE; // XXX
// XXX Note that for backwards compatibility, the old NPNVariables
// map correctly to NPPluginManagerVariables.
- return (NPError) peer->GetValue((NPPluginManagerVariable) variable, result);
+ return peer->GetValue((nsPluginInstancePeerVariable)variable, result);
}
-
-
-NPError NP_EXPORT
+nsresult NP_EXPORT
ns4xPlugin::_setvalue(NPP npp, NPPVariable variable, void *result)
{
- NPIPluginInstancePeer* peer = (NPIPluginInstancePeer*) npp->ndata;
- PR_ASSERT(peer != NULL);
+ nsIPluginInstancePeer* peer = (nsIPluginInstancePeer*) npp->ndata;
+
+ NS_ASSERTION(peer != NULL, "null peer");
+
if (peer == NULL)
- return NPERR_INVALID_PLUGIN_ERROR; // XXX
+ return NS_ERROR_FAILURE; // XXX
// XXX Note that for backwards compatibility, the old NPPVariables
// map correctly to NPPluginVariables.
- return (NPError) peer->SetValue((NPPluginVariable) variable, result);
+ return peer->SetValue((nsPluginInstancePeerVariable)variable, result);
}
-
-
-NPError NP_EXPORT
+nsresult NP_EXPORT
ns4xPlugin::_requestread(NPStream *pstream, NPByteRange *rangeList)
{
- NPIPluginStreamPeer* streamPeer = (NPIPluginStreamPeer*) pstream->ndata;
- PR_ASSERT(streamPeer != NULL);
- if (streamPeer == NULL)
- return NPERR_INVALID_PLUGIN_ERROR; // XXX
+ nsIPluginStreamPeer* streamPeer = (nsIPluginStreamPeer*) pstream->ndata;
+
+ NS_ASSERTION(streamPeer != NULL, "null streampeer");
+
+ if (streamPeer == NULL)
+ return NS_ERROR_FAILURE; // XXX
+
+ nsISeekablePluginStreamPeer* seekablePeer = NULL;
- NPISeekablePluginStreamPeer* seekablePeer = NULL;
- static NS_DEFINE_IID(kISeekablePluginStreamPeerIID, NP_ISEEKABLEPLUGINSTREAMPEER_IID);
if (streamPeer->QueryInterface(kISeekablePluginStreamPeerIID,
- (void**) seekablePeer) == NS_OK) {
- NPError error;
+ (void**)seekablePeer) == NS_OK)
+ {
+ nsresult error;
// XXX nsByteRange & NPByteRange are structurally equivalent.
- error = (NPError) seekablePeer->RequestRead((nsByteRange*) rangeList);
- seekablePeer->Release();
+ error = seekablePeer->RequestRead((nsByteRange *)rangeList);
+ NS_RELEASE(seekablePeer);
return error;
}
- return NPERR_STREAM_NOT_SEEKABLE;
+ return NS_ERROR_UNEXPECTED;
}
@@ -674,25 +647,28 @@ ns4xPlugin::_getJavaEnv(void)
return NULL;
}
-
const char * NP_EXPORT
ns4xPlugin::_useragent(NPP npp)
{
- NPIPluginInstancePeer* peer = (NPIPluginInstancePeer*) npp->ndata;
- PR_ASSERT(peer != NULL);
- if (peer == NULL)
+ NS_ASSERTION(mPluginManager != NULL, "null pluginmanager");
+
+ if (mPluginManager == NULL)
return NULL;
- return peer->UserAgent();
-}
+ char *retstr;
+ mPluginManager->UserAgent((const char **)&retstr);
+
+ return retstr;
+}
void * NP_EXPORT
ns4xPlugin::_memalloc (uint32 size)
{
- return thePluginManager->MemAlloc(size);
+ return mMalloc->Alloc(size);
}
+#if 0
#ifdef JAVA
java_lang_Class* NP_EXPORT
@@ -727,11 +703,11 @@ ns4xPlugin::_getJavaPeer(NPP npp)
return NULL;
}
+#endif
+
#if defined(XP_MAC) && !defined(powerc)
#pragma pointers_in_A0
#endif
//
////////////////////////////////////////////////////////////////////////
-
-#endif
diff --git a/mozilla/modules/plugin/base/src/ns4xPlugin.h b/mozilla/modules/plugin/base/src/ns4xPlugin.h
index 5819deb434c..e7b958d4721 100644
--- a/mozilla/modules/plugin/base/src/ns4xPlugin.h
+++ b/mozilla/modules/plugin/base/src/ns4xPlugin.h
@@ -21,7 +21,8 @@
#include "nsplugin.h"
#include "prlink.h" // for PRLibrary
-#include "../src/npupp.h"
+#include "npupp.h"
+#include "nsIMalloc.h"
////////////////////////////////////////////////////////////////////////
@@ -128,8 +129,6 @@ protected:
_posturl(NPP npp, const char* relativeURL, const char *target, uint32 len,
const char *buf, NPBool file);
-#if 0
-
static nsresult NP_EXPORT
_newstream(NPP npp, NPMIMEType type, const char* window, NPStream** pstream);
@@ -142,6 +141,8 @@ protected:
static void NP_EXPORT
_status(NPP npp, const char *message);
+#if 0
+
static void NP_EXPORT
_registerwindow(NPP npp, void* window);
@@ -151,6 +152,8 @@ protected:
static int16 NP_EXPORT
_allocateMenuID(NPP npp, NPBool isSubmenu);
+#endif
+
static void NP_EXPORT
_memfree (void *ptr);
@@ -187,13 +190,15 @@ protected:
static JRIEnv* NP_EXPORT
_getJavaEnv(void);
+#if 0
+
static jref NP_EXPORT
_getJavaPeer(NPP npp);
-#if defined(XP_MAC) && !defined(powerc)
-#pragma pointers_in_A0
#endif
+#if defined(XP_MAC) && !defined(powerc)
+#pragma pointers_in_A0
#endif
/**
@@ -207,7 +212,9 @@ protected:
*/
static NPNetscapeFuncs CALLBACKS;
- static nsIPluginManager *mManager;
+ static nsIPluginManager *mPluginManager;
+ static nsINetworkManager *mNetworkManager;
+ static nsIMalloc *mMalloc;
};
#endif // ns4xPlugin_h__
diff --git a/mozilla/modules/plugin/base/src/ns4xPluginInstance.cpp b/mozilla/modules/plugin/base/src/ns4xPluginInstance.cpp
new file mode 100644
index 00000000000..0e822dafd52
--- /dev/null
+++ b/mozilla/modules/plugin/base/src/ns4xPluginInstance.cpp
@@ -0,0 +1,239 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
+ *
+ * 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.
+ */
+
+#include "ns4xPluginInstance.h"
+#include "ns4xPluginStream.h"
+#include "prlog.h"
+
+////////////////////////////////////////////////////////////////////////
+
+
+ns4xPluginInstance :: ns4xPluginInstance(NPPluginFuncs* callbacks)
+ : fCallbacks(callbacks)
+{
+ NS_INIT_REFCNT();
+
+ NS_ASSERTION(fCallbacks != NULL, "null callbacks");
+
+ // Initialize the NPP structure.
+
+ fNPP.pdata = NULL;
+ fNPP.ndata = this;
+
+ fPeer = nsnull;
+}
+
+
+ns4xPluginInstance :: ~ns4xPluginInstance(void)
+{
+ NS_RELEASE(fPeer);
+}
+
+////////////////////////////////////////////////////////////////////////
+
+NS_IMPL_ADDREF(ns4xPluginInstance);
+NS_IMPL_RELEASE(ns4xPluginInstance);
+
+static NS_DEFINE_IID(kIPluginInstanceIID, NS_IPLUGININSTANCE_IID);
+static NS_DEFINE_IID(kIEventHandlerIID, NS_IEVENTHANDLER_IID);
+static NS_DEFINE_IID(kIPluginTagInfoIID, NS_IPLUGINTAGINFO_IID);
+static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID);
+
+NS_IMETHODIMP ns4xPluginInstance :: QueryInterface(const nsIID& iid, void** instance)
+{
+ if (instance == NULL)
+ return NS_ERROR_NULL_POINTER;
+
+ if (iid.Equals(kIPluginInstanceIID))
+ {
+ *instance = (void *)(nsIPluginInstance *)this;
+ AddRef();
+ return NS_OK;
+ }
+
+ if (iid.Equals(kIEventHandlerIID))
+ {
+ *instance = (void *)(nsIEventHandler *)this;
+ AddRef();
+ return NS_OK;
+ }
+
+ if (iid.Equals(kISupportsIID))
+ {
+ *instance = (void *)(nsISupports *)this;
+ AddRef();
+ return NS_OK;
+ }
+
+ return NS_NOINTERFACE;
+}
+
+
+////////////////////////////////////////////////////////////////////////
+
+NS_IMETHODIMP ns4xPluginInstance :: Initialize(nsIPluginInstancePeer* peer)
+{
+ PRUint16 count;
+ const char* const* names;
+ const char* const* values;
+
+ NS_ASSERTION(peer != NULL, "null peer");
+
+ fPeer = peer;
+
+ NS_ADDREF(fPeer);
+
+ nsresult error;
+ nsIPluginTagInfo *taginfo;
+
+ error = fPeer->QueryInterface(kIPluginTagInfoIID, (void **)&taginfo);
+
+ if (NS_OK == error)
+ {
+ if ((error = taginfo->GetAttributes(count, names, values)) != NS_OK)
+ return error;
+
+ if (fCallbacks->newp == NULL)
+ return NS_ERROR_FAILURE; // XXX right error?
+
+ // XXX Note that the NPPluginType_* enums were crafted to be
+ // backward compatible...
+
+ nsPluginMode mode;
+ nsMIMEType mimetype;
+
+ fPeer->GetMode(&mode);
+ fPeer->GetMIMEType(&mimetype);
+
+ error = (nsresult)
+ CallNPP_NewProc(fCallbacks->newp,
+ (char *)mimetype,
+ &fNPP,
+ (PRUint16)mode,
+ count,
+ (char**)names,
+ (char**)values,
+ NULL); // saved data
+
+ NS_RELEASE(taginfo);
+ }
+
+ return error;
+}
+
+NS_IMETHODIMP ns4xPluginInstance :: GetPeer(nsIPluginInstancePeer* *resultingPeer)
+{
+ NS_ADDREF(fPeer);
+ *resultingPeer = fPeer;
+ return NS_OK;
+}
+
+NS_IMETHODIMP ns4xPluginInstance::Start(void)
+{
+ // XXX At some point, we maybe should implement start and stop to
+ // load/unload the 4.x plugin, just in case there are some plugins
+ // that rely on that behavior...
+ return NS_OK;
+}
+
+NS_IMETHODIMP ns4xPluginInstance::Stop(void)
+{
+ return NS_OK;
+}
+
+NS_IMETHODIMP ns4xPluginInstance::Destroy(void)
+{
+ return NS_OK;
+}
+
+NS_IMETHODIMP ns4xPluginInstance::SetWindow(nsPluginWindow* window)
+{
+ // XXX 4.x plugins don't want a SetWindow(NULL).
+
+ if (window == NULL)
+ return NS_OK;
+
+ nsresult error = NS_OK;
+
+ if (fCallbacks->setwindow) {
+ // XXX Turns out that NPPluginWindow and NPWindow are structurally
+ // identical (on purpose!), so there's no need to make a copy.
+ error = (nsresult) CallNPP_SetWindowProc(fCallbacks->setwindow,
+ &fNPP,
+ (NPWindow*) window);
+
+ // XXX In the old code, we'd just ignore any errors coming
+ // back from the plugin's SetWindow(). Is this the correct
+ // behavior?!?
+ NS_ASSERTION(error == NS_OK, "error in setwindow");
+ }
+
+ return error;
+}
+
+NS_IMETHODIMP ns4xPluginInstance::NewStream(nsIPluginStreamPeer* peer, nsIPluginStream* *result)
+{
+ (*result) = NULL;
+
+ ns4xPluginStream* stream = new ns4xPluginStream();
+
+ if (stream == NULL)
+ return NS_ERROR_OUT_OF_MEMORY;
+
+ NS_ADDREF(stream);
+
+ nsresult error;
+
+ // does it need the peer?
+
+ if ((error = stream->Initialize(this, peer)) != NS_OK)
+ {
+ NS_RELEASE(stream);
+ return error;
+ }
+
+ (*result) = stream;
+ return NS_OK;
+}
+
+NS_IMETHODIMP ns4xPluginInstance::Print(nsPluginPrint* platformPrint)
+{
+ return NS_OK;
+}
+
+NS_IMETHODIMP ns4xPluginInstance::HandleEvent(nsPluginEvent* event, PRBool* handled)
+{
+ *handled = PR_FALSE;
+
+ return NS_OK;
+}
+
+NS_IMETHODIMP ns4xPluginInstance::URLNotify(const char* url, const char* target,
+ nsPluginReason reason, void* notifyData)
+{
+ if (fCallbacks->urlnotify != NULL)
+ {
+ CallNPP_URLNotifyProc(fCallbacks->urlnotify,
+ &fNPP,
+ url,
+ reason,
+ notifyData);
+ }
+
+ return NS_OK; //XXX this seems bad...
+}
diff --git a/mozilla/modules/plugin/base/src/ns4xPluginInstance.h b/mozilla/modules/plugin/base/src/ns4xPluginInstance.h
new file mode 100644
index 00000000000..179a4ea8dbe
--- /dev/null
+++ b/mozilla/modules/plugin/base/src/ns4xPluginInstance.h
@@ -0,0 +1,127 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
+ *
+ * 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.
+ */
+
+#ifndef ns4xPluginInstance_h__
+#define ns4xPluginInstance_h__
+
+#include "nsplugin.h"
+#include "npupp.h"
+#include "jri.h"
+
+////////////////////////////////////////////////////////////////////////
+
+class ns4xPluginInstance : public nsIPluginInstance
+{
+public:
+
+ /**
+ * Construct a new 4.x plugin instance with the specified peer
+ * and callbacks.
+ */
+ ns4xPluginInstance(NPPluginFuncs* callbacks);
+
+ // Use Release() to destroy this
+ ~ns4xPluginInstance(void);
+
+ NS_DECL_ISUPPORTS
+
+ ////////////////////////////////////////////////////////////////////////
+ // nsIPluginInstance methods
+
+ /**
+ * Actually initialize the plugin instance. This calls the 4.x newp
+ * callback, and may return an error (which is why it is distinct from the
+ * constructor.) If an error is returned, the caller should not
+ * continue to use the ns4xPluginInstance object.
+ */
+ NS_METHOD
+ Initialize(nsIPluginInstancePeer* peer);
+
+ NS_IMETHOD
+ GetPeer(nsIPluginInstancePeer* *resultingPeer);
+
+ NS_IMETHOD
+ Start(void);
+
+ NS_IMETHOD
+ Stop(void);
+
+ NS_IMETHOD
+ Destroy(void);
+
+ NS_IMETHOD
+ SetWindow(nsPluginWindow* window);
+
+ NS_IMETHOD
+ NewStream(nsIPluginStreamPeer* peer, nsIPluginStream* *result);
+
+ NS_IMETHOD
+ Print(nsPluginPrint* platformPrint);
+
+ NS_IMETHOD
+ HandleEvent(nsPluginEvent* event, PRBool* handled);
+
+ NS_IMETHOD
+ URLNotify(const char* url, const char* target,
+ nsPluginReason reason, void* notifyData);
+
+ ////////////////////////////////////////////////////////////////////////
+ // ns4xPluginInstance-specific methods
+
+
+ /**
+ * Return the 4.x-style interface object.
+ */
+ NS_IMETHOD
+ GetNPP(NPP * aNPP) {
+ *aNPP = &fNPP;
+ return NS_OK;
+ };
+
+ /**
+ * Return the callbacks for the plugin instance.
+ */
+ NS_IMETHOD
+ GetCallbacks(const NPPluginFuncs ** aCallbacks) {
+ *aCallbacks = fCallbacks;
+ return NS_OK;
+ };
+
+protected:
+
+ /**
+ * The plugin instance peer for this instance.
+ */
+ nsIPluginInstancePeer* fPeer;
+
+ /**
+ * A pointer to the plugin's callback functions. This information
+ * is actually stored in the plugin class (nsPluginClass),
+ * and is common for all plugins of the class.
+ */
+ NPPluginFuncs* fCallbacks;
+
+ /**
+ * The 4.x-style structure used to communicate between the plugin
+ * instance and the browser.
+ */
+ NPP_t fNPP;
+};
+
+
+#endif // ns4xPluginInstance_h__
diff --git a/mozilla/modules/plugin/base/src/ns4xPluginStream.cpp b/mozilla/modules/plugin/base/src/ns4xPluginStream.cpp
new file mode 100644
index 00000000000..8fbac3b5e44
--- /dev/null
+++ b/mozilla/modules/plugin/base/src/ns4xPluginStream.cpp
@@ -0,0 +1,210 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
+ *
+ * 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.
+ */
+
+
+#include "ns4xPluginStream.h"
+#include "prlog.h" // for PR_ASSERT
+
+////////////////////////////////////////////////////////////////////////
+
+
+ns4xPluginStream::ns4xPluginStream(void)
+ : fStreamType(nsPluginStreamType_Normal), fSeekable(PR_FALSE), fPosition(0)
+{
+ NS_INIT_REFCNT();
+
+ // Initialize the 4.x interface structure
+ memset(&fNPStream, 0, sizeof(fNPStream));
+}
+
+
+ns4xPluginStream::~ns4xPluginStream(void)
+{
+ const NPPluginFuncs *callbacks;
+ NPP npp;
+ nsPluginReason reason;
+
+ fInstance->GetCallbacks(&callbacks);
+ fInstance->GetNPP(&npp);
+ fPeer->GetReason(&reason);
+
+ if (callbacks->destroystream != NULL)
+ {
+ CallNPP_DestroyStreamProc(callbacks->destroystream,
+ npp,
+ &fNPStream,
+ reason);
+ }
+
+ NS_IF_RELEASE(fPeer);
+ NS_IF_RELEASE(fInstance);
+}
+
+
+////////////////////////////////////////////////////////////////////////
+
+NS_IMPL_ADDREF(ns4xPluginStream);
+NS_IMPL_RELEASE(ns4xPluginStream);
+
+static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID);
+static NS_DEFINE_IID(kIPluginStreamIID, NS_IPLUGINSTREAM_IID);
+static NS_DEFINE_IID(kISeekablePluginStreamPeerIID, NS_ISEEKABLEPLUGINSTREAMPEER_IID);
+
+NS_IMETHODIMP ns4xPluginStream::QueryInterface(const nsIID& iid, void** instance)
+{
+ if (instance == NULL)
+ return NS_ERROR_NULL_POINTER;
+
+ if (iid.Equals(kIPluginStreamIID))
+ {
+ *instance = (void *)(nsIPluginStream *)this;
+ AddRef();
+ return NS_OK;
+ }
+ else if (iid.Equals(kISupportsIID))
+ {
+ *instance = (void *)(nsISupports *)this;
+ AddRef();
+ return NS_OK;
+ }
+
+ return NS_NOINTERFACE;
+}
+
+
+////////////////////////////////////////////////////////////////////////
+
+
+NS_IMETHODIMP ns4xPluginStream::Initialize(ns4xPluginInstance* instance,
+ nsIPluginStreamPeer* peer)
+{
+ fInstance = instance;
+ fPeer = peer;
+
+ NS_ASSERTION(fInstance != NULL, "null instance");
+
+ fInstance->AddRef();
+
+ NS_ASSERTION(fPeer != NULL, "null peer");
+
+ NS_ADDREF(fPeer);
+
+ const char *url;
+ PRUint32 length, modified;
+
+ fPeer->GetURL(&url);
+ fPeer->GetEnd(&length);
+ fPeer->GetLastModified(&modified);
+
+ fNPStream.ndata = (void*) fPeer;
+ fNPStream.url = url;
+ fNPStream.end = length;
+ fNPStream.lastmodified = modified;
+
+ // Are we seekable?
+
+ nsISupports* seekablePeer;
+
+ if (fPeer->QueryInterface(kISeekablePluginStreamPeerIID,
+ (void**) &seekablePeer) == NS_OK)
+ {
+ fSeekable = TRUE;
+ NS_RELEASE(seekablePeer);
+ }
+
+ const NPPluginFuncs *callbacks;
+ NPP npp;
+ nsMIMEType mimetype;
+
+ fInstance->GetCallbacks(&callbacks);
+ fInstance->GetNPP(&npp);
+ fPeer->GetMIMEType(&mimetype);
+
+ if (callbacks->newstream == NULL)
+ return NS_ERROR_FAILURE;
+
+ PRUint16 streamType = (PRUint16) fStreamType;
+
+ nsresult error
+ = (nsresult)CallNPP_NewStreamProc(callbacks->newstream,
+ npp,
+ (char *)mimetype,
+ &fNPStream,
+ fSeekable,
+ &streamType);
+
+ fStreamType = (nsPluginStreamType) streamType;
+
+ return error;
+}
+
+NS_IMETHODIMP ns4xPluginStream::Write(const char* buffer, PRInt32 offset, PRInt32 len, PRInt32 *aWriteCount)
+{
+ const NPPluginFuncs *callbacks;
+ NPP npp;
+
+ fInstance->GetCallbacks(&callbacks);
+ fInstance->GetNPP(&npp);
+
+ if (callbacks->write == NULL)
+ return NS_OK;
+
+ *aWriteCount = CallNPP_WriteProc(callbacks->write,
+ npp,
+ &fNPStream,
+ fPosition,
+ len,
+ (void *)buffer);
+
+ fPosition += len;
+
+ return NS_OK; //XXX this seems bad...
+}
+
+NS_IMETHODIMP ns4xPluginStream::GetStreamType(nsPluginStreamType *result)
+{
+ *result = fStreamType;
+ return NS_OK;
+}
+
+NS_IMETHODIMP ns4xPluginStream::AsFile(const char* filename)
+{
+ const NPPluginFuncs *callbacks;
+ NPP npp;
+
+ fInstance->GetCallbacks(&callbacks);
+ fInstance->GetNPP(&npp);
+
+ if (callbacks->asfile == NULL)
+ return NS_OK;
+
+ CallNPP_StreamAsFileProc(callbacks->asfile,
+ npp,
+ &fNPStream,
+ filename);
+
+ return NS_OK;
+}
+
+NS_IMETHODIMP ns4xPluginStream :: Close(void)
+{
+ return NS_OK;
+}
+
+////////////////////////////////////////////////////////////////////////
+
diff --git a/mozilla/modules/plugin/base/src/ns4xPluginStream.h b/mozilla/modules/plugin/base/src/ns4xPluginStream.h
new file mode 100644
index 00000000000..83940820cf6
--- /dev/null
+++ b/mozilla/modules/plugin/base/src/ns4xPluginStream.h
@@ -0,0 +1,112 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
+ *
+ * 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.
+ */
+
+#ifndef ns4xPluginStream_h__
+#define ns4xPluginStream_h__
+
+#include "jri.h" // XXX should be jni.h
+#include "nsplugin.h"
+#include "ns4xPluginInstance.h"
+
+////////////////////////////////////////////////////////////////////////
+
+/**
+ * A 5.0 wrapper for a 4.x plugin stream.
+ */
+class ns4xPluginStream : public nsIPluginStream
+{
+public:
+
+ /**
+ * Construct a new 4.x plugin stream associated with the specified
+ * instance and stream peer.
+ */
+ ns4xPluginStream();
+ ~ns4xPluginStream();
+
+ NS_DECL_ISUPPORTS
+
+ /**
+ * Do internal initialization. This actually calls into the 4.x plugin
+ * to create the stream, and may fail (which is why it's separate from
+ * the constructor).
+ */
+ NS_METHOD
+ Initialize(ns4xPluginInstance* instance, nsIPluginStreamPeer* peer);
+
+ ////////////////////////////////////////////////////////////////////////
+ // nsIPluginStream methods
+
+ // (Corresponds to NPP_Write and NPN_Write.)
+ NS_IMETHOD
+ Write(const char* buffer, PRInt32 offset, PRInt32 len, PRInt32 *aWriteCount);
+
+ // (Corresponds to NPP_NewStream's stype return parameter.)
+ NS_IMETHOD
+ GetStreamType(nsPluginStreamType *result);
+
+ // (Corresponds to NPP_StreamAsFile.)
+ NS_IMETHOD
+ AsFile(const char* fname);
+
+ NS_IMETHOD
+ Close(void);
+
+ ////////////////////////////////////////////////////////////////////////
+ // Methods specific to ns4xPluginStream
+
+protected:
+
+ /**
+ * The plugin instance to which this stream belongs.
+ */
+ ns4xPluginInstance* fInstance;
+
+ /**
+ * The peer associated with this stream.
+ */
+ nsIPluginStreamPeer* fPeer;
+
+ /**
+ * The type of stream, for the peer's use.
+ */
+ nsPluginStreamType fStreamType;
+
+ /**
+ * The 4.x-style structure used to contain stream information.
+ * This is what actually gets used to communicate with the plugin.
+ */
+ NPStream fNPStream;
+
+ /**
+ * Set to TRUE if the peer implements
+ * NPISeekablPluginStreamPeer.
+ */
+ PRBool fSeekable;
+
+ /**
+ * Tracks the position in the content that is being
+ * read. 4.x-style plugins expect to be told the offset in the
+ * buffer that they should read to, even though it's always
+ * done serially.
+ */
+ PRUint32 fPosition;
+};
+
+
+#endif // ns4xPluginStream_h__
diff --git a/mozilla/modules/plugin/base/src/nsIPluginHost.h b/mozilla/modules/plugin/base/src/nsIPluginHost.h
index a2f541676e2..8e8bfc4f08f 100644
--- a/mozilla/modules/plugin/base/src/nsIPluginHost.h
+++ b/mozilla/modules/plugin/base/src/nsIPluginHost.h
@@ -36,7 +36,7 @@ public:
LoadPlugins(void) = 0;
NS_IMETHOD
- InstantiatePlugin(char *aMimeType, nsISupports ** aPluginInst) = 0;
+ InstantiatePlugin(char *aMimeType, nsIPluginInstance ** aPluginInst) = 0;
};
#endif
diff --git a/mozilla/modules/plugin/base/src/nsPluginHostImpl.cpp b/mozilla/modules/plugin/base/src/nsPluginHostImpl.cpp
index 10a50d39e46..ad0c2649087 100644
--- a/mozilla/modules/plugin/base/src/nsPluginHostImpl.cpp
+++ b/mozilla/modules/plugin/base/src/nsPluginHostImpl.cpp
@@ -21,11 +21,15 @@
#include "prio.h"
#include "prmem.h"
#include "ns4xPlugin.h"
+#include "nsMalloc.h" //this is evil...
+#include "nsPluginInstancePeer.h"
#ifdef XP_PC
#include "windows.h"
#endif
+static NS_DEFINE_IID(kIPluginInstanceIID, NS_IPLUGININSTANCE_IID);
+
nsPluginTag :: nsPluginTag()
{
mNext = nsnull;
@@ -104,6 +108,7 @@ nsPluginTag :: ~nsPluginTag()
static NS_DEFINE_IID(kIPluginManagerIID, NS_IPLUGINMANAGER_IID);
static NS_DEFINE_IID(kIPluginHostIID, NS_IPLUGINHOST_IID);
+static NS_DEFINE_IID(kIMallocIID, NS_IMALLOC_IID);
static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID);
nsPluginHostImpl :: nsPluginHostImpl()
@@ -124,6 +129,8 @@ nsPluginHostImpl :: ~nsPluginHostImpl()
delete mPlugins;
mPlugins = temp;
}
+
+ NS_IF_RELEASE(mMalloc);
}
NS_IMPL_ADDREF(nsPluginHostImpl)
@@ -151,6 +158,13 @@ nsresult nsPluginHostImpl :: QueryInterface(const nsIID& aIID,
return NS_OK;
}
+ if (aIID.Equals(kIMallocIID))
+ {
+ *aInstancePtrResult = mMalloc;
+ NS_IF_ADDREF(mMalloc);
+ return NS_OK;
+ }
+
if (aIID.Equals(kISupportsIID))
{
*aInstancePtrResult = (void *)((nsISupports *)((nsIPluginHost *)this));
@@ -183,14 +197,32 @@ nsresult nsPluginHostImpl :: SetValue(nsPluginManagerVariable variable, void *va
return NS_OK;
}
-//nsresult nsPluginHostImpl :: FetchURL(nsISupports* peer, nsURLInfo* urlInfo)
-//{
-// return NS_OK;
-//}
+NS_IMETHODIMP nsPluginHostImpl :: GetURL(nsISupports* peer, const char* url,
+ const char* target,
+ void* notifyData, const char* altHost,
+ const char* referrer, PRBool forceJSEnabled)
+{
+ return NS_OK;
+}
+
+NS_IMETHODIMP nsPluginHostImpl :: PostURL(nsISupports* peer,
+ const char* url, const char* target,
+ PRUint32 postDataLen, const char* postData,
+ PRBool isFile, void* notifyData,
+ const char* altHost, const char* referrer,
+ PRBool forceJSEnabled,
+ PRUint32 postHeadersLength, const char* postHeaders)
+{
+ return NS_OK;
+}
nsresult nsPluginHostImpl :: Init(void)
{
- return NS_OK;
+ nsresult rv;
+
+ rv = nsMalloc::Create(nsnull, kIMallocIID, (void **)&mMalloc);
+
+ return rv;
}
nsresult nsPluginHostImpl :: LoadPlugins(void)
@@ -520,7 +552,7 @@ printf("plugin %s added to list %s\n", plugintag->mName, (plugintag->mFlags & NS
return NS_OK;
}
-nsresult nsPluginHostImpl :: InstantiatePlugin(char *aMimeType, nsISupports ** aPluginInst)
+nsresult nsPluginHostImpl :: InstantiatePlugin(char *aMimeType, nsIPluginInstance ** aPluginInst)
{
nsPluginTag *plugins = mPlugins;
PRInt32 variants, cnt;
@@ -558,10 +590,32 @@ printf("loaded plugin %s for mime type %s\n", plugins->mName, aMimeType);
{
if (nsnull == plugins->mEntryPoint)
{
+ //create the plugin object
+
if (plugins->mFlags & NS_PLUGIN_FLAG_OLDSCHOOL)
- plugins->mEntryPoint = PR_FindSymbol(plugins->mLibrary, "NP_Initialize");
+ {
+ nsresult rv = ns4xPlugin::CreatePlugin(plugins->mLibrary, (nsIPlugin **)&plugins->mEntryPoint);
+printf("result of creating plugin adapter: %d\n", rv);
+ }
else
- plugins->mEntryPoint = PR_FindSymbol(plugins->mLibrary, "NSGetFactory");
+ plugins->mEntryPoint = (nsIPlugin *)PR_FindSymbol(plugins->mLibrary, "NSGetFactory");
+
+ if (nsnull != plugins->mEntryPoint)
+ plugins->mEntryPoint->Initialize((nsISupports *)(nsIPluginManager *)this);
+ }
+
+ if (nsnull != plugins->mEntryPoint)
+ {
+ //create an instance
+
+ if (NS_OK == plugins->mEntryPoint->CreateInstance(nsnull, kIPluginInstanceIID, (void **)aPluginInst))
+ {
+printf("successfully created plugin instance\n");
+
+ nsIPluginInstancePeer *peer = new nsPluginInstancePeerImpl();
+
+ (*aPluginInst)->Initialize(peer);
+ }
}
}
else
diff --git a/mozilla/modules/plugin/base/src/nsPluginHostImpl.h b/mozilla/modules/plugin/base/src/nsPluginHostImpl.h
index f45b16c50f3..07168081f75 100644
--- a/mozilla/modules/plugin/base/src/nsPluginHostImpl.h
+++ b/mozilla/modules/plugin/base/src/nsPluginHostImpl.h
@@ -22,8 +22,10 @@
#include "xp_core.h"
#include "nsIPluginManager.h"
#include "nsIPluginHost.h"
+#include "nsINetworkManager.h"
#include "nsCRT.h"
#include "prlink.h"
+#include "nsIMalloc.h"
class ns4xPlugin;
@@ -44,7 +46,7 @@ public:
char **mMimeDescriptionArray;
char **mExtensionsArray;
PRLibrary *mLibrary;
- void *mEntryPoint;
+ nsIPlugin *mEntryPoint;
ns4xPlugin *mAdapter;
PRUint32 mFlags;
};
@@ -52,7 +54,8 @@ public:
#define NS_PLUGIN_FLAG_ENABLED 0x0001 //is this plugin enabled?
#define NS_PLUGIN_FLAG_OLDSCHOOL 0x0002 //is this a pre-xpcom plugin?
-class nsPluginHostImpl : public nsIPluginManager, public nsIPluginHost
+class nsPluginHostImpl : public nsIPluginManager, public nsIPluginHost,
+ public nsINetworkManager
{
public:
nsPluginHostImpl();
@@ -80,8 +83,20 @@ public:
NS_IMETHOD
SetValue(nsPluginManagerVariable variable, void *value);
-// NS_IMETHOD
-// FetchURL(nsISupports* peer, nsURLInfo* urlInfo);
+ //nsINetworkManager interface
+
+ NS_IMETHOD
+ GetURL(nsISupports* peer, const char* url, const char* target,
+ void* notifyData = NULL, const char* altHost = NULL,
+ const char* referrer = NULL, PRBool forceJSEnabled = PR_FALSE);
+
+ NS_IMETHOD
+ PostURL(nsISupports* peer, const char* url, const char* target,
+ PRUint32 postDataLen, const char* postData,
+ PRBool isFile = PR_FALSE, void* notifyData = NULL,
+ const char* altHost = NULL, const char* referrer = NULL,
+ PRBool forceJSEnabled = PR_FALSE,
+ PRUint32 postHeadersLength = 0, const char* postHeaders = NULL);
//nsIPluginHost interface
@@ -92,11 +107,12 @@ public:
LoadPlugins(void);
NS_IMETHOD
- InstantiatePlugin(char *aMimeType, nsISupports ** aPluginInst);
+ InstantiatePlugin(char *aMimeType, nsIPluginInstance ** aPluginInst);
private:
char *mPluginPath;
nsPluginTag *mPlugins;
+ nsIMalloc *mMalloc;
};
#endif
diff --git a/mozilla/modules/plugin/base/src/nsPluginInstancePeer.cpp b/mozilla/modules/plugin/base/src/nsPluginInstancePeer.cpp
new file mode 100644
index 00000000000..53f07f5ffe0
--- /dev/null
+++ b/mozilla/modules/plugin/base/src/nsPluginInstancePeer.cpp
@@ -0,0 +1,103 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
+ *
+ * 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.
+ */
+
+#include "nsPluginInstancePeer.h"
+
+nsPluginInstancePeerImpl :: nsPluginInstancePeerImpl()
+{
+}
+
+nsPluginInstancePeerImpl :: ~nsPluginInstancePeerImpl()
+{
+}
+
+NS_IMPL_ADDREF(nsPluginInstancePeerImpl);
+NS_IMPL_RELEASE(nsPluginInstancePeerImpl);
+
+static NS_DEFINE_IID(kIPluginTagInfoIID, NS_IPLUGINTAGINFO_IID);
+static NS_DEFINE_IID(kIPluginInstancePeerIID, NS_IPLUGININSTANCEPEER_IID);
+static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID);
+
+nsresult nsPluginInstancePeerImpl :: QueryInterface(const nsIID& iid, void** instance)
+{
+ if (instance == NULL)
+ return NS_ERROR_NULL_POINTER;
+
+ if (iid.Equals(kIPluginInstancePeerIID))
+ {
+ *instance = (void *)(nsISupports *)(nsIPluginInstancePeer *)this;
+ AddRef();
+ return NS_OK;
+ }
+
+ if (iid.Equals(kIPluginTagInfoIID))
+ {
+ *instance = (void *)(nsISupports *)(nsIPluginTagInfo *)this;
+ AddRef();
+ return NS_OK;
+ }
+
+ if (iid.Equals(kISupportsIID))
+ {
+ *instance = (void *)(nsISupports *)(nsIPluginTagInfo *)this;
+ AddRef();
+ return NS_OK;
+ }
+
+ return NS_NOINTERFACE;
+}
+
+NS_IMETHODIMP nsPluginInstancePeerImpl :: GetValue(nsPluginInstancePeerVariable variable, void *value)
+{
+ return NS_OK;
+}
+
+NS_IMETHODIMP nsPluginInstancePeerImpl :: SetValue(nsPluginInstancePeerVariable variable, void *value)
+{
+ return NS_OK;
+}
+
+NS_IMETHODIMP nsPluginInstancePeerImpl :: GetMIMEType(nsMIMEType *result)
+{
+ return NS_OK;
+}
+
+NS_IMETHODIMP nsPluginInstancePeerImpl :: GetMode(nsPluginMode *result)
+{
+ return NS_OK;
+}
+
+NS_IMETHODIMP nsPluginInstancePeerImpl :: NewStream(nsMIMEType type, const char* target, nsIOutputStream* *result)
+{
+ return NS_OK;
+}
+
+NS_IMETHODIMP nsPluginInstancePeerImpl :: ShowStatus(const char* message)
+{
+ return NS_OK;
+}
+
+NS_IMETHODIMP nsPluginInstancePeerImpl :: GetAttributes(PRUint16& n, const char*const*& names, const char*const*& values)
+{
+ return NS_OK;
+}
+
+NS_IMETHODIMP nsPluginInstancePeerImpl :: GetAttribute(const char* name, const char* *result)
+{
+ return NS_OK;
+}
diff --git a/mozilla/modules/plugin/base/src/nsPluginInstancePeer.h b/mozilla/modules/plugin/base/src/nsPluginInstancePeer.h
new file mode 100644
index 00000000000..a208d050444
--- /dev/null
+++ b/mozilla/modules/plugin/base/src/nsPluginInstancePeer.h
@@ -0,0 +1,62 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
+ *
+ * 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.
+ */
+
+#ifndef nsPluginInstancePeer_h___
+#define nsPluginInstancePeer_h___
+
+#include "nsIPluginInstancePeer.h"
+#include "nsIPluginTagInfo.h"
+
+class nsPluginInstancePeerImpl : public nsIPluginInstancePeer, public nsIPluginTagInfo
+{
+public:
+ nsPluginInstancePeerImpl();
+ ~nsPluginInstancePeerImpl();
+
+ NS_DECL_ISUPPORTS
+
+ //nsIPluginInstancePeer interface
+
+ NS_IMETHOD
+ GetValue(nsPluginInstancePeerVariable variable, void *value);
+
+ NS_IMETHOD
+ SetValue(nsPluginInstancePeerVariable variable, void *value);
+
+ NS_IMETHOD
+ GetMIMEType(nsMIMEType *result);
+
+ NS_IMETHOD
+ GetMode(nsPluginMode *result);
+
+ NS_IMETHOD
+ NewStream(nsMIMEType type, const char* target, nsIOutputStream* *result);
+
+ NS_IMETHOD
+ ShowStatus(const char* message);
+
+ //nsIPluginTagInfo interface
+
+ NS_IMETHOD
+ GetAttributes(PRUint16& n, const char*const*& names, const char*const*& values);
+
+ NS_IMETHOD
+ GetAttribute(const char* name, const char* *result);
+};
+
+#endif
diff --git a/mozilla/modules/plugin/nglsrc/Makefile b/mozilla/modules/plugin/nglsrc/Makefile
index 5d054a68240..8a986c0018b 100644
--- a/mozilla/modules/plugin/nglsrc/Makefile
+++ b/mozilla/modules/plugin/nglsrc/Makefile
@@ -31,6 +31,9 @@ CPPSRCS = \
nsPluginHostImpl.cpp \
nsPluginFactory.cpp \
ns4xPlugin.cpp \
+ ns4xPluginInstance.cpp \
+ ns4xPluginStream.cpp \
+ nsPluginInstancePeer.cpp \
$(NULL)
REQUIRES = raptor plugin java xpcom
diff --git a/mozilla/modules/plugin/nglsrc/makefile.win b/mozilla/modules/plugin/nglsrc/makefile.win
index fcdaec4c366..46de9b2cb6e 100644
--- a/mozilla/modules/plugin/nglsrc/makefile.win
+++ b/mozilla/modules/plugin/nglsrc/makefile.win
@@ -35,6 +35,9 @@ OBJS = \
.\$(OBJDIR)\nsPluginHostImpl.obj \
.\$(OBJDIR)\nsPluginFactory.obj \
.\$(OBJDIR)\ns4xPlugin.obj \
+ .\$(OBJDIR)\ns4xPluginInstance.obj \
+ .\$(OBJDIR)\ns4xPluginStream.obj \
+ .\$(OBJDIR)\nsPluginInstancePeer.obj \
$(NULL)
LINCS= \
diff --git a/mozilla/modules/plugin/nglsrc/ns4xPlugin.cpp b/mozilla/modules/plugin/nglsrc/ns4xPlugin.cpp
index c0de5348bde..896582d05ad 100644
--- a/mozilla/modules/plugin/nglsrc/ns4xPlugin.cpp
+++ b/mozilla/modules/plugin/nglsrc/ns4xPlugin.cpp
@@ -21,7 +21,8 @@
#include "xp_core.h"
#include "nsplugin.h"
#include "ns4xPlugin.h"
-//#include "ns4xPluginInstance.h"
+#include "nsIPluginStream.h"
+#include "ns4xPluginInstance.h"
////////////////////////////////////////////////////////////////////////
@@ -34,7 +35,9 @@ typedef NPError (*NP_PLUGINSHUTDOWN)();
////////////////////////////////////////////////////////////////////////
NPNetscapeFuncs ns4xPlugin::CALLBACKS;
-nsIPluginManager * ns4xPlugin::mManager;
+nsIPluginManager * ns4xPlugin::mPluginManager;
+nsINetworkManager * ns4xPlugin::mNetworkManager;
+nsIMalloc * ns4xPlugin::mMalloc;
void
ns4xPlugin::CheckClassInitialized(void)
@@ -44,7 +47,9 @@ ns4xPlugin::CheckClassInitialized(void)
if (initialized)
return;
- mManager = nsnull;
+ mPluginManager = nsnull;
+ mNetworkManager = nsnull;
+ mMalloc = nsnull;
// XXX It'd be nice to make this const and initialize it
// statically...
@@ -53,25 +58,25 @@ ns4xPlugin::CheckClassInitialized(void)
CALLBACKS.geturl = NewNPN_GetURLProc(_geturl);
CALLBACKS.posturl = NewNPN_PostURLProc(_posturl);
-// CALLBACKS.requestread = NewNPN_RequestReadProc(_requestread);
-// CALLBACKS.newstream = NewNPN_NewStreamProc(_newstream);
-// CALLBACKS.write = NewNPN_WriteProc(_write);
-// CALLBACKS.destroystream = NewNPN_DestroyStreamProc(_destroystream);
-// CALLBACKS.status = NewNPN_StatusProc(_status);
-// CALLBACKS.uagent = NewNPN_UserAgentProc(_useragent);
-// CALLBACKS.memalloc = NewNPN_MemAllocProc(_memalloc);
-// CALLBACKS.memfree = NewNPN_MemFreeProc(_memfree);
-// CALLBACKS.memflush = NewNPN_MemFlushProc(_memflush);
-// CALLBACKS.reloadplugins = NewNPN_ReloadPluginsProc(_reloadplugins);
-// CALLBACKS.getJavaEnv = NewNPN_GetJavaEnvProc(_getJavaEnv);
+ CALLBACKS.requestread = NewNPN_RequestReadProc(_requestread);
+ CALLBACKS.newstream = NewNPN_NewStreamProc(_newstream);
+ CALLBACKS.write = NewNPN_WriteProc(_write);
+ CALLBACKS.destroystream = NewNPN_DestroyStreamProc(_destroystream);
+ CALLBACKS.status = NewNPN_StatusProc(_status);
+ CALLBACKS.uagent = NewNPN_UserAgentProc(_useragent);
+ CALLBACKS.memalloc = NewNPN_MemAllocProc(_memalloc);
+ CALLBACKS.memfree = NewNPN_MemFreeProc(_memfree);
+ CALLBACKS.memflush = NewNPN_MemFlushProc(_memflush);
+ CALLBACKS.reloadplugins = NewNPN_ReloadPluginsProc(_reloadplugins);
+ CALLBACKS.getJavaEnv = NewNPN_GetJavaEnvProc(_getJavaEnv);
// CALLBACKS.getJavaPeer = NewNPN_GetJavaPeerProc(_getJavaPeer);
CALLBACKS.geturlnotify = NewNPN_GetURLNotifyProc(_geturlnotify);
CALLBACKS.posturlnotify = NewNPN_PostURLNotifyProc(_posturlnotify);
-// CALLBACKS.getvalue = NewNPN_GetValueProc(_getvalue);
-// CALLBACKS.setvalue = NewNPN_SetValueProc(_setvalue);
-// CALLBACKS.invalidaterect = NewNPN_InvalidateRectProc(_invalidaterect);
-// CALLBACKS.invalidateregion = NewNPN_InvalidateRegionProc(_invalidateregion);
-// CALLBACKS.forceredraw = NewNPN_ForceRedrawProc(_forceredraw);
+ CALLBACKS.getvalue = NewNPN_GetValueProc(_getvalue);
+ CALLBACKS.setvalue = NewNPN_SetValueProc(_setvalue);
+ CALLBACKS.invalidaterect = NewNPN_InvalidateRectProc(_invalidaterect);
+ CALLBACKS.invalidateregion = NewNPN_InvalidateRegionProc(_invalidateregion);
+ CALLBACKS.forceredraw = NewNPN_ForceRedrawProc(_forceredraw);
initialized = TRUE;
};
@@ -83,13 +88,14 @@ ns4xPlugin::ns4xPlugin(NPPluginFuncs* callbacks)
{
NS_INIT_REFCNT();
memcpy((void*) &fCallbacks, (void*) callbacks, sizeof(fCallbacks));
- mManager = nsnull;
}
ns4xPlugin::~ns4xPlugin(void)
{
- NS_IF_RELEASE(mManager);
+ NS_IF_RELEASE(mPluginManager);
+ NS_IF_RELEASE(mNetworkManager);
+ NS_IF_RELEASE(mMalloc);
}
@@ -102,6 +108,8 @@ NS_IMPL_RELEASE(ns4xPlugin);
static NS_DEFINE_IID(kILiveConnectPluginIID, NS_ILIVECONNECTPLUGIN_IID);
static NS_DEFINE_IID(kIPluginIID, NS_IPLUGIN_IID);
static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID);
+static NS_DEFINE_IID(kIWindowlessPluginInstancePeerIID, NS_IWINDOWLESSPLUGININSTANCEPEER_IID);
+static NS_DEFINE_IID(kISeekablePluginStreamPeerIID, NS_ISEEKABLEPLUGINSTREAMPEER_IID);
nsresult
ns4xPlugin::QueryInterface(const nsIID& iid, void** instance)
@@ -109,20 +117,28 @@ ns4xPlugin::QueryInterface(const nsIID& iid, void** instance)
if (instance == NULL)
return NS_ERROR_NULL_POINTER;
- if (iid.Equals(kIPluginIID) ||
- iid.Equals(kISupportsIID)) {
- *instance = (void*) this;
+ if (iid.Equals(kIPluginIID))
+ {
+ *instance = (void *)(nsIPlugin *)this;
AddRef();
return NS_OK;
}
- if (iid.Equals(kILiveConnectPluginIID)) {
+ if (iid.Equals(kILiveConnectPluginIID))
+ {
// Check the 4.x plugin callbacks to see if it supports
// LiveConnect...
if (fCallbacks.javaClass == NULL)
return NS_NOINTERFACE;
- *instance = (void*) this;
+ *instance = (void *)(nsILiveConnectPlugin *)this;
+ AddRef();
+ return NS_OK;
+ }
+
+ if (iid.Equals(kISupportsIID))
+ {
+ *instance = (void *)(nsISupports *)this;
AddRef();
return NS_OK;
}
@@ -200,7 +216,7 @@ nsresult ns4xPlugin :: CreateInstance(nsISupports *aOuter,
nsISupports *inst;
inst = nsnull;
-// inst = (nsISupports *)(nsIPluginInstance *)new ns4xPluginInstance();
+ inst = (nsISupports *)(nsIPluginInstance *)new ns4xPluginInstance(&fCallbacks);
if (inst == NULL) {
return NS_ERROR_OUT_OF_MEMORY;
@@ -223,20 +239,33 @@ nsresult ns4xPlugin :: LockFactory(PRBool aLock)
}
static NS_DEFINE_IID(kIPluginManagerIID, NS_IPLUGINMANAGER_IID);
+static NS_DEFINE_IID(kINetworkManagerIID, NS_INETWORKMANAGER_IID);
+static NS_DEFINE_IID(kIMallocIID, NS_IMALLOC_IID);
nsresult
ns4xPlugin::Initialize(nsISupports* browserInterfaces)
{
- if (nsnull == mManager)
- return browserInterfaces->QueryInterface(kIPluginManagerIID, (void **)&mManager);
- else
- return NS_OK;
+ nsresult rv = NS_OK;
+
+ if (nsnull == mPluginManager)
+ rv = browserInterfaces->QueryInterface(kIPluginManagerIID, (void **)&mPluginManager);
+
+ if (nsnull == mNetworkManager)
+ rv = browserInterfaces->QueryInterface(kINetworkManagerIID, (void **)&mNetworkManager);
+
+ if (nsnull == mMalloc)
+ rv = browserInterfaces->QueryInterface(kIMallocIID, (void **)&mMalloc);
+
+ return rv;
}
nsresult
ns4xPlugin::Shutdown(void)
{
- NS_IF_RELEASE(mManager);
+ NS_IF_RELEASE(mPluginManager);
+ NS_IF_RELEASE(mNetworkManager);
+ NS_IF_RELEASE(mMalloc);
+
return NS_OK;
}
@@ -262,7 +291,7 @@ ns4xPlugin::SetValue(nsPluginVariable variable, void *value)
nsresult
ns4xPlugin::GetJavaClass(jclass *resultingClass)
{
- *resultingClass = fCallbacks.javaClass;
+ *resultingClass = (jclass)fCallbacks.javaClass;
return NS_OK;
}
@@ -277,29 +306,12 @@ ns4xPlugin::_geturl(NPP npp, const char* relativeURL, const char* target)
nsIPluginInstancePeer* peer = (nsIPluginInstancePeer*) npp->ndata;
NS_ASSERTION(peer != NULL, "null peer");
- NS_ASSERTION(mManager != NULL, "null manager");
+ NS_ASSERTION(mNetworkManager != NULL, "null manager");
if (peer == NULL)
return NS_ERROR_UNEXPECTED; // XXX
-#if 0
- nsURLInfo urlinfo;
- urlinfo.version = nsURLInfo_Version;
- urlinfo.url = relativeURL;
- urlinfo.target = target;
- urlinfo.notifyData = nsnull;
- urlinfo.altHost = nsnull;
- urlinfo.referrer = nsnull;
- urlinfo.forceJSEnabled = PR_FALSE;
- urlinfo.postData = nsnull;
- urlinfo.postDataLength = 0;
- urlinfo.postHeaders = nsnull;
- urlinfo.postHeadersLength = 0;
- urlinfo.postFile = PR_FALSE;
-
- return mManager->FetchURL(peer, &urlinfo);
-#endif
- return NS_OK;
+ return mNetworkManager->GetURL(peer, relativeURL, target);
}
nsresult NP_EXPORT
@@ -309,29 +321,13 @@ ns4xPlugin::_geturlnotify(NPP npp, const char* relativeURL, const char* target,
nsIPluginInstancePeer* peer = (nsIPluginInstancePeer*) npp->ndata;
NS_ASSERTION(peer != NULL, "null peer");
- NS_ASSERTION(mManager != NULL, "null manager");
+ NS_ASSERTION(mNetworkManager != NULL, "null manager");
if (peer == NULL)
return NS_ERROR_UNEXPECTED; // XXX
-#if 0
- nsURLInfo urlinfo;
- urlinfo.version = nsURLInfo_Version;
- urlinfo.url = relativeURL;
- urlinfo.target = target;
- urlinfo.notifyData = notifyData;
- urlinfo.altHost = nsnull;
- urlinfo.referrer = nsnull;
- urlinfo.forceJSEnabled = PR_FALSE;
- urlinfo.postData = nsnull;
- urlinfo.postDataLength = 0;
- urlinfo.postHeaders = nsnull;
- urlinfo.postHeadersLength = 0;
- urlinfo.postFile = PR_FALSE;
-
- return mManager->FetchURL(peer, &urlinfo);
-#endif
- return NS_OK;
+ return mNetworkManager->GetURL(peer, relativeURL, target,
+ notifyData);
}
@@ -343,29 +339,13 @@ ns4xPlugin::_posturlnotify(NPP npp, const char* relativeURL, const char *target,
nsIPluginInstancePeer* peer = (nsIPluginInstancePeer*) npp->ndata;
NS_ASSERTION(peer != NULL, "null peer");
- NS_ASSERTION(mManager != NULL, "null manager");
+ NS_ASSERTION(mNetworkManager != NULL, "null manager");
if (peer == NULL)
return NS_ERROR_UNEXPECTED; // XXX
-#if 0
- nsURLInfo urlinfo;
- urlinfo.version = nsURLInfo_Version;
- urlinfo.url = relativeURL;
- urlinfo.target = target;
- urlinfo.notifyData = notifyData;
- urlinfo.altHost = nsnull;
- urlinfo.referrer = nsnull;
- urlinfo.forceJSEnabled = PR_FALSE;
- urlinfo.postData = buf;
- urlinfo.postDataLength = len;
- urlinfo.postHeaders = nsnull;
- urlinfo.postHeadersLength = 0;
- urlinfo.postFile = file;
-
- return mManager->FetchURL(peer, &urlinfo);
-#endif
- return NS_OK;
+ return mNetworkManager->PostURL(peer, relativeURL, target,
+ len, buf, file, notifyData);
}
@@ -376,49 +356,32 @@ ns4xPlugin::_posturl(NPP npp, const char* relativeURL, const char *target, uint3
nsIPluginInstancePeer* peer = (nsIPluginInstancePeer*) npp->ndata;
NS_ASSERTION(peer != NULL, "null peer");
- NS_ASSERTION(mManager != NULL, "null manager");
+ NS_ASSERTION(mNetworkManager != NULL, "null manager");
if (peer == NULL)
return NS_ERROR_UNEXPECTED; // XXX
-#if 0
- nsURLInfo urlinfo;
- urlinfo.version = nsURLInfo_Version;
- urlinfo.url = relativeURL;
- urlinfo.target = target;
- urlinfo.notifyData = nsnull;
- urlinfo.altHost = nsnull;
- urlinfo.referrer = nsnull;
- urlinfo.forceJSEnabled = PR_FALSE;
- urlinfo.postData = buf;
- urlinfo.postDataLength = len;
- urlinfo.postHeaders = nsnull;
- urlinfo.postHeadersLength = 0;
- urlinfo.postFile = file;
-
- return mManager->FetchURL(peer, &urlinfo);
-#endif
- return NS_OK;
+ return mNetworkManager->PostURL(peer, relativeURL, target,
+ len, buf, file);
}
-#if 0
-
////////////////////////////////////////////////////////////////////////
/**
* A little helper class used to wrap up plugin manager streams (that is,
* streams from the plugin to the browser).
*/
-class ns4xStreamWrapper {
+class ns4xStreamWrapper
+{
protected:
- NPIPluginManagerStream* fStream;
- NPStream fNPStream;
+ nsIOutputStream *fStream;
+ NPStream fNPStream;
public:
- ns4xStreamWrapper(NPIPluginManagerStream* stream);
+ ns4xStreamWrapper(nsIOutputStream* stream);
~ns4xStreamWrapper();
- NPIPluginManagerStream*
+ nsIOutputStream*
GetStream(void);
NPStream*
@@ -427,11 +390,12 @@ public:
};
};
-ns4xStreamWrapper::ns4xStreamWrapper(NPIPluginManagerStream* stream)
+ns4xStreamWrapper::ns4xStreamWrapper(nsIOutputStream* stream)
: fStream(stream)
{
- PR_ASSERT(stream != NULL);
- fStream->AddRef();
+ NS_ASSERTION(stream != NULL, "bad stream");
+
+ NS_ADDREF(fStream);
memset(&fNPStream, 0, sizeof(fNPStream));
fNPStream.ndata = (void*) this;
@@ -439,15 +403,13 @@ ns4xStreamWrapper::ns4xStreamWrapper(NPIPluginManagerStream* stream)
ns4xStreamWrapper::~ns4xStreamWrapper(void)
{
- if (fStream != NULL)
- fStream->Release();
+ NS_IF_RELEASE(fStream);
}
-NPIPluginManagerStream*
+nsIOutputStream*
ns4xStreamWrapper::GetStream(void)
{
- if (fStream != NULL)
- fStream->AddRef();
+ NS_IF_ADDREF(fStream);
return fStream;
}
@@ -466,194 +428,205 @@ ns4xPlugin::_newstream(NPP npp, NPMIMEType type, const char* window, NPStream* *
return NS_ERROR_UNEXPECTED; // XXX
nsresult error;
- nsIPluginStream* stream;
+ nsIOutputStream* stream;
if ((error = peer->NewStream((const char*) type, window, &stream))
- != NPPluginError_NoError)
- return (NPError) error;
+ != NS_OK)
+ return error;
ns4xStreamWrapper* wrapper = new ns4xStreamWrapper(stream);
- if (wrapper == NULL) {
- stream->Release();
- return NPERR_OUT_OF_MEMORY_ERROR;
+ if (wrapper == NULL)
+ {
+ NS_RELEASE(stream);
+ return NS_ERROR_OUT_OF_MEMORY;
}
(*result) = wrapper->GetNPStream();
- return NPERR_NO_ERROR;
+ return NS_OK;
}
-
-
int32 NP_EXPORT
ns4xPlugin::_write(NPP npp, NPStream *pstream, int32 len, void *buffer)
{
ns4xStreamWrapper* wrapper = (ns4xStreamWrapper*) npp->ndata;
- PR_ASSERT(wrapper != NULL);
+
+ NS_ASSERTION(wrapper != NULL, "null wrapper");
+
if (wrapper == NULL)
return 0;
- NPIPluginManagerStream* stream = wrapper->GetStream();
- PRUint32 count = 0;
- while (count < ((PRUint32) len)) {
- PRUint32 ready = stream->WriteReady();
- ready = (ready > ((PRUint32) len)) ? ((PRUint32) len) : ready;
+ nsIOutputStream* stream = wrapper->GetStream();
- PRUint32 written = stream->Write(ready, ((const char*) buffer) + count);
- count += written;
- }
+ PRInt32 count = 0;
+ nsresult rv = stream->Write((char *)buffer, 0, len, &count);
- stream->Release();
+ NS_RELEASE(stream);
return count;
}
-
-
-NPError NP_EXPORT
+nsresult NP_EXPORT
ns4xPlugin::_destroystream(NPP npp, NPStream *pstream, NPError reason)
{
ns4xStreamWrapper* wrapper = (ns4xStreamWrapper*) npp->ndata;
- PR_ASSERT(wrapper != NULL);
+
+ NS_ASSERTION(wrapper != NULL, "null wrapper");
+
if (wrapper == NULL)
return 0;
- // This will release the wrapped NPIPluginManagerStream.
+ // This will release the wrapped nsIOutputStream.
delete wrapper;
- return NPERR_NO_ERROR;
+ return NS_OK;
}
-
-
void NP_EXPORT
ns4xPlugin::_status(NPP npp, const char *message)
{
- NPIPluginInstancePeer* peer = (NPIPluginInstancePeer*) npp->ndata;
- PR_ASSERT(peer != NULL);
+ nsIPluginInstancePeer* peer = (nsIPluginInstancePeer*) npp->ndata;
+
+ NS_ASSERTION(peer != NULL, "null peer");
+
if (peer == NULL)
return;
peer->ShowStatus(message);
}
-
-
void NP_EXPORT
ns4xPlugin::_memfree (void *ptr)
{
- thePluginManager->MemFree(ptr);
+ mMalloc->Free(ptr);
}
-
-
uint32 NP_EXPORT
ns4xPlugin::_memflush(uint32 size)
{
- return thePluginManager->MemFlush(size);
+ mMalloc->HeapMinimize();
+
+ return 0;
}
-
-
void NP_EXPORT
ns4xPlugin::_reloadplugins(NPBool reloadPages)
{
- thePluginManager->ReloadPlugins(reloadPages);
+ mPluginManager->ReloadPlugins(reloadPages);
}
-
-
void NP_EXPORT
ns4xPlugin::_invalidaterect(NPP npp, NPRect *invalidRect)
{
- NPIPluginInstancePeer* peer = (NPIPluginInstancePeer*) npp->ndata;
- PR_ASSERT(peer != NULL);
+ nsIPluginInstancePeer* peer = (nsIPluginInstancePeer*) npp->ndata;
+
+ NS_ASSERTION(peer != NULL, "null peer");
+
if (peer == NULL)
return;
- // XXX nsRect & NPRect are structurally equivalent
- peer->InvalidateRect((nsRect*) invalidRect);
+ nsIWindowlessPluginInstancePeer *wpeer;
+
+ if (NS_OK == peer->QueryInterface(kIWindowlessPluginInstancePeerIID, (void **)&wpeer))
+ {
+ // XXX nsRect & NPRect are structurally equivalent
+ wpeer->InvalidateRect((nsPluginRect *)invalidRect);
+ NS_RELEASE(wpeer);
+ }
}
-
-
void NP_EXPORT
ns4xPlugin::_invalidateregion(NPP npp, NPRegion invalidRegion)
{
- NPIPluginInstancePeer* peer = (NPIPluginInstancePeer*) npp->ndata;
- PR_ASSERT(peer != NULL);
+ nsIPluginInstancePeer* peer = (nsIPluginInstancePeer*) npp->ndata;
+
+ NS_ASSERTION(peer != NULL, "null peer");
+
if (peer == NULL)
return;
- // XXX nsRegion & NPRegion are typedef'd to the same thing
- peer->InvalidateRegion((nsRegion*) invalidRegion);
+ nsIWindowlessPluginInstancePeer *wpeer;
+
+ if (NS_OK == peer->QueryInterface(kIWindowlessPluginInstancePeerIID, (void **)&wpeer))
+ {
+ // XXX nsRegion & NPRegion are typedef'd to the same thing
+ wpeer->InvalidateRegion((nsPluginRegion*) invalidRegion);
+ NS_RELEASE(wpeer);
+ }
}
-
-
void NP_EXPORT
ns4xPlugin::_forceredraw(NPP npp)
{
- NPIPluginInstancePeer* peer = (NPIPluginInstancePeer*) npp->ndata;
- PR_ASSERT(peer != NULL);
+ nsIPluginInstancePeer* peer = (nsIPluginInstancePeer*) npp->ndata;
+
+ NS_ASSERTION(peer != NULL, "null peer");
+
if (peer == NULL)
return;
- peer->ForceRedraw();
+ nsIWindowlessPluginInstancePeer *wpeer;
+
+ if (NS_OK == peer->QueryInterface(kIWindowlessPluginInstancePeerIID, (void **)&wpeer))
+ {
+ wpeer->ForceRedraw();
+ NS_RELEASE(wpeer);
+ }
}
-
-
-NPError NP_EXPORT
+nsresult NP_EXPORT
ns4xPlugin::_getvalue(NPP npp, NPNVariable variable, void *result)
{
- NPIPluginInstancePeer* peer = (NPIPluginInstancePeer*) npp->ndata;
- PR_ASSERT(peer != NULL);
+ nsIPluginInstancePeer* peer = (nsIPluginInstancePeer*) npp->ndata;
+
+ NS_ASSERTION(peer != NULL, "null peer");
+
if (peer == NULL)
- return NPERR_INVALID_PLUGIN_ERROR; // XXX
+ return NS_ERROR_FAILURE; // XXX
// XXX Note that for backwards compatibility, the old NPNVariables
// map correctly to NPPluginManagerVariables.
- return (NPError) peer->GetValue((NPPluginManagerVariable) variable, result);
+ return peer->GetValue((nsPluginInstancePeerVariable)variable, result);
}
-
-
-NPError NP_EXPORT
+nsresult NP_EXPORT
ns4xPlugin::_setvalue(NPP npp, NPPVariable variable, void *result)
{
- NPIPluginInstancePeer* peer = (NPIPluginInstancePeer*) npp->ndata;
- PR_ASSERT(peer != NULL);
+ nsIPluginInstancePeer* peer = (nsIPluginInstancePeer*) npp->ndata;
+
+ NS_ASSERTION(peer != NULL, "null peer");
+
if (peer == NULL)
- return NPERR_INVALID_PLUGIN_ERROR; // XXX
+ return NS_ERROR_FAILURE; // XXX
// XXX Note that for backwards compatibility, the old NPPVariables
// map correctly to NPPluginVariables.
- return (NPError) peer->SetValue((NPPluginVariable) variable, result);
+ return peer->SetValue((nsPluginInstancePeerVariable)variable, result);
}
-
-
-NPError NP_EXPORT
+nsresult NP_EXPORT
ns4xPlugin::_requestread(NPStream *pstream, NPByteRange *rangeList)
{
- NPIPluginStreamPeer* streamPeer = (NPIPluginStreamPeer*) pstream->ndata;
- PR_ASSERT(streamPeer != NULL);
- if (streamPeer == NULL)
- return NPERR_INVALID_PLUGIN_ERROR; // XXX
+ nsIPluginStreamPeer* streamPeer = (nsIPluginStreamPeer*) pstream->ndata;
+
+ NS_ASSERTION(streamPeer != NULL, "null streampeer");
+
+ if (streamPeer == NULL)
+ return NS_ERROR_FAILURE; // XXX
+
+ nsISeekablePluginStreamPeer* seekablePeer = NULL;
- NPISeekablePluginStreamPeer* seekablePeer = NULL;
- static NS_DEFINE_IID(kISeekablePluginStreamPeerIID, NP_ISEEKABLEPLUGINSTREAMPEER_IID);
if (streamPeer->QueryInterface(kISeekablePluginStreamPeerIID,
- (void**) seekablePeer) == NS_OK) {
- NPError error;
+ (void**)seekablePeer) == NS_OK)
+ {
+ nsresult error;
// XXX nsByteRange & NPByteRange are structurally equivalent.
- error = (NPError) seekablePeer->RequestRead((nsByteRange*) rangeList);
- seekablePeer->Release();
+ error = seekablePeer->RequestRead((nsByteRange *)rangeList);
+ NS_RELEASE(seekablePeer);
return error;
}
- return NPERR_STREAM_NOT_SEEKABLE;
+ return NS_ERROR_UNEXPECTED;
}
@@ -674,25 +647,28 @@ ns4xPlugin::_getJavaEnv(void)
return NULL;
}
-
const char * NP_EXPORT
ns4xPlugin::_useragent(NPP npp)
{
- NPIPluginInstancePeer* peer = (NPIPluginInstancePeer*) npp->ndata;
- PR_ASSERT(peer != NULL);
- if (peer == NULL)
+ NS_ASSERTION(mPluginManager != NULL, "null pluginmanager");
+
+ if (mPluginManager == NULL)
return NULL;
- return peer->UserAgent();
-}
+ char *retstr;
+ mPluginManager->UserAgent((const char **)&retstr);
+
+ return retstr;
+}
void * NP_EXPORT
ns4xPlugin::_memalloc (uint32 size)
{
- return thePluginManager->MemAlloc(size);
+ return mMalloc->Alloc(size);
}
+#if 0
#ifdef JAVA
java_lang_Class* NP_EXPORT
@@ -727,11 +703,11 @@ ns4xPlugin::_getJavaPeer(NPP npp)
return NULL;
}
+#endif
+
#if defined(XP_MAC) && !defined(powerc)
#pragma pointers_in_A0
#endif
//
////////////////////////////////////////////////////////////////////////
-
-#endif
diff --git a/mozilla/modules/plugin/nglsrc/ns4xPlugin.h b/mozilla/modules/plugin/nglsrc/ns4xPlugin.h
index 5819deb434c..e7b958d4721 100644
--- a/mozilla/modules/plugin/nglsrc/ns4xPlugin.h
+++ b/mozilla/modules/plugin/nglsrc/ns4xPlugin.h
@@ -21,7 +21,8 @@
#include "nsplugin.h"
#include "prlink.h" // for PRLibrary
-#include "../src/npupp.h"
+#include "npupp.h"
+#include "nsIMalloc.h"
////////////////////////////////////////////////////////////////////////
@@ -128,8 +129,6 @@ protected:
_posturl(NPP npp, const char* relativeURL, const char *target, uint32 len,
const char *buf, NPBool file);
-#if 0
-
static nsresult NP_EXPORT
_newstream(NPP npp, NPMIMEType type, const char* window, NPStream** pstream);
@@ -142,6 +141,8 @@ protected:
static void NP_EXPORT
_status(NPP npp, const char *message);
+#if 0
+
static void NP_EXPORT
_registerwindow(NPP npp, void* window);
@@ -151,6 +152,8 @@ protected:
static int16 NP_EXPORT
_allocateMenuID(NPP npp, NPBool isSubmenu);
+#endif
+
static void NP_EXPORT
_memfree (void *ptr);
@@ -187,13 +190,15 @@ protected:
static JRIEnv* NP_EXPORT
_getJavaEnv(void);
+#if 0
+
static jref NP_EXPORT
_getJavaPeer(NPP npp);
-#if defined(XP_MAC) && !defined(powerc)
-#pragma pointers_in_A0
#endif
+#if defined(XP_MAC) && !defined(powerc)
+#pragma pointers_in_A0
#endif
/**
@@ -207,7 +212,9 @@ protected:
*/
static NPNetscapeFuncs CALLBACKS;
- static nsIPluginManager *mManager;
+ static nsIPluginManager *mPluginManager;
+ static nsINetworkManager *mNetworkManager;
+ static nsIMalloc *mMalloc;
};
#endif // ns4xPlugin_h__
diff --git a/mozilla/modules/plugin/nglsrc/ns4xPluginInstance.cpp b/mozilla/modules/plugin/nglsrc/ns4xPluginInstance.cpp
new file mode 100644
index 00000000000..0e822dafd52
--- /dev/null
+++ b/mozilla/modules/plugin/nglsrc/ns4xPluginInstance.cpp
@@ -0,0 +1,239 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
+ *
+ * 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.
+ */
+
+#include "ns4xPluginInstance.h"
+#include "ns4xPluginStream.h"
+#include "prlog.h"
+
+////////////////////////////////////////////////////////////////////////
+
+
+ns4xPluginInstance :: ns4xPluginInstance(NPPluginFuncs* callbacks)
+ : fCallbacks(callbacks)
+{
+ NS_INIT_REFCNT();
+
+ NS_ASSERTION(fCallbacks != NULL, "null callbacks");
+
+ // Initialize the NPP structure.
+
+ fNPP.pdata = NULL;
+ fNPP.ndata = this;
+
+ fPeer = nsnull;
+}
+
+
+ns4xPluginInstance :: ~ns4xPluginInstance(void)
+{
+ NS_RELEASE(fPeer);
+}
+
+////////////////////////////////////////////////////////////////////////
+
+NS_IMPL_ADDREF(ns4xPluginInstance);
+NS_IMPL_RELEASE(ns4xPluginInstance);
+
+static NS_DEFINE_IID(kIPluginInstanceIID, NS_IPLUGININSTANCE_IID);
+static NS_DEFINE_IID(kIEventHandlerIID, NS_IEVENTHANDLER_IID);
+static NS_DEFINE_IID(kIPluginTagInfoIID, NS_IPLUGINTAGINFO_IID);
+static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID);
+
+NS_IMETHODIMP ns4xPluginInstance :: QueryInterface(const nsIID& iid, void** instance)
+{
+ if (instance == NULL)
+ return NS_ERROR_NULL_POINTER;
+
+ if (iid.Equals(kIPluginInstanceIID))
+ {
+ *instance = (void *)(nsIPluginInstance *)this;
+ AddRef();
+ return NS_OK;
+ }
+
+ if (iid.Equals(kIEventHandlerIID))
+ {
+ *instance = (void *)(nsIEventHandler *)this;
+ AddRef();
+ return NS_OK;
+ }
+
+ if (iid.Equals(kISupportsIID))
+ {
+ *instance = (void *)(nsISupports *)this;
+ AddRef();
+ return NS_OK;
+ }
+
+ return NS_NOINTERFACE;
+}
+
+
+////////////////////////////////////////////////////////////////////////
+
+NS_IMETHODIMP ns4xPluginInstance :: Initialize(nsIPluginInstancePeer* peer)
+{
+ PRUint16 count;
+ const char* const* names;
+ const char* const* values;
+
+ NS_ASSERTION(peer != NULL, "null peer");
+
+ fPeer = peer;
+
+ NS_ADDREF(fPeer);
+
+ nsresult error;
+ nsIPluginTagInfo *taginfo;
+
+ error = fPeer->QueryInterface(kIPluginTagInfoIID, (void **)&taginfo);
+
+ if (NS_OK == error)
+ {
+ if ((error = taginfo->GetAttributes(count, names, values)) != NS_OK)
+ return error;
+
+ if (fCallbacks->newp == NULL)
+ return NS_ERROR_FAILURE; // XXX right error?
+
+ // XXX Note that the NPPluginType_* enums were crafted to be
+ // backward compatible...
+
+ nsPluginMode mode;
+ nsMIMEType mimetype;
+
+ fPeer->GetMode(&mode);
+ fPeer->GetMIMEType(&mimetype);
+
+ error = (nsresult)
+ CallNPP_NewProc(fCallbacks->newp,
+ (char *)mimetype,
+ &fNPP,
+ (PRUint16)mode,
+ count,
+ (char**)names,
+ (char**)values,
+ NULL); // saved data
+
+ NS_RELEASE(taginfo);
+ }
+
+ return error;
+}
+
+NS_IMETHODIMP ns4xPluginInstance :: GetPeer(nsIPluginInstancePeer* *resultingPeer)
+{
+ NS_ADDREF(fPeer);
+ *resultingPeer = fPeer;
+ return NS_OK;
+}
+
+NS_IMETHODIMP ns4xPluginInstance::Start(void)
+{
+ // XXX At some point, we maybe should implement start and stop to
+ // load/unload the 4.x plugin, just in case there are some plugins
+ // that rely on that behavior...
+ return NS_OK;
+}
+
+NS_IMETHODIMP ns4xPluginInstance::Stop(void)
+{
+ return NS_OK;
+}
+
+NS_IMETHODIMP ns4xPluginInstance::Destroy(void)
+{
+ return NS_OK;
+}
+
+NS_IMETHODIMP ns4xPluginInstance::SetWindow(nsPluginWindow* window)
+{
+ // XXX 4.x plugins don't want a SetWindow(NULL).
+
+ if (window == NULL)
+ return NS_OK;
+
+ nsresult error = NS_OK;
+
+ if (fCallbacks->setwindow) {
+ // XXX Turns out that NPPluginWindow and NPWindow are structurally
+ // identical (on purpose!), so there's no need to make a copy.
+ error = (nsresult) CallNPP_SetWindowProc(fCallbacks->setwindow,
+ &fNPP,
+ (NPWindow*) window);
+
+ // XXX In the old code, we'd just ignore any errors coming
+ // back from the plugin's SetWindow(). Is this the correct
+ // behavior?!?
+ NS_ASSERTION(error == NS_OK, "error in setwindow");
+ }
+
+ return error;
+}
+
+NS_IMETHODIMP ns4xPluginInstance::NewStream(nsIPluginStreamPeer* peer, nsIPluginStream* *result)
+{
+ (*result) = NULL;
+
+ ns4xPluginStream* stream = new ns4xPluginStream();
+
+ if (stream == NULL)
+ return NS_ERROR_OUT_OF_MEMORY;
+
+ NS_ADDREF(stream);
+
+ nsresult error;
+
+ // does it need the peer?
+
+ if ((error = stream->Initialize(this, peer)) != NS_OK)
+ {
+ NS_RELEASE(stream);
+ return error;
+ }
+
+ (*result) = stream;
+ return NS_OK;
+}
+
+NS_IMETHODIMP ns4xPluginInstance::Print(nsPluginPrint* platformPrint)
+{
+ return NS_OK;
+}
+
+NS_IMETHODIMP ns4xPluginInstance::HandleEvent(nsPluginEvent* event, PRBool* handled)
+{
+ *handled = PR_FALSE;
+
+ return NS_OK;
+}
+
+NS_IMETHODIMP ns4xPluginInstance::URLNotify(const char* url, const char* target,
+ nsPluginReason reason, void* notifyData)
+{
+ if (fCallbacks->urlnotify != NULL)
+ {
+ CallNPP_URLNotifyProc(fCallbacks->urlnotify,
+ &fNPP,
+ url,
+ reason,
+ notifyData);
+ }
+
+ return NS_OK; //XXX this seems bad...
+}
diff --git a/mozilla/modules/plugin/nglsrc/ns4xPluginInstance.h b/mozilla/modules/plugin/nglsrc/ns4xPluginInstance.h
new file mode 100644
index 00000000000..179a4ea8dbe
--- /dev/null
+++ b/mozilla/modules/plugin/nglsrc/ns4xPluginInstance.h
@@ -0,0 +1,127 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
+ *
+ * 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.
+ */
+
+#ifndef ns4xPluginInstance_h__
+#define ns4xPluginInstance_h__
+
+#include "nsplugin.h"
+#include "npupp.h"
+#include "jri.h"
+
+////////////////////////////////////////////////////////////////////////
+
+class ns4xPluginInstance : public nsIPluginInstance
+{
+public:
+
+ /**
+ * Construct a new 4.x plugin instance with the specified peer
+ * and callbacks.
+ */
+ ns4xPluginInstance(NPPluginFuncs* callbacks);
+
+ // Use Release() to destroy this
+ ~ns4xPluginInstance(void);
+
+ NS_DECL_ISUPPORTS
+
+ ////////////////////////////////////////////////////////////////////////
+ // nsIPluginInstance methods
+
+ /**
+ * Actually initialize the plugin instance. This calls the 4.x newp
+ * callback, and may return an error (which is why it is distinct from the
+ * constructor.) If an error is returned, the caller should not
+ * continue to use the ns4xPluginInstance object.
+ */
+ NS_METHOD
+ Initialize(nsIPluginInstancePeer* peer);
+
+ NS_IMETHOD
+ GetPeer(nsIPluginInstancePeer* *resultingPeer);
+
+ NS_IMETHOD
+ Start(void);
+
+ NS_IMETHOD
+ Stop(void);
+
+ NS_IMETHOD
+ Destroy(void);
+
+ NS_IMETHOD
+ SetWindow(nsPluginWindow* window);
+
+ NS_IMETHOD
+ NewStream(nsIPluginStreamPeer* peer, nsIPluginStream* *result);
+
+ NS_IMETHOD
+ Print(nsPluginPrint* platformPrint);
+
+ NS_IMETHOD
+ HandleEvent(nsPluginEvent* event, PRBool* handled);
+
+ NS_IMETHOD
+ URLNotify(const char* url, const char* target,
+ nsPluginReason reason, void* notifyData);
+
+ ////////////////////////////////////////////////////////////////////////
+ // ns4xPluginInstance-specific methods
+
+
+ /**
+ * Return the 4.x-style interface object.
+ */
+ NS_IMETHOD
+ GetNPP(NPP * aNPP) {
+ *aNPP = &fNPP;
+ return NS_OK;
+ };
+
+ /**
+ * Return the callbacks for the plugin instance.
+ */
+ NS_IMETHOD
+ GetCallbacks(const NPPluginFuncs ** aCallbacks) {
+ *aCallbacks = fCallbacks;
+ return NS_OK;
+ };
+
+protected:
+
+ /**
+ * The plugin instance peer for this instance.
+ */
+ nsIPluginInstancePeer* fPeer;
+
+ /**
+ * A pointer to the plugin's callback functions. This information
+ * is actually stored in the plugin class (nsPluginClass),
+ * and is common for all plugins of the class.
+ */
+ NPPluginFuncs* fCallbacks;
+
+ /**
+ * The 4.x-style structure used to communicate between the plugin
+ * instance and the browser.
+ */
+ NPP_t fNPP;
+};
+
+
+#endif // ns4xPluginInstance_h__
diff --git a/mozilla/modules/plugin/nglsrc/ns4xPluginStream.cpp b/mozilla/modules/plugin/nglsrc/ns4xPluginStream.cpp
new file mode 100644
index 00000000000..8fbac3b5e44
--- /dev/null
+++ b/mozilla/modules/plugin/nglsrc/ns4xPluginStream.cpp
@@ -0,0 +1,210 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
+ *
+ * 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.
+ */
+
+
+#include "ns4xPluginStream.h"
+#include "prlog.h" // for PR_ASSERT
+
+////////////////////////////////////////////////////////////////////////
+
+
+ns4xPluginStream::ns4xPluginStream(void)
+ : fStreamType(nsPluginStreamType_Normal), fSeekable(PR_FALSE), fPosition(0)
+{
+ NS_INIT_REFCNT();
+
+ // Initialize the 4.x interface structure
+ memset(&fNPStream, 0, sizeof(fNPStream));
+}
+
+
+ns4xPluginStream::~ns4xPluginStream(void)
+{
+ const NPPluginFuncs *callbacks;
+ NPP npp;
+ nsPluginReason reason;
+
+ fInstance->GetCallbacks(&callbacks);
+ fInstance->GetNPP(&npp);
+ fPeer->GetReason(&reason);
+
+ if (callbacks->destroystream != NULL)
+ {
+ CallNPP_DestroyStreamProc(callbacks->destroystream,
+ npp,
+ &fNPStream,
+ reason);
+ }
+
+ NS_IF_RELEASE(fPeer);
+ NS_IF_RELEASE(fInstance);
+}
+
+
+////////////////////////////////////////////////////////////////////////
+
+NS_IMPL_ADDREF(ns4xPluginStream);
+NS_IMPL_RELEASE(ns4xPluginStream);
+
+static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID);
+static NS_DEFINE_IID(kIPluginStreamIID, NS_IPLUGINSTREAM_IID);
+static NS_DEFINE_IID(kISeekablePluginStreamPeerIID, NS_ISEEKABLEPLUGINSTREAMPEER_IID);
+
+NS_IMETHODIMP ns4xPluginStream::QueryInterface(const nsIID& iid, void** instance)
+{
+ if (instance == NULL)
+ return NS_ERROR_NULL_POINTER;
+
+ if (iid.Equals(kIPluginStreamIID))
+ {
+ *instance = (void *)(nsIPluginStream *)this;
+ AddRef();
+ return NS_OK;
+ }
+ else if (iid.Equals(kISupportsIID))
+ {
+ *instance = (void *)(nsISupports *)this;
+ AddRef();
+ return NS_OK;
+ }
+
+ return NS_NOINTERFACE;
+}
+
+
+////////////////////////////////////////////////////////////////////////
+
+
+NS_IMETHODIMP ns4xPluginStream::Initialize(ns4xPluginInstance* instance,
+ nsIPluginStreamPeer* peer)
+{
+ fInstance = instance;
+ fPeer = peer;
+
+ NS_ASSERTION(fInstance != NULL, "null instance");
+
+ fInstance->AddRef();
+
+ NS_ASSERTION(fPeer != NULL, "null peer");
+
+ NS_ADDREF(fPeer);
+
+ const char *url;
+ PRUint32 length, modified;
+
+ fPeer->GetURL(&url);
+ fPeer->GetEnd(&length);
+ fPeer->GetLastModified(&modified);
+
+ fNPStream.ndata = (void*) fPeer;
+ fNPStream.url = url;
+ fNPStream.end = length;
+ fNPStream.lastmodified = modified;
+
+ // Are we seekable?
+
+ nsISupports* seekablePeer;
+
+ if (fPeer->QueryInterface(kISeekablePluginStreamPeerIID,
+ (void**) &seekablePeer) == NS_OK)
+ {
+ fSeekable = TRUE;
+ NS_RELEASE(seekablePeer);
+ }
+
+ const NPPluginFuncs *callbacks;
+ NPP npp;
+ nsMIMEType mimetype;
+
+ fInstance->GetCallbacks(&callbacks);
+ fInstance->GetNPP(&npp);
+ fPeer->GetMIMEType(&mimetype);
+
+ if (callbacks->newstream == NULL)
+ return NS_ERROR_FAILURE;
+
+ PRUint16 streamType = (PRUint16) fStreamType;
+
+ nsresult error
+ = (nsresult)CallNPP_NewStreamProc(callbacks->newstream,
+ npp,
+ (char *)mimetype,
+ &fNPStream,
+ fSeekable,
+ &streamType);
+
+ fStreamType = (nsPluginStreamType) streamType;
+
+ return error;
+}
+
+NS_IMETHODIMP ns4xPluginStream::Write(const char* buffer, PRInt32 offset, PRInt32 len, PRInt32 *aWriteCount)
+{
+ const NPPluginFuncs *callbacks;
+ NPP npp;
+
+ fInstance->GetCallbacks(&callbacks);
+ fInstance->GetNPP(&npp);
+
+ if (callbacks->write == NULL)
+ return NS_OK;
+
+ *aWriteCount = CallNPP_WriteProc(callbacks->write,
+ npp,
+ &fNPStream,
+ fPosition,
+ len,
+ (void *)buffer);
+
+ fPosition += len;
+
+ return NS_OK; //XXX this seems bad...
+}
+
+NS_IMETHODIMP ns4xPluginStream::GetStreamType(nsPluginStreamType *result)
+{
+ *result = fStreamType;
+ return NS_OK;
+}
+
+NS_IMETHODIMP ns4xPluginStream::AsFile(const char* filename)
+{
+ const NPPluginFuncs *callbacks;
+ NPP npp;
+
+ fInstance->GetCallbacks(&callbacks);
+ fInstance->GetNPP(&npp);
+
+ if (callbacks->asfile == NULL)
+ return NS_OK;
+
+ CallNPP_StreamAsFileProc(callbacks->asfile,
+ npp,
+ &fNPStream,
+ filename);
+
+ return NS_OK;
+}
+
+NS_IMETHODIMP ns4xPluginStream :: Close(void)
+{
+ return NS_OK;
+}
+
+////////////////////////////////////////////////////////////////////////
+
diff --git a/mozilla/modules/plugin/nglsrc/ns4xPluginStream.h b/mozilla/modules/plugin/nglsrc/ns4xPluginStream.h
new file mode 100644
index 00000000000..83940820cf6
--- /dev/null
+++ b/mozilla/modules/plugin/nglsrc/ns4xPluginStream.h
@@ -0,0 +1,112 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
+ *
+ * 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.
+ */
+
+#ifndef ns4xPluginStream_h__
+#define ns4xPluginStream_h__
+
+#include "jri.h" // XXX should be jni.h
+#include "nsplugin.h"
+#include "ns4xPluginInstance.h"
+
+////////////////////////////////////////////////////////////////////////
+
+/**
+ * A 5.0 wrapper for a 4.x plugin stream.
+ */
+class ns4xPluginStream : public nsIPluginStream
+{
+public:
+
+ /**
+ * Construct a new 4.x plugin stream associated with the specified
+ * instance and stream peer.
+ */
+ ns4xPluginStream();
+ ~ns4xPluginStream();
+
+ NS_DECL_ISUPPORTS
+
+ /**
+ * Do internal initialization. This actually calls into the 4.x plugin
+ * to create the stream, and may fail (which is why it's separate from
+ * the constructor).
+ */
+ NS_METHOD
+ Initialize(ns4xPluginInstance* instance, nsIPluginStreamPeer* peer);
+
+ ////////////////////////////////////////////////////////////////////////
+ // nsIPluginStream methods
+
+ // (Corresponds to NPP_Write and NPN_Write.)
+ NS_IMETHOD
+ Write(const char* buffer, PRInt32 offset, PRInt32 len, PRInt32 *aWriteCount);
+
+ // (Corresponds to NPP_NewStream's stype return parameter.)
+ NS_IMETHOD
+ GetStreamType(nsPluginStreamType *result);
+
+ // (Corresponds to NPP_StreamAsFile.)
+ NS_IMETHOD
+ AsFile(const char* fname);
+
+ NS_IMETHOD
+ Close(void);
+
+ ////////////////////////////////////////////////////////////////////////
+ // Methods specific to ns4xPluginStream
+
+protected:
+
+ /**
+ * The plugin instance to which this stream belongs.
+ */
+ ns4xPluginInstance* fInstance;
+
+ /**
+ * The peer associated with this stream.
+ */
+ nsIPluginStreamPeer* fPeer;
+
+ /**
+ * The type of stream, for the peer's use.
+ */
+ nsPluginStreamType fStreamType;
+
+ /**
+ * The 4.x-style structure used to contain stream information.
+ * This is what actually gets used to communicate with the plugin.
+ */
+ NPStream fNPStream;
+
+ /**
+ * Set to TRUE if the peer implements
+ * NPISeekablPluginStreamPeer.
+ */
+ PRBool fSeekable;
+
+ /**
+ * Tracks the position in the content that is being
+ * read. 4.x-style plugins expect to be told the offset in the
+ * buffer that they should read to, even though it's always
+ * done serially.
+ */
+ PRUint32 fPosition;
+};
+
+
+#endif // ns4xPluginStream_h__
diff --git a/mozilla/modules/plugin/nglsrc/nsIPluginHost.h b/mozilla/modules/plugin/nglsrc/nsIPluginHost.h
index a2f541676e2..8e8bfc4f08f 100644
--- a/mozilla/modules/plugin/nglsrc/nsIPluginHost.h
+++ b/mozilla/modules/plugin/nglsrc/nsIPluginHost.h
@@ -36,7 +36,7 @@ public:
LoadPlugins(void) = 0;
NS_IMETHOD
- InstantiatePlugin(char *aMimeType, nsISupports ** aPluginInst) = 0;
+ InstantiatePlugin(char *aMimeType, nsIPluginInstance ** aPluginInst) = 0;
};
#endif
diff --git a/mozilla/modules/plugin/nglsrc/nsPluginHostImpl.cpp b/mozilla/modules/plugin/nglsrc/nsPluginHostImpl.cpp
index 10a50d39e46..ad0c2649087 100644
--- a/mozilla/modules/plugin/nglsrc/nsPluginHostImpl.cpp
+++ b/mozilla/modules/plugin/nglsrc/nsPluginHostImpl.cpp
@@ -21,11 +21,15 @@
#include "prio.h"
#include "prmem.h"
#include "ns4xPlugin.h"
+#include "nsMalloc.h" //this is evil...
+#include "nsPluginInstancePeer.h"
#ifdef XP_PC
#include "windows.h"
#endif
+static NS_DEFINE_IID(kIPluginInstanceIID, NS_IPLUGININSTANCE_IID);
+
nsPluginTag :: nsPluginTag()
{
mNext = nsnull;
@@ -104,6 +108,7 @@ nsPluginTag :: ~nsPluginTag()
static NS_DEFINE_IID(kIPluginManagerIID, NS_IPLUGINMANAGER_IID);
static NS_DEFINE_IID(kIPluginHostIID, NS_IPLUGINHOST_IID);
+static NS_DEFINE_IID(kIMallocIID, NS_IMALLOC_IID);
static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID);
nsPluginHostImpl :: nsPluginHostImpl()
@@ -124,6 +129,8 @@ nsPluginHostImpl :: ~nsPluginHostImpl()
delete mPlugins;
mPlugins = temp;
}
+
+ NS_IF_RELEASE(mMalloc);
}
NS_IMPL_ADDREF(nsPluginHostImpl)
@@ -151,6 +158,13 @@ nsresult nsPluginHostImpl :: QueryInterface(const nsIID& aIID,
return NS_OK;
}
+ if (aIID.Equals(kIMallocIID))
+ {
+ *aInstancePtrResult = mMalloc;
+ NS_IF_ADDREF(mMalloc);
+ return NS_OK;
+ }
+
if (aIID.Equals(kISupportsIID))
{
*aInstancePtrResult = (void *)((nsISupports *)((nsIPluginHost *)this));
@@ -183,14 +197,32 @@ nsresult nsPluginHostImpl :: SetValue(nsPluginManagerVariable variable, void *va
return NS_OK;
}
-//nsresult nsPluginHostImpl :: FetchURL(nsISupports* peer, nsURLInfo* urlInfo)
-//{
-// return NS_OK;
-//}
+NS_IMETHODIMP nsPluginHostImpl :: GetURL(nsISupports* peer, const char* url,
+ const char* target,
+ void* notifyData, const char* altHost,
+ const char* referrer, PRBool forceJSEnabled)
+{
+ return NS_OK;
+}
+
+NS_IMETHODIMP nsPluginHostImpl :: PostURL(nsISupports* peer,
+ const char* url, const char* target,
+ PRUint32 postDataLen, const char* postData,
+ PRBool isFile, void* notifyData,
+ const char* altHost, const char* referrer,
+ PRBool forceJSEnabled,
+ PRUint32 postHeadersLength, const char* postHeaders)
+{
+ return NS_OK;
+}
nsresult nsPluginHostImpl :: Init(void)
{
- return NS_OK;
+ nsresult rv;
+
+ rv = nsMalloc::Create(nsnull, kIMallocIID, (void **)&mMalloc);
+
+ return rv;
}
nsresult nsPluginHostImpl :: LoadPlugins(void)
@@ -520,7 +552,7 @@ printf("plugin %s added to list %s\n", plugintag->mName, (plugintag->mFlags & NS
return NS_OK;
}
-nsresult nsPluginHostImpl :: InstantiatePlugin(char *aMimeType, nsISupports ** aPluginInst)
+nsresult nsPluginHostImpl :: InstantiatePlugin(char *aMimeType, nsIPluginInstance ** aPluginInst)
{
nsPluginTag *plugins = mPlugins;
PRInt32 variants, cnt;
@@ -558,10 +590,32 @@ printf("loaded plugin %s for mime type %s\n", plugins->mName, aMimeType);
{
if (nsnull == plugins->mEntryPoint)
{
+ //create the plugin object
+
if (plugins->mFlags & NS_PLUGIN_FLAG_OLDSCHOOL)
- plugins->mEntryPoint = PR_FindSymbol(plugins->mLibrary, "NP_Initialize");
+ {
+ nsresult rv = ns4xPlugin::CreatePlugin(plugins->mLibrary, (nsIPlugin **)&plugins->mEntryPoint);
+printf("result of creating plugin adapter: %d\n", rv);
+ }
else
- plugins->mEntryPoint = PR_FindSymbol(plugins->mLibrary, "NSGetFactory");
+ plugins->mEntryPoint = (nsIPlugin *)PR_FindSymbol(plugins->mLibrary, "NSGetFactory");
+
+ if (nsnull != plugins->mEntryPoint)
+ plugins->mEntryPoint->Initialize((nsISupports *)(nsIPluginManager *)this);
+ }
+
+ if (nsnull != plugins->mEntryPoint)
+ {
+ //create an instance
+
+ if (NS_OK == plugins->mEntryPoint->CreateInstance(nsnull, kIPluginInstanceIID, (void **)aPluginInst))
+ {
+printf("successfully created plugin instance\n");
+
+ nsIPluginInstancePeer *peer = new nsPluginInstancePeerImpl();
+
+ (*aPluginInst)->Initialize(peer);
+ }
}
}
else
diff --git a/mozilla/modules/plugin/nglsrc/nsPluginHostImpl.h b/mozilla/modules/plugin/nglsrc/nsPluginHostImpl.h
index f45b16c50f3..07168081f75 100644
--- a/mozilla/modules/plugin/nglsrc/nsPluginHostImpl.h
+++ b/mozilla/modules/plugin/nglsrc/nsPluginHostImpl.h
@@ -22,8 +22,10 @@
#include "xp_core.h"
#include "nsIPluginManager.h"
#include "nsIPluginHost.h"
+#include "nsINetworkManager.h"
#include "nsCRT.h"
#include "prlink.h"
+#include "nsIMalloc.h"
class ns4xPlugin;
@@ -44,7 +46,7 @@ public:
char **mMimeDescriptionArray;
char **mExtensionsArray;
PRLibrary *mLibrary;
- void *mEntryPoint;
+ nsIPlugin *mEntryPoint;
ns4xPlugin *mAdapter;
PRUint32 mFlags;
};
@@ -52,7 +54,8 @@ public:
#define NS_PLUGIN_FLAG_ENABLED 0x0001 //is this plugin enabled?
#define NS_PLUGIN_FLAG_OLDSCHOOL 0x0002 //is this a pre-xpcom plugin?
-class nsPluginHostImpl : public nsIPluginManager, public nsIPluginHost
+class nsPluginHostImpl : public nsIPluginManager, public nsIPluginHost,
+ public nsINetworkManager
{
public:
nsPluginHostImpl();
@@ -80,8 +83,20 @@ public:
NS_IMETHOD
SetValue(nsPluginManagerVariable variable, void *value);
-// NS_IMETHOD
-// FetchURL(nsISupports* peer, nsURLInfo* urlInfo);
+ //nsINetworkManager interface
+
+ NS_IMETHOD
+ GetURL(nsISupports* peer, const char* url, const char* target,
+ void* notifyData = NULL, const char* altHost = NULL,
+ const char* referrer = NULL, PRBool forceJSEnabled = PR_FALSE);
+
+ NS_IMETHOD
+ PostURL(nsISupports* peer, const char* url, const char* target,
+ PRUint32 postDataLen, const char* postData,
+ PRBool isFile = PR_FALSE, void* notifyData = NULL,
+ const char* altHost = NULL, const char* referrer = NULL,
+ PRBool forceJSEnabled = PR_FALSE,
+ PRUint32 postHeadersLength = 0, const char* postHeaders = NULL);
//nsIPluginHost interface
@@ -92,11 +107,12 @@ public:
LoadPlugins(void);
NS_IMETHOD
- InstantiatePlugin(char *aMimeType, nsISupports ** aPluginInst);
+ InstantiatePlugin(char *aMimeType, nsIPluginInstance ** aPluginInst);
private:
char *mPluginPath;
nsPluginTag *mPlugins;
+ nsIMalloc *mMalloc;
};
#endif
diff --git a/mozilla/modules/plugin/nglsrc/nsPluginInstancePeer.cpp b/mozilla/modules/plugin/nglsrc/nsPluginInstancePeer.cpp
new file mode 100644
index 00000000000..53f07f5ffe0
--- /dev/null
+++ b/mozilla/modules/plugin/nglsrc/nsPluginInstancePeer.cpp
@@ -0,0 +1,103 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
+ *
+ * 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.
+ */
+
+#include "nsPluginInstancePeer.h"
+
+nsPluginInstancePeerImpl :: nsPluginInstancePeerImpl()
+{
+}
+
+nsPluginInstancePeerImpl :: ~nsPluginInstancePeerImpl()
+{
+}
+
+NS_IMPL_ADDREF(nsPluginInstancePeerImpl);
+NS_IMPL_RELEASE(nsPluginInstancePeerImpl);
+
+static NS_DEFINE_IID(kIPluginTagInfoIID, NS_IPLUGINTAGINFO_IID);
+static NS_DEFINE_IID(kIPluginInstancePeerIID, NS_IPLUGININSTANCEPEER_IID);
+static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID);
+
+nsresult nsPluginInstancePeerImpl :: QueryInterface(const nsIID& iid, void** instance)
+{
+ if (instance == NULL)
+ return NS_ERROR_NULL_POINTER;
+
+ if (iid.Equals(kIPluginInstancePeerIID))
+ {
+ *instance = (void *)(nsISupports *)(nsIPluginInstancePeer *)this;
+ AddRef();
+ return NS_OK;
+ }
+
+ if (iid.Equals(kIPluginTagInfoIID))
+ {
+ *instance = (void *)(nsISupports *)(nsIPluginTagInfo *)this;
+ AddRef();
+ return NS_OK;
+ }
+
+ if (iid.Equals(kISupportsIID))
+ {
+ *instance = (void *)(nsISupports *)(nsIPluginTagInfo *)this;
+ AddRef();
+ return NS_OK;
+ }
+
+ return NS_NOINTERFACE;
+}
+
+NS_IMETHODIMP nsPluginInstancePeerImpl :: GetValue(nsPluginInstancePeerVariable variable, void *value)
+{
+ return NS_OK;
+}
+
+NS_IMETHODIMP nsPluginInstancePeerImpl :: SetValue(nsPluginInstancePeerVariable variable, void *value)
+{
+ return NS_OK;
+}
+
+NS_IMETHODIMP nsPluginInstancePeerImpl :: GetMIMEType(nsMIMEType *result)
+{
+ return NS_OK;
+}
+
+NS_IMETHODIMP nsPluginInstancePeerImpl :: GetMode(nsPluginMode *result)
+{
+ return NS_OK;
+}
+
+NS_IMETHODIMP nsPluginInstancePeerImpl :: NewStream(nsMIMEType type, const char* target, nsIOutputStream* *result)
+{
+ return NS_OK;
+}
+
+NS_IMETHODIMP nsPluginInstancePeerImpl :: ShowStatus(const char* message)
+{
+ return NS_OK;
+}
+
+NS_IMETHODIMP nsPluginInstancePeerImpl :: GetAttributes(PRUint16& n, const char*const*& names, const char*const*& values)
+{
+ return NS_OK;
+}
+
+NS_IMETHODIMP nsPluginInstancePeerImpl :: GetAttribute(const char* name, const char* *result)
+{
+ return NS_OK;
+}
diff --git a/mozilla/modules/plugin/nglsrc/nsPluginInstancePeer.h b/mozilla/modules/plugin/nglsrc/nsPluginInstancePeer.h
new file mode 100644
index 00000000000..a208d050444
--- /dev/null
+++ b/mozilla/modules/plugin/nglsrc/nsPluginInstancePeer.h
@@ -0,0 +1,62 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
+ *
+ * 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.
+ */
+
+#ifndef nsPluginInstancePeer_h___
+#define nsPluginInstancePeer_h___
+
+#include "nsIPluginInstancePeer.h"
+#include "nsIPluginTagInfo.h"
+
+class nsPluginInstancePeerImpl : public nsIPluginInstancePeer, public nsIPluginTagInfo
+{
+public:
+ nsPluginInstancePeerImpl();
+ ~nsPluginInstancePeerImpl();
+
+ NS_DECL_ISUPPORTS
+
+ //nsIPluginInstancePeer interface
+
+ NS_IMETHOD
+ GetValue(nsPluginInstancePeerVariable variable, void *value);
+
+ NS_IMETHOD
+ SetValue(nsPluginInstancePeerVariable variable, void *value);
+
+ NS_IMETHOD
+ GetMIMEType(nsMIMEType *result);
+
+ NS_IMETHOD
+ GetMode(nsPluginMode *result);
+
+ NS_IMETHOD
+ NewStream(nsMIMEType type, const char* target, nsIOutputStream* *result);
+
+ NS_IMETHOD
+ ShowStatus(const char* message);
+
+ //nsIPluginTagInfo interface
+
+ NS_IMETHOD
+ GetAttributes(PRUint16& n, const char*const*& names, const char*const*& values);
+
+ NS_IMETHOD
+ GetAttribute(const char* name, const char* *result);
+};
+
+#endif