diff --git a/mozilla/modules/plugin/base/public/nsIPlugin.h b/mozilla/modules/plugin/base/public/nsIPlugin.h index 9811adfeb60..036a6c4ee48 100644 --- a/mozilla/modules/plugin/base/public/nsIPlugin.h +++ b/mozilla/modules/plugin/base/public/nsIPlugin.h @@ -67,7 +67,7 @@ public: * @result - NS_OK if this operation was successful */ NS_IMETHOD - Initialize(nsISupports* browserInterfaces) = 0; + Initialize() = 0; /** * Called when the browser is done with the plugin factory, or when diff --git a/mozilla/modules/plugin/base/public/nsIPluginInstance.h b/mozilla/modules/plugin/base/public/nsIPluginInstance.h index 2d27139a05f..314c64a0e62 100644 --- a/mozilla/modules/plugin/base/public/nsIPluginInstance.h +++ b/mozilla/modules/plugin/base/public/nsIPluginInstance.h @@ -37,6 +37,10 @@ #include "nsplugindefs.h" #include "nsIEventHandler.h" +#ifdef NEW_PLUGIN_STREAM_API +#include "nsIPluginStreamListener.h" +#endif + //////////////////////////////////////////////////////////////////////////////// // Plugin Instance Interface @@ -67,7 +71,8 @@ public: * @param peer - the corresponding plugin instance peer * @result - NS_OK if this operation was successful */ - NS_IMETHOD + + NS_IMETHOD Initialize(nsIPluginInstancePeer* peer) = 0; /** @@ -126,7 +131,19 @@ public: NS_IMETHOD SetWindow(nsPluginWindow* window) = 0; -#ifndef NEW_PLUGIN_STREAM_API +#ifdef NEW_PLUGIN_STREAM_API + /** + * Called to tell the plugin that the initial src/data stream is + * ready. Expects the plugin to return a nsIPluginStreamListener. + * + * (Corresponds to NPP_NewStream.) + * + * @param listener - listener the browser will use to give the plugin the data + * @result - NS_OK if this operation was successful + */ + NS_IMETHOD + NewStream(nsIPluginStreamListener** listener) = 0; +#else /** * Called when a new plugin stream must be constructed in order for the plugin * instance to receive a stream of data from the browser. diff --git a/mozilla/modules/plugin/base/public/nsIPluginStreamListener.h b/mozilla/modules/plugin/base/public/nsIPluginStreamListener.h index 215fab00d83..8e22c7a4637 100644 --- a/mozilla/modules/plugin/base/public/nsIPluginStreamListener.h +++ b/mozilla/modules/plugin/base/public/nsIPluginStreamListener.h @@ -36,14 +36,8 @@ #include "nsplugindefs.h" #include "nsISupports.h" - -class nsIPluginInputStream; - -struct nsPluginStreamInfo { - nsMIMEType contentType; - PRBool seekable; - // more... -}; +#include "nsIPluginStreamInfo.h" +#include "nsIInputStream.h" /** * The nsIPluginStreamListener interface defines the minimum set of functionality that @@ -62,7 +56,7 @@ public: * used to cancel the URL load.. */ NS_IMETHOD - OnStartBinding(const char* url, const nsPluginStreamInfo* info) = 0; + OnStartBinding(const char* url, nsIPluginStreamInfo* pluginInfo) = 0; /** * Notify the client that data is available in the input stream. This @@ -75,12 +69,11 @@ public: * @return The return value is currently ignored. */ NS_IMETHOD - OnDataAvailable(const char* url, nsIPluginInputStream* input, - PRUint32 offset, PRUint32 length) = 0; + OnDataAvailable(const char* url, nsIInputStream* input, + PRUint32 offset, PRUint32 length, nsIPluginStreamInfo* pluginInfo) = 0; NS_IMETHOD OnFileAvailable(const char* url, const char* fileName) = 0; - /** * Notify the observer that the URL has finished loading. This method is * called once when the networking library has finished processing the @@ -93,8 +86,13 @@ public: * @return The return value is currently ignored. */ NS_IMETHOD - OnStopBinding(const char* url, nsresult status) = 0; + OnStopBinding(const char* url, nsresult status, nsIPluginStreamInfo* pluginInfo) = 0; + NS_IMETHOD + OnNotify(const char* url, nsresult status) = 0; + + NS_IMETHOD + GetStreamType(nsPluginStreamType *result) = 0; }; #define NS_IPLUGINSTREAMLISTENER_IID \ diff --git a/mozilla/modules/plugin/base/public/nsplugindefs.h b/mozilla/modules/plugin/base/public/nsplugindefs.h index d807841e1c6..5a0a76d76f5 100644 --- a/mozilla/modules/plugin/base/public/nsplugindefs.h +++ b/mozilla/modules/plugin/base/public/nsplugindefs.h @@ -34,6 +34,8 @@ #ifndef nsplugindefs_h___ #define nsplugindefs_h___ +#define NEW_PLUGIN_STREAM_API + #ifndef prtypes_h___ #include "prtypes.h" #endif diff --git a/mozilla/modules/plugin/base/src/makefile.win b/mozilla/modules/plugin/base/src/makefile.win index ea7ad3cb2c9..c563abda4ac 100644 --- a/mozilla/modules/plugin/base/src/makefile.win +++ b/mozilla/modules/plugin/base/src/makefile.win @@ -37,9 +37,9 @@ OBJS = \ .\$(OBJDIR)\nsPluginFactory.obj \ .\$(OBJDIR)\ns4xPlugin.obj \ .\$(OBJDIR)\ns4xPluginInstance.obj \ - .\$(OBJDIR)\ns4xPluginStream.obj \ +# .\$(OBJDIR)\ns4xPluginStream.obj \ .\$(OBJDIR)\nsPluginInstancePeer.obj \ - .\$(OBJDIR)\nsPluginStreamPeer.obj \ +# .\$(OBJDIR)\nsPluginStreamPeer.obj \ .\$(OBJDIR)\nsMalloc.obj \ $(NULL) diff --git a/mozilla/modules/plugin/base/src/ns4xPlugin.cpp b/mozilla/modules/plugin/base/src/ns4xPlugin.cpp index 6d3448b0710..f67aa664850 100644 --- a/mozilla/modules/plugin/base/src/ns4xPlugin.cpp +++ b/mozilla/modules/plugin/base/src/ns4xPlugin.cpp @@ -21,7 +21,6 @@ #include "xp_core.h" #include "nsplugin.h" #include "ns4xPlugin.h" -#include "nsIPluginStream.h" #include "ns4xPluginInstance.h" //////////////////////////////////////////////////////////////////////// @@ -72,14 +71,44 @@ ns4xPlugin::CheckClassInitialized(void) }; //////////////////////////////////////////////////////////////////////// +// nsISupports stuff +NS_IMPL_ADDREF(ns4xPlugin); +NS_IMPL_RELEASE(ns4xPlugin); +//static NS_DEFINE_IID(kILiveConnectPluginIID, NS_ILIVECONNECTPLUGIN_IID); +static NS_DEFINE_IID(kIPluginIID, NS_IPLUGIN_IID); +static NS_DEFINE_IID(kIFactoryIID, NS_IFACTORY_IID); +static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID); +static NS_DEFINE_IID(kIWindowlessPluginInstancePeerIID, NS_IWINDOWLESSPLUGININSTANCEPEER_IID); +static NS_DEFINE_IID(kIPluginManagerIID, NS_IPLUGINMANAGER_IID); +static NS_DEFINE_IID(kIMallocIID, NS_IMALLOC_IID); + +#ifndef NEW_PLUGIN_STREAM_API +static NS_DEFINE_IID(kISeekablePluginStreamPeerIID, NS_ISEEKABLEPLUGINSTREAMPEER_IID); +#endif + +//////////////////////////////////////////////////////////////////////// + +#ifdef NEW_PLUGIN_STREAM_API +ns4xPlugin::ns4xPlugin(NPPluginFuncs* callbacks, NP_PLUGINSHUTDOWN aShutdown, nsISupports* browserInterfaces) +#else ns4xPlugin::ns4xPlugin(NPPluginFuncs* callbacks, NP_PLUGINSHUTDOWN aShutdown) +#endif { NS_INIT_REFCNT(); memcpy((void*) &fCallbacks, (void*) callbacks, sizeof(fCallbacks)); fShutdownEntry = aShutdown; + +#ifdef NEW_PLUGIN_STREAM_API + // set up the connections to the plugin manager + if (nsnull == mPluginManager) + browserInterfaces->QueryInterface(kIPluginManagerIID, (void **)&mPluginManager); + + if (nsnull == mMalloc) + browserInterfaces->QueryInterface(kIMallocIID, (void **)&mMalloc); +#endif } @@ -88,19 +117,6 @@ ns4xPlugin::~ns4xPlugin(void) } -//////////////////////////////////////////////////////////////////////// -// nsISupports stuff - -NS_IMPL_ADDREF(ns4xPlugin); -NS_IMPL_RELEASE(ns4xPlugin); - -static NS_DEFINE_IID(kILiveConnectPluginIID, NS_ILIVECONNECTPLUGIN_IID); -static NS_DEFINE_IID(kIPluginIID, NS_IPLUGIN_IID); -static NS_DEFINE_IID(kIFactoryIID, NS_IFACTORY_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) { @@ -114,18 +130,6 @@ ns4xPlugin::QueryInterface(const nsIID& iid, void** instance) return NS_OK; } - 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 *)(nsILiveConnectPlugin *)this; - AddRef(); - return NS_OK; - } - if (iid.Equals(kIFactoryIID)) { *instance = (void *)(nsIFactory *)this; @@ -143,13 +147,18 @@ ns4xPlugin::QueryInterface(const nsIID& iid, void** instance) return NS_NOINTERFACE; } -static NS_DEFINE_IID(kIPluginManagerIID, NS_IPLUGINMANAGER_IID); -static NS_DEFINE_IID(kIMallocIID, NS_IMALLOC_IID); //////////////////////////////////////////////////////////////////////// // Static factory method. // +/* + CreatePlugin() + -------------- + Handles the initialization of old, 4x style plugins. Creates the ns4xPlugin object. + One ns4xPlugin object exists per Plugin (not instance). +*/ + nsresult ns4xPlugin::CreatePlugin(PRLibrary *library, nsIPlugin **result, nsISupports* browserInterfaces) @@ -180,7 +189,7 @@ ns4xPlugin::CreatePlugin(PRLibrary *library, (NP_PLUGINSHUTDOWN)PR_FindSymbol(library, "NP_Shutdown"); // create the new plugin handler - *result = new ns4xPlugin(&callbacks, pfnShutdown); + *result = new ns4xPlugin(&callbacks, pfnShutdown, browserInterfaces); NS_ADDREF(*result); @@ -190,7 +199,11 @@ ns4xPlugin::CreatePlugin(PRLibrary *library, // we must init here because the plugin may call NPN functions // when we call into the NP_Initialize entry point - NPN functions // require that mBrowserManager be set up - (*result)->Initialize(browserInterfaces); +#ifdef NEW_PLUGIN_STREAM_API + (*result)->Initialize(); +#else + (*result)->Initialize(browserInterfaces); +#endif // the NP_Initialize entry point was misnamed as NP_PluginInit, // early in plugin project development. Its correct name is @@ -215,6 +228,12 @@ ns4xPlugin::CreatePlugin(PRLibrary *library, return NS_OK; } +/* + CreateInstance() + ---------------- + Creates a ns4xPluginInstance object. +*/ + nsresult ns4xPlugin :: CreateInstance(nsISupports *aOuter, const nsIID &aIID, void **aResult) @@ -250,6 +269,7 @@ nsresult ns4xPlugin :: LockFactory(PRBool aLock) return NS_OK; } +#ifndef NEW_PLUGIN_STREAM_API nsresult ns4xPlugin::Initialize(nsISupports* browserInterfaces) { @@ -265,6 +285,14 @@ ns4xPlugin::Initialize(nsISupports* browserInterfaces) return rv; } +#else +nsresult +ns4xPlugin::Initialize(void) +{ + return NS_OK; +} +#endif + nsresult ns4xPlugin::Shutdown(void) @@ -272,7 +300,7 @@ ns4xPlugin::Shutdown(void) if (nsnull != fShutdownEntry) { #ifdef NS_DEBUG -printf("shutting down plugin %08x\n", this); + printf("shutting down plugin %08x\n", this); #endif fShutdownEntry(); fShutdownEntry = nsnull; @@ -287,7 +315,7 @@ printf("shutting down plugin %08x\n", this); nsresult ns4xPlugin::GetMIMEDescription(const char* *resultingDesc) { -printf("plugin getmimedescription called\n"); + printf("plugin getmimedescription called\n"); *resultingDesc = ""; return NS_OK; // XXX make a callback, etc. } @@ -299,13 +327,6 @@ printf("plugin getvalue %d called\n", variable); return NS_OK; } -nsresult -ns4xPlugin::GetJavaClass(jclass *resultingClass) -{ - *resultingClass = (jclass)fCallbacks.javaClass; - return NS_OK; -} - //////////////////////////////////////////////////////////////////////// // // Static callbacks that get routed back through the new C++ API @@ -322,7 +343,15 @@ ns4xPlugin::_geturl(NPP npp, const char* relativeURL, const char* target) if (inst == NULL) return NS_ERROR_UNEXPECTED; // XXX +#ifdef NEW_PLUGIN_STREAM_API + nsIPluginStreamListener* listener = nsnull; + if(target == nsnull) + inst->NewStream(&listener); + + return mPluginManager->GetURL(inst, relativeURL, target, listener); +#else return mPluginManager->GetURL(inst, relativeURL, target); +#endif } nsresult NP_EXPORT @@ -337,8 +366,16 @@ ns4xPlugin::_geturlnotify(NPP npp, const char* relativeURL, const char* target, if (inst == NULL) return NS_ERROR_UNEXPECTED; // XXX +#ifdef NEW_PLUGIN_STREAM_API + nsIPluginStreamListener* listener = nsnull; + if(target == nsnull) + ((ns4xPluginInstance*)inst)->NewNotifyStream(&listener, notifyData); + + return mPluginManager->GetURL(inst, relativeURL, target, listener); +#else return mPluginManager->GetURL(inst, relativeURL, target, notifyData); +#endif } @@ -355,8 +392,16 @@ ns4xPlugin::_posturlnotify(NPP npp, const char* relativeURL, const char *target, if (inst == NULL) return NS_ERROR_UNEXPECTED; // XXX +#ifdef NEW_PLUGIN_STREAM_API + nsIPluginStreamListener* listener = nsnull; + if(target == nsnull) + ((ns4xPluginInstance*)inst)->NewNotifyStream(&listener, notifyData); + + return mPluginManager->PostURL(inst, relativeURL, len, buf, file, target, listener); +#else return mPluginManager->PostURL(inst, relativeURL, target, len, buf, file, notifyData); +#endif } @@ -372,8 +417,16 @@ ns4xPlugin::_posturl(NPP npp, const char* relativeURL, const char *target, uint3 if (inst == NULL) return NS_ERROR_UNEXPECTED; // XXX +#ifdef NEW_PLUGIN_STREAM_API + nsIPluginStreamListener* listener = nsnull; + if(target == nsnull) + inst->NewStream(&listener); + + return mPluginManager->PostURL(inst, relativeURL, len, buf, file, target, listener); +#else return mPluginManager->PostURL(inst, relativeURL, target, len, buf, file); +#endif } //////////////////////////////////////////////////////////////////////// @@ -694,6 +747,7 @@ ns4xPlugin::_setvalue(NPP npp, NPPVariable variable, void *result) nsresult NP_EXPORT ns4xPlugin::_requestread(NPStream *pstream, NPByteRange *rangeList) { +#ifndef NEW_PLUGIN_STREAM_API nsIPluginStreamPeer* streamPeer = (nsIPluginStreamPeer*) pstream->ndata; NS_ASSERTION(streamPeer != NULL, "null streampeer"); @@ -713,7 +767,7 @@ ns4xPlugin::_requestread(NPStream *pstream, NPByteRange *rangeList) NS_RELEASE(seekablePeer); return error; } - +#endif return NS_ERROR_UNEXPECTED; } @@ -756,8 +810,6 @@ ns4xPlugin::_memalloc (uint32 size) return mMalloc->Alloc(size); } -#if 1 - java_lang_Class* NP_EXPORT ns4xPlugin::_getJavaClass(void* handle) { @@ -770,31 +822,8 @@ ns4xPlugin::_getJavaClass(void* handle) jref NP_EXPORT ns4xPlugin::_getJavaPeer(NPP npp) { -#if 0 - NPIPluginInstancePeer* peer = (NPIPluginInstancePeer*) npp->ndata; - PR_ASSERT(peer != NULL); - if (peer == NULL) - return NULL; - - static NS_DEFINE_IID(kILiveConnectPluginInstancePeerIID, - NP_ILIVECONNECTPLUGININSTANCEPEER_IID); - - NPILiveConnectPluginInstancePeer* lcPeer = NULL; - if (peer->QueryInterface(kILiveConnectPluginInstancePeerIID, - (void**) &lcPeer) == NS_OK) { - jobject result = lcPeer->GetJavaPeer(); - lcPeer->Release(); - return result; - } -#endif return NULL; } -#endif -#if defined(XP_MAC) && !defined(powerc) -#pragma pointers_in_A0 -#endif - -// -//////////////////////////////////////////////////////////////////////// +// eof \ No newline at end of file diff --git a/mozilla/modules/plugin/base/src/ns4xPlugin.h b/mozilla/modules/plugin/base/src/ns4xPlugin.h index 4f21fc0eba0..08fa4c48d7a 100644 --- a/mozilla/modules/plugin/base/src/ns4xPlugin.h +++ b/mozilla/modules/plugin/base/src/ns4xPlugin.h @@ -55,10 +55,11 @@ typedef NPError (PLUGIN_ENTRYPOINT_CALL_TYPE *NP_PLUGINSHUTDOWN)(); /** * A 5.0 wrapper for a 4.x style plugin. */ -class ns4xPlugin : public nsILiveConnectPlugin + +class ns4xPlugin : public nsIPlugin { public: - ns4xPlugin(NPPluginFuncs* callbacks, NP_PLUGINSHUTDOWN aShutdown); + ns4xPlugin(NPPluginFuncs* callbacks, NP_PLUGINSHUTDOWN aShutdown, nsISupports* browserInterfaces); ~ns4xPlugin(void); NS_DECL_ISUPPORTS @@ -73,8 +74,13 @@ public: //nsIPlugin interface +#ifndef NEW_PLUGIN_STREAM_API NS_IMETHOD Initialize(nsISupports* browserInterfaces); +#else + NS_IMETHOD + Initialize(void); +#endif NS_IMETHOD Shutdown(void); @@ -85,11 +91,6 @@ public: NS_IMETHOD GetValue(nsPluginVariable variable, void *value); - //nsILiveConnectPlugin interface - - NS_IMETHOD - GetJavaClass(jclass *resultingClass); - //////////////////////////////////////////////////////////////////// // ns4xPlugin-specific methods diff --git a/mozilla/modules/plugin/base/src/ns4xPluginInstance.cpp b/mozilla/modules/plugin/base/src/ns4xPluginInstance.cpp index d1dda69f096..0e40312b4f3 100644 --- a/mozilla/modules/plugin/base/src/ns4xPluginInstance.cpp +++ b/mozilla/modules/plugin/base/src/ns4xPluginInstance.cpp @@ -17,11 +17,257 @@ */ #include "ns4xPluginInstance.h" + +#ifdef NEW_PLUGIN_STREAM_API +#include "nsIPluginStreamListener.h" +#else #include "ns4xPluginStream.h" +#endif + #include "prlog.h" +//////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////// +#ifdef NEW_PLUGIN_STREAM_API + +class ns4xPluginStreamListener : public nsIPluginStreamListener { + +public: + + NS_DECL_ISUPPORTS + + //////////////////////////////////////////////////////////////////////////// + // from nsIPluginStreamListener: + + NS_IMETHOD + OnStartBinding(const char* url, nsIPluginStreamInfo* pluginInfo); + + NS_IMETHOD + OnDataAvailable(const char* url, nsIInputStream* input, + PRUint32 offset, PRUint32 length, nsIPluginStreamInfo* pluginInfo); + + NS_IMETHOD + OnFileAvailable(const char* url, const char* fileName); + + NS_IMETHOD + OnStopBinding(const char* url, nsresult status, nsIPluginStreamInfo* pluginInfo); + + NS_IMETHOD + GetStreamType(nsPluginStreamType *result); + + NS_IMETHOD + OnNotify(const char* url, nsresult status); + + //////////////////////////////////////////////////////////////////////////// + // ns4xPluginStreamListener specific methods: + + ns4xPluginStreamListener(nsIPluginInstance* inst, void* notifyData); + virtual ~ns4xPluginStreamListener(void); + +protected: + + void* mNotifyData; + ns4xPluginInstance* mInst; + NPStream mNPStream; + PRUint32 mPosition; + nsPluginStreamType mStreamType; +}; + +//////////////////////////////////////////////////////////////////////////////// +// ns4xPluginStreamListener Methods +//////////////////////////////////////////////////////////////////////////////// + +static NS_DEFINE_IID(kIPluginStreamListenerIID, NS_IPLUGINSTREAMLISTENER_IID); + +ns4xPluginStreamListener::ns4xPluginStreamListener(nsIPluginInstance* inst, void* notifyData) + : mNotifyData(notifyData) +{ + NS_INIT_REFCNT(); + mInst = (ns4xPluginInstance*) inst; + mPosition = 0; + + // Initialize the 4.x interface structure + memset(&mNPStream, 0, sizeof(mNPStream)); + + NS_IF_ADDREF(mInst); +} + +ns4xPluginStreamListener::~ns4xPluginStreamListener(void) +{ + NS_IF_RELEASE(mInst); +} + +NS_IMPL_ISUPPORTS(ns4xPluginStreamListener, kIPluginStreamListenerIID); + +NS_IMETHODIMP +ns4xPluginStreamListener::OnStartBinding(const char* url, nsIPluginStreamInfo* pluginInfo) +{ + NPP npp; + const NPPluginFuncs *callbacks; + PRBool seekable; + nsMIMEType contentType; + + + mNPStream.ndata = (void*) this; + mNPStream.url = url; + mNPStream.notifyData = mNotifyData; + + pluginInfo->GetLength((PRUint32*)&(mNPStream.end)); + pluginInfo->GetLastModified((PRUint32*)&(mNPStream.lastmodified)); + pluginInfo->IsSeekable(&seekable); + pluginInfo->GetContentType(&contentType); + + mInst->GetCallbacks(&callbacks); + mInst->GetNPP(&npp); + + nsresult error + = (nsresult)CallNPP_NewStreamProc(callbacks->newstream, + npp, + (char *)contentType, + &mNPStream, + seekable, + (PRUint16*)&mStreamType); + return NS_OK; +} + +NS_IMETHODIMP +ns4xPluginStreamListener::OnDataAvailable(const char* url, nsIInputStream* input, + PRUint32 offset, PRUint32 length, nsIPluginStreamInfo* pluginInfo) +{ + const NPPluginFuncs *callbacks; + NPP npp; + PRUint32 numtowrite = 0; + PRUint32 amountRead = 0; + PRInt32 writeCount = 0; + + mNPStream.url = url; + pluginInfo->GetLastModified((PRUint32*)&(mNPStream.lastmodified)); + + mInst->GetCallbacks(&callbacks); + mInst->GetNPP(&npp); + + if (callbacks->write == NULL) + return NS_OK; // XXX ? + + // Get the data from the input stream + char* buffer = new char[length]; + if (buffer) + input->Read(buffer, offset, length, &amountRead); + + // amountRead tells us how many bytes were put in the buffer + // WriteReady returns to us how many bytes the plugin is + // ready to handle - we have to keep calling WriteReady and + // Write until the buffer is empty + while (amountRead > 0) + { + if (callbacks->writeready != NULL) + { + numtowrite = CallNPP_WriteReadyProc(callbacks->writeready, + npp, + &mNPStream); + + if (numtowrite > amountRead) + numtowrite = amountRead; + } + else // if WriteReady is not supported by the plugin, just write the whole buffer + numtowrite = length; + + + writeCount = CallNPP_WriteProc(callbacks->write, + npp, + &mNPStream, + mPosition, + numtowrite, + (void *)buffer); + if(writeCount < 0) + return NS_ERROR_FAILURE; + + amountRead -= numtowrite; + mPosition += numtowrite; + } + + return NS_OK; +} + +NS_IMETHODIMP +ns4xPluginStreamListener::OnFileAvailable(const char* url, const char* fileName) +{ + const NPPluginFuncs *callbacks; + NPP npp; + + mNPStream.url = url; + + mInst->GetCallbacks(&callbacks); + mInst->GetNPP(&npp); + + if (callbacks->asfile == NULL) + return NS_OK; + + CallNPP_StreamAsFileProc(callbacks->asfile, + npp, + &mNPStream, + fileName); + + return NS_OK; +} + +NS_IMETHODIMP +ns4xPluginStreamListener::OnStopBinding(const char* url, nsresult status, nsIPluginStreamInfo* pluginInfo) +{ + const NPPluginFuncs *callbacks; + NPP npp; + + mNPStream.url = url; + pluginInfo->GetLastModified((PRUint32*)&(mNPStream.lastmodified)); + + mInst->GetCallbacks(&callbacks); + mInst->GetNPP(&npp); + + if (callbacks->destroystream != NULL) + { + CallNPP_DestroyStreamProc(callbacks->destroystream, + npp, + &mNPStream, + nsPluginReason_Done); + } + + return NS_OK; +} + +NS_IMETHODIMP +ns4xPluginStreamListener::GetStreamType(nsPluginStreamType *result) +{ + *result = mStreamType; + return NS_OK; +} + +NS_IMETHODIMP +ns4xPluginStreamListener::OnNotify(const char* url, nsresult status) +{ + const NPPluginFuncs *callbacks; + NPP npp; + + mNPStream.url = url; + + mInst->GetCallbacks(&callbacks); + mInst->GetNPP(&npp); + + // check to see if we have a call back + if (callbacks->urlnotify != NULL && mNotifyData != nsnull) + { + CallNPP_URLNotifyProc(callbacks->urlnotify, + npp, + url, + nsPluginReason_Done, + mNotifyData); + } + + return NS_OK; +} + +#endif ns4xPluginInstance :: ns4xPluginInstance(NPPluginFuncs* callbacks) : fCallbacks(callbacks) @@ -205,6 +451,34 @@ NS_IMETHODIMP ns4xPluginInstance::SetWindow(nsPluginWindow* window) return error; } +#ifdef NEW_PLUGIN_STREAM_API + +/* NOTE: the caller must free the stream listener */ + +NS_IMETHODIMP ns4xPluginInstance::NewStream(nsIPluginStreamListener** listener) +{ + nsISupports* stream = nsnull; + stream = (nsISupports *)(nsIPluginStreamListener *)new ns4xPluginStreamListener(this, nsnull); + + if(stream == nsnull) + return NS_ERROR_OUT_OF_MEMORY; + + nsresult res = stream->QueryInterface(kIPluginStreamListenerIID, (void**)listener); + + // If we didn't get the right interface, clean up + if (res != NS_OK) + delete stream; + + return res; +} + +nsresult ns4xPluginInstance::NewNotifyStream(nsIPluginStreamListener** listener, void* notifyData) +{ + *listener = new ns4xPluginStreamListener(this, notifyData); + return NS_OK; +} + +#else NS_IMETHODIMP ns4xPluginInstance::NewStream(nsIPluginStreamPeer* peer, nsIPluginStream* *result) { (*result) = NULL; @@ -229,6 +503,7 @@ NS_IMETHODIMP ns4xPluginInstance::NewStream(nsIPluginStreamPeer* peer, nsIPlugin (*result) = stream; return NS_OK; } +#endif NS_IMETHODIMP ns4xPluginInstance::Print(nsPluginPrint* platformPrint) { @@ -244,6 +519,7 @@ printf("instance handleevent called\n"); return NS_OK; } +#ifndef NEW_PLUGIN_STREAM_API NS_IMETHODIMP ns4xPluginInstance::URLNotify(const char* url, const char* target, nsPluginReason reason, void* notifyData) { @@ -258,6 +534,7 @@ NS_IMETHODIMP ns4xPluginInstance::URLNotify(const char* url, const char* target, return NS_OK; //XXX this seems bad... } +#endif NS_IMETHODIMP ns4xPluginInstance :: GetValue(nsPluginInstanceVariable variable, void *value) { @@ -280,15 +557,34 @@ NS_IMETHODIMP ns4xPluginInstance :: GetValue(nsPluginInstanceVariable variable, return rv; } -NS_IMETHODIMP ns4xPluginInstance :: SetWindowless(PRBool aWindowless) +nsresult ns4xPluginInstance::GetNPP(NPP* aNPP) +{ + if(aNPP != nsnull) + *aNPP = &fNPP; + else + return NS_ERROR_NULL_POINTER; + + return NS_OK; +} + +nsresult ns4xPluginInstance::GetCallbacks(const NPPluginFuncs ** aCallbacks) +{ + if(aCallbacks != nsnull) + *aCallbacks = fCallbacks; + else + return NS_ERROR_NULL_POINTER; + + return NS_OK; +} + +nsresult ns4xPluginInstance :: SetWindowless(PRBool aWindowless) { mWindowless = aWindowless; return NS_OK; } -NS_IMETHODIMP ns4xPluginInstance :: SetTransparent(PRBool aTransparent) +nsresult ns4xPluginInstance :: SetTransparent(PRBool aTransparent) { mTransparent = aTransparent; return NS_OK; } - diff --git a/mozilla/modules/plugin/base/src/ns4xPluginInstance.h b/mozilla/modules/plugin/base/src/ns4xPluginInstance.h index 4c0a8270534..f1b1c1ff39a 100644 --- a/mozilla/modules/plugin/base/src/ns4xPluginInstance.h +++ b/mozilla/modules/plugin/base/src/ns4xPluginInstance.h @@ -32,15 +32,6 @@ 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 //////////////////////////////////////////////////////////////////////// @@ -70,50 +61,62 @@ public: NS_IMETHOD SetWindow(nsPluginWindow* window); +#ifdef NEW_PLUGIN_STREAM_API NS_IMETHOD + NewStream(nsIPluginStreamListener** listener); +#else + NS_IMETHOD NewStream(nsIPluginStreamPeer* peer, nsIPluginStream* *result); +#endif NS_IMETHOD Print(nsPluginPrint* platformPrint); - NS_IMETHOD - HandleEvent(nsPluginEvent* event, PRBool* handled); - +#ifndef NEW_PLUGIN_STREAM_API NS_IMETHOD URLNotify(const char* url, const char* target, nsPluginReason reason, void* notifyData); +#endif NS_IMETHOD GetValue(nsPluginInstanceVariable variable, void *value); - //////////////////////////////////////////////////////////////////////// + NS_IMETHOD + HandleEvent(nsPluginEvent* event, PRBool* handled); + + //////////////////////////////////////////////////////////////////////// // ns4xPluginInstance-specific methods - /** * Return the 4.x-style interface object. */ - NS_IMETHOD - GetNPP(NPP * aNPP) { - *aNPP = &fNPP; - return NS_OK; - }; + nsresult + GetNPP(NPP * aNPP); /** * Return the callbacks for the plugin instance. */ - NS_IMETHOD - GetCallbacks(const NPPluginFuncs ** aCallbacks) { - *aCallbacks = fCallbacks; - return NS_OK; - }; + nsresult + GetCallbacks(const NPPluginFuncs ** aCallbacks); - NS_IMETHOD + nsresult SetWindowless(PRBool aWindowless); - NS_IMETHOD + nsresult SetTransparent(PRBool aTransparent); + nsresult + NewNotifyStream(nsIPluginStreamListener** listener, void* notifyData); + + /** + * Construct a new 4.x plugin instance with the specified peer + * and callbacks. + */ + ns4xPluginInstance(NPPluginFuncs* callbacks); + + // Use Release() to destroy this + ~ns4xPluginInstance(void); + protected: /** diff --git a/mozilla/modules/plugin/base/src/nsIPluginHost.h b/mozilla/modules/plugin/base/src/nsIPluginHost.h index f169f620fa3..25502d70c92 100644 --- a/mozilla/modules/plugin/base/src/nsIPluginHost.h +++ b/mozilla/modules/plugin/base/src/nsIPluginHost.h @@ -46,22 +46,14 @@ public: LoadPlugins(void) = 0; NS_IMETHOD - InstantiatePlugin(const char *aMimeType, nsIURL *aURL, nsIPluginInstanceOwner *aOwner) = 0; + InstantiateEmbededPlugin(const char *aMimeType, nsString& aURLSpec, nsIPluginInstanceOwner *aOwner) = 0; NS_IMETHOD - InstantiatePlugin(const char *aMimeType, nsString& aURLSpec, nsIPluginInstanceOwner *aOwner) = 0; + InstantiateFullPagePlugin(const char *aMimeType, nsString& aURLSpec, nsIStreamListener *&aStreamListener, nsIPluginInstanceOwner *aOwner) = 0; NS_IMETHOD - InstantiatePlugin(const char *aMimeType, nsString& aURLSpec, nsIStreamListener *&aStreamListener, nsIPluginInstanceOwner *aOwner) = 0; + SetUpPluginInstance(const char *aMimeType, nsIURL *aURL, nsIPluginInstanceOwner *aOwner) = 0; - NS_IMETHOD - NewPluginStream(const nsString& aURL, nsIPluginInstance *aInstance, void *aNotifyData) = 0; - - NS_IMETHOD - NewPluginStream(const nsString& aURL, nsIPluginInstanceOwner *aOwner, void *aNotifyData) = 0; - - NS_IMETHOD - NewPluginStream(nsIStreamListener *&aStreamListener, nsIPluginInstance *aInstance, void *aNotifyData) = 0; }; -#endif +#endif // nsIPluginHost_h___ diff --git a/mozilla/modules/plugin/base/src/nsPluginInstancePeer.cpp b/mozilla/modules/plugin/base/src/nsPluginInstancePeer.cpp index a53deadef4f..283bec60676 100644 --- a/mozilla/modules/plugin/base/src/nsPluginInstancePeer.cpp +++ b/mozilla/modules/plugin/base/src/nsPluginInstancePeer.cpp @@ -25,6 +25,11 @@ #include "prprf.h" #include "nsIOutputStream.h" +#ifdef XP_PC +#include "windows.h" +#include "winbase.h" +#endif + nsPluginInstancePeerImpl :: nsPluginInstancePeerImpl() { NS_INIT_REFCNT(); @@ -755,7 +760,7 @@ printf("instance peer setwindowsize called\n"); nsresult nsPluginInstancePeerImpl :: Initialize(nsIPluginInstanceOwner *aOwner, const nsMIMEType aMIMEType) { - //don't add a ref to precent circular references... MMP + //don't add a ref to prevent circular references... MMP mOwner = aOwner; aOwner->GetInstance(mInstance); @@ -784,3 +789,19 @@ nsresult nsPluginInstancePeerImpl :: GetOwner(nsIPluginInstanceOwner *&aOwner) return NS_ERROR_FAILURE; } + +NS_IMETHODIMP nsPluginInstancePeerImpl::InvalidateRect(nsPluginRect *invalidRect) +{ + return NS_OK; +} + +NS_IMETHODIMP nsPluginInstancePeerImpl::InvalidateRegion(nsPluginRegion invalidRegion) +{ + return NS_OK; +} + +NS_IMETHODIMP nsPluginInstancePeerImpl::ForceRedraw(void) +{ + return NS_OK; +} + diff --git a/mozilla/modules/plugin/base/src/nsPluginInstancePeer.h b/mozilla/modules/plugin/base/src/nsPluginInstancePeer.h index 4205cf9ffc9..785d1aab6a8 100644 --- a/mozilla/modules/plugin/base/src/nsPluginInstancePeer.h +++ b/mozilla/modules/plugin/base/src/nsPluginInstancePeer.h @@ -20,14 +20,17 @@ #define nsPluginInstancePeer_h___ #include "nsIPluginInstancePeer.h" +#include "nsIWindowlessPlugInstPeer.h" #include "nsIPluginTagInfo.h" #include "nsIPluginInstanceOwner.h" #include "nsIJVMPluginTagInfo.h" class nsPluginInstancePeerImpl : public nsIPluginInstancePeer, + public nsIWindowlessPluginInstancePeer, public nsIPluginTagInfo2, public nsIJVMPluginTagInfo + { public: nsPluginInstancePeerImpl(); @@ -55,6 +58,23 @@ public: NS_IMETHOD SetWindowSize(PRUint32 width, PRUint32 height); + // nsIWindowlessPluginInstancePeer + + // (Corresponds to NPN_InvalidateRect.) + NS_IMETHOD + InvalidateRect(nsPluginRect *invalidRect); + + // (Corresponds to NPN_InvalidateRegion.) + NS_IMETHOD + InvalidateRegion(nsPluginRegion invalidRegion); + + // (Corresponds to NPN_ForceRedraw.) + NS_IMETHOD + ForceRedraw(void); + + /* The tag info interfaces all pass through calls to the + nsPluginInstanceOwner (see nsObjectFrame.cpp) */ + //nsIPluginTagInfo interface NS_IMETHOD diff --git a/mozilla/modules/plugin/base/src/nsPluginStreamPeer.cpp b/mozilla/modules/plugin/base/src/nsPluginStreamPeer.cpp index 9d805136c1f..0513181539c 100644 --- a/mozilla/modules/plugin/base/src/nsPluginStreamPeer.cpp +++ b/mozilla/modules/plugin/base/src/nsPluginStreamPeer.cpp @@ -167,3 +167,5 @@ nsresult nsPluginStreamPeer :: SetReason(nsPluginReason aReason) mReason = aReason; return NS_OK; } + +// eof \ No newline at end of file diff --git a/mozilla/modules/plugin/nglsrc/makefile.win b/mozilla/modules/plugin/nglsrc/makefile.win index ea7ad3cb2c9..c563abda4ac 100644 --- a/mozilla/modules/plugin/nglsrc/makefile.win +++ b/mozilla/modules/plugin/nglsrc/makefile.win @@ -37,9 +37,9 @@ OBJS = \ .\$(OBJDIR)\nsPluginFactory.obj \ .\$(OBJDIR)\ns4xPlugin.obj \ .\$(OBJDIR)\ns4xPluginInstance.obj \ - .\$(OBJDIR)\ns4xPluginStream.obj \ +# .\$(OBJDIR)\ns4xPluginStream.obj \ .\$(OBJDIR)\nsPluginInstancePeer.obj \ - .\$(OBJDIR)\nsPluginStreamPeer.obj \ +# .\$(OBJDIR)\nsPluginStreamPeer.obj \ .\$(OBJDIR)\nsMalloc.obj \ $(NULL) diff --git a/mozilla/modules/plugin/nglsrc/ns4xPlugin.cpp b/mozilla/modules/plugin/nglsrc/ns4xPlugin.cpp index 6d3448b0710..f67aa664850 100644 --- a/mozilla/modules/plugin/nglsrc/ns4xPlugin.cpp +++ b/mozilla/modules/plugin/nglsrc/ns4xPlugin.cpp @@ -21,7 +21,6 @@ #include "xp_core.h" #include "nsplugin.h" #include "ns4xPlugin.h" -#include "nsIPluginStream.h" #include "ns4xPluginInstance.h" //////////////////////////////////////////////////////////////////////// @@ -72,14 +71,44 @@ ns4xPlugin::CheckClassInitialized(void) }; //////////////////////////////////////////////////////////////////////// +// nsISupports stuff +NS_IMPL_ADDREF(ns4xPlugin); +NS_IMPL_RELEASE(ns4xPlugin); +//static NS_DEFINE_IID(kILiveConnectPluginIID, NS_ILIVECONNECTPLUGIN_IID); +static NS_DEFINE_IID(kIPluginIID, NS_IPLUGIN_IID); +static NS_DEFINE_IID(kIFactoryIID, NS_IFACTORY_IID); +static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID); +static NS_DEFINE_IID(kIWindowlessPluginInstancePeerIID, NS_IWINDOWLESSPLUGININSTANCEPEER_IID); +static NS_DEFINE_IID(kIPluginManagerIID, NS_IPLUGINMANAGER_IID); +static NS_DEFINE_IID(kIMallocIID, NS_IMALLOC_IID); + +#ifndef NEW_PLUGIN_STREAM_API +static NS_DEFINE_IID(kISeekablePluginStreamPeerIID, NS_ISEEKABLEPLUGINSTREAMPEER_IID); +#endif + +//////////////////////////////////////////////////////////////////////// + +#ifdef NEW_PLUGIN_STREAM_API +ns4xPlugin::ns4xPlugin(NPPluginFuncs* callbacks, NP_PLUGINSHUTDOWN aShutdown, nsISupports* browserInterfaces) +#else ns4xPlugin::ns4xPlugin(NPPluginFuncs* callbacks, NP_PLUGINSHUTDOWN aShutdown) +#endif { NS_INIT_REFCNT(); memcpy((void*) &fCallbacks, (void*) callbacks, sizeof(fCallbacks)); fShutdownEntry = aShutdown; + +#ifdef NEW_PLUGIN_STREAM_API + // set up the connections to the plugin manager + if (nsnull == mPluginManager) + browserInterfaces->QueryInterface(kIPluginManagerIID, (void **)&mPluginManager); + + if (nsnull == mMalloc) + browserInterfaces->QueryInterface(kIMallocIID, (void **)&mMalloc); +#endif } @@ -88,19 +117,6 @@ ns4xPlugin::~ns4xPlugin(void) } -//////////////////////////////////////////////////////////////////////// -// nsISupports stuff - -NS_IMPL_ADDREF(ns4xPlugin); -NS_IMPL_RELEASE(ns4xPlugin); - -static NS_DEFINE_IID(kILiveConnectPluginIID, NS_ILIVECONNECTPLUGIN_IID); -static NS_DEFINE_IID(kIPluginIID, NS_IPLUGIN_IID); -static NS_DEFINE_IID(kIFactoryIID, NS_IFACTORY_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) { @@ -114,18 +130,6 @@ ns4xPlugin::QueryInterface(const nsIID& iid, void** instance) return NS_OK; } - 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 *)(nsILiveConnectPlugin *)this; - AddRef(); - return NS_OK; - } - if (iid.Equals(kIFactoryIID)) { *instance = (void *)(nsIFactory *)this; @@ -143,13 +147,18 @@ ns4xPlugin::QueryInterface(const nsIID& iid, void** instance) return NS_NOINTERFACE; } -static NS_DEFINE_IID(kIPluginManagerIID, NS_IPLUGINMANAGER_IID); -static NS_DEFINE_IID(kIMallocIID, NS_IMALLOC_IID); //////////////////////////////////////////////////////////////////////// // Static factory method. // +/* + CreatePlugin() + -------------- + Handles the initialization of old, 4x style plugins. Creates the ns4xPlugin object. + One ns4xPlugin object exists per Plugin (not instance). +*/ + nsresult ns4xPlugin::CreatePlugin(PRLibrary *library, nsIPlugin **result, nsISupports* browserInterfaces) @@ -180,7 +189,7 @@ ns4xPlugin::CreatePlugin(PRLibrary *library, (NP_PLUGINSHUTDOWN)PR_FindSymbol(library, "NP_Shutdown"); // create the new plugin handler - *result = new ns4xPlugin(&callbacks, pfnShutdown); + *result = new ns4xPlugin(&callbacks, pfnShutdown, browserInterfaces); NS_ADDREF(*result); @@ -190,7 +199,11 @@ ns4xPlugin::CreatePlugin(PRLibrary *library, // we must init here because the plugin may call NPN functions // when we call into the NP_Initialize entry point - NPN functions // require that mBrowserManager be set up - (*result)->Initialize(browserInterfaces); +#ifdef NEW_PLUGIN_STREAM_API + (*result)->Initialize(); +#else + (*result)->Initialize(browserInterfaces); +#endif // the NP_Initialize entry point was misnamed as NP_PluginInit, // early in plugin project development. Its correct name is @@ -215,6 +228,12 @@ ns4xPlugin::CreatePlugin(PRLibrary *library, return NS_OK; } +/* + CreateInstance() + ---------------- + Creates a ns4xPluginInstance object. +*/ + nsresult ns4xPlugin :: CreateInstance(nsISupports *aOuter, const nsIID &aIID, void **aResult) @@ -250,6 +269,7 @@ nsresult ns4xPlugin :: LockFactory(PRBool aLock) return NS_OK; } +#ifndef NEW_PLUGIN_STREAM_API nsresult ns4xPlugin::Initialize(nsISupports* browserInterfaces) { @@ -265,6 +285,14 @@ ns4xPlugin::Initialize(nsISupports* browserInterfaces) return rv; } +#else +nsresult +ns4xPlugin::Initialize(void) +{ + return NS_OK; +} +#endif + nsresult ns4xPlugin::Shutdown(void) @@ -272,7 +300,7 @@ ns4xPlugin::Shutdown(void) if (nsnull != fShutdownEntry) { #ifdef NS_DEBUG -printf("shutting down plugin %08x\n", this); + printf("shutting down plugin %08x\n", this); #endif fShutdownEntry(); fShutdownEntry = nsnull; @@ -287,7 +315,7 @@ printf("shutting down plugin %08x\n", this); nsresult ns4xPlugin::GetMIMEDescription(const char* *resultingDesc) { -printf("plugin getmimedescription called\n"); + printf("plugin getmimedescription called\n"); *resultingDesc = ""; return NS_OK; // XXX make a callback, etc. } @@ -299,13 +327,6 @@ printf("plugin getvalue %d called\n", variable); return NS_OK; } -nsresult -ns4xPlugin::GetJavaClass(jclass *resultingClass) -{ - *resultingClass = (jclass)fCallbacks.javaClass; - return NS_OK; -} - //////////////////////////////////////////////////////////////////////// // // Static callbacks that get routed back through the new C++ API @@ -322,7 +343,15 @@ ns4xPlugin::_geturl(NPP npp, const char* relativeURL, const char* target) if (inst == NULL) return NS_ERROR_UNEXPECTED; // XXX +#ifdef NEW_PLUGIN_STREAM_API + nsIPluginStreamListener* listener = nsnull; + if(target == nsnull) + inst->NewStream(&listener); + + return mPluginManager->GetURL(inst, relativeURL, target, listener); +#else return mPluginManager->GetURL(inst, relativeURL, target); +#endif } nsresult NP_EXPORT @@ -337,8 +366,16 @@ ns4xPlugin::_geturlnotify(NPP npp, const char* relativeURL, const char* target, if (inst == NULL) return NS_ERROR_UNEXPECTED; // XXX +#ifdef NEW_PLUGIN_STREAM_API + nsIPluginStreamListener* listener = nsnull; + if(target == nsnull) + ((ns4xPluginInstance*)inst)->NewNotifyStream(&listener, notifyData); + + return mPluginManager->GetURL(inst, relativeURL, target, listener); +#else return mPluginManager->GetURL(inst, relativeURL, target, notifyData); +#endif } @@ -355,8 +392,16 @@ ns4xPlugin::_posturlnotify(NPP npp, const char* relativeURL, const char *target, if (inst == NULL) return NS_ERROR_UNEXPECTED; // XXX +#ifdef NEW_PLUGIN_STREAM_API + nsIPluginStreamListener* listener = nsnull; + if(target == nsnull) + ((ns4xPluginInstance*)inst)->NewNotifyStream(&listener, notifyData); + + return mPluginManager->PostURL(inst, relativeURL, len, buf, file, target, listener); +#else return mPluginManager->PostURL(inst, relativeURL, target, len, buf, file, notifyData); +#endif } @@ -372,8 +417,16 @@ ns4xPlugin::_posturl(NPP npp, const char* relativeURL, const char *target, uint3 if (inst == NULL) return NS_ERROR_UNEXPECTED; // XXX +#ifdef NEW_PLUGIN_STREAM_API + nsIPluginStreamListener* listener = nsnull; + if(target == nsnull) + inst->NewStream(&listener); + + return mPluginManager->PostURL(inst, relativeURL, len, buf, file, target, listener); +#else return mPluginManager->PostURL(inst, relativeURL, target, len, buf, file); +#endif } //////////////////////////////////////////////////////////////////////// @@ -694,6 +747,7 @@ ns4xPlugin::_setvalue(NPP npp, NPPVariable variable, void *result) nsresult NP_EXPORT ns4xPlugin::_requestread(NPStream *pstream, NPByteRange *rangeList) { +#ifndef NEW_PLUGIN_STREAM_API nsIPluginStreamPeer* streamPeer = (nsIPluginStreamPeer*) pstream->ndata; NS_ASSERTION(streamPeer != NULL, "null streampeer"); @@ -713,7 +767,7 @@ ns4xPlugin::_requestread(NPStream *pstream, NPByteRange *rangeList) NS_RELEASE(seekablePeer); return error; } - +#endif return NS_ERROR_UNEXPECTED; } @@ -756,8 +810,6 @@ ns4xPlugin::_memalloc (uint32 size) return mMalloc->Alloc(size); } -#if 1 - java_lang_Class* NP_EXPORT ns4xPlugin::_getJavaClass(void* handle) { @@ -770,31 +822,8 @@ ns4xPlugin::_getJavaClass(void* handle) jref NP_EXPORT ns4xPlugin::_getJavaPeer(NPP npp) { -#if 0 - NPIPluginInstancePeer* peer = (NPIPluginInstancePeer*) npp->ndata; - PR_ASSERT(peer != NULL); - if (peer == NULL) - return NULL; - - static NS_DEFINE_IID(kILiveConnectPluginInstancePeerIID, - NP_ILIVECONNECTPLUGININSTANCEPEER_IID); - - NPILiveConnectPluginInstancePeer* lcPeer = NULL; - if (peer->QueryInterface(kILiveConnectPluginInstancePeerIID, - (void**) &lcPeer) == NS_OK) { - jobject result = lcPeer->GetJavaPeer(); - lcPeer->Release(); - return result; - } -#endif return NULL; } -#endif -#if defined(XP_MAC) && !defined(powerc) -#pragma pointers_in_A0 -#endif - -// -//////////////////////////////////////////////////////////////////////// +// eof \ No newline at end of file diff --git a/mozilla/modules/plugin/nglsrc/ns4xPlugin.h b/mozilla/modules/plugin/nglsrc/ns4xPlugin.h index 4f21fc0eba0..08fa4c48d7a 100644 --- a/mozilla/modules/plugin/nglsrc/ns4xPlugin.h +++ b/mozilla/modules/plugin/nglsrc/ns4xPlugin.h @@ -55,10 +55,11 @@ typedef NPError (PLUGIN_ENTRYPOINT_CALL_TYPE *NP_PLUGINSHUTDOWN)(); /** * A 5.0 wrapper for a 4.x style plugin. */ -class ns4xPlugin : public nsILiveConnectPlugin + +class ns4xPlugin : public nsIPlugin { public: - ns4xPlugin(NPPluginFuncs* callbacks, NP_PLUGINSHUTDOWN aShutdown); + ns4xPlugin(NPPluginFuncs* callbacks, NP_PLUGINSHUTDOWN aShutdown, nsISupports* browserInterfaces); ~ns4xPlugin(void); NS_DECL_ISUPPORTS @@ -73,8 +74,13 @@ public: //nsIPlugin interface +#ifndef NEW_PLUGIN_STREAM_API NS_IMETHOD Initialize(nsISupports* browserInterfaces); +#else + NS_IMETHOD + Initialize(void); +#endif NS_IMETHOD Shutdown(void); @@ -85,11 +91,6 @@ public: NS_IMETHOD GetValue(nsPluginVariable variable, void *value); - //nsILiveConnectPlugin interface - - NS_IMETHOD - GetJavaClass(jclass *resultingClass); - //////////////////////////////////////////////////////////////////// // ns4xPlugin-specific methods diff --git a/mozilla/modules/plugin/nglsrc/ns4xPluginInstance.cpp b/mozilla/modules/plugin/nglsrc/ns4xPluginInstance.cpp index d1dda69f096..0e40312b4f3 100644 --- a/mozilla/modules/plugin/nglsrc/ns4xPluginInstance.cpp +++ b/mozilla/modules/plugin/nglsrc/ns4xPluginInstance.cpp @@ -17,11 +17,257 @@ */ #include "ns4xPluginInstance.h" + +#ifdef NEW_PLUGIN_STREAM_API +#include "nsIPluginStreamListener.h" +#else #include "ns4xPluginStream.h" +#endif + #include "prlog.h" +//////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////// +#ifdef NEW_PLUGIN_STREAM_API + +class ns4xPluginStreamListener : public nsIPluginStreamListener { + +public: + + NS_DECL_ISUPPORTS + + //////////////////////////////////////////////////////////////////////////// + // from nsIPluginStreamListener: + + NS_IMETHOD + OnStartBinding(const char* url, nsIPluginStreamInfo* pluginInfo); + + NS_IMETHOD + OnDataAvailable(const char* url, nsIInputStream* input, + PRUint32 offset, PRUint32 length, nsIPluginStreamInfo* pluginInfo); + + NS_IMETHOD + OnFileAvailable(const char* url, const char* fileName); + + NS_IMETHOD + OnStopBinding(const char* url, nsresult status, nsIPluginStreamInfo* pluginInfo); + + NS_IMETHOD + GetStreamType(nsPluginStreamType *result); + + NS_IMETHOD + OnNotify(const char* url, nsresult status); + + //////////////////////////////////////////////////////////////////////////// + // ns4xPluginStreamListener specific methods: + + ns4xPluginStreamListener(nsIPluginInstance* inst, void* notifyData); + virtual ~ns4xPluginStreamListener(void); + +protected: + + void* mNotifyData; + ns4xPluginInstance* mInst; + NPStream mNPStream; + PRUint32 mPosition; + nsPluginStreamType mStreamType; +}; + +//////////////////////////////////////////////////////////////////////////////// +// ns4xPluginStreamListener Methods +//////////////////////////////////////////////////////////////////////////////// + +static NS_DEFINE_IID(kIPluginStreamListenerIID, NS_IPLUGINSTREAMLISTENER_IID); + +ns4xPluginStreamListener::ns4xPluginStreamListener(nsIPluginInstance* inst, void* notifyData) + : mNotifyData(notifyData) +{ + NS_INIT_REFCNT(); + mInst = (ns4xPluginInstance*) inst; + mPosition = 0; + + // Initialize the 4.x interface structure + memset(&mNPStream, 0, sizeof(mNPStream)); + + NS_IF_ADDREF(mInst); +} + +ns4xPluginStreamListener::~ns4xPluginStreamListener(void) +{ + NS_IF_RELEASE(mInst); +} + +NS_IMPL_ISUPPORTS(ns4xPluginStreamListener, kIPluginStreamListenerIID); + +NS_IMETHODIMP +ns4xPluginStreamListener::OnStartBinding(const char* url, nsIPluginStreamInfo* pluginInfo) +{ + NPP npp; + const NPPluginFuncs *callbacks; + PRBool seekable; + nsMIMEType contentType; + + + mNPStream.ndata = (void*) this; + mNPStream.url = url; + mNPStream.notifyData = mNotifyData; + + pluginInfo->GetLength((PRUint32*)&(mNPStream.end)); + pluginInfo->GetLastModified((PRUint32*)&(mNPStream.lastmodified)); + pluginInfo->IsSeekable(&seekable); + pluginInfo->GetContentType(&contentType); + + mInst->GetCallbacks(&callbacks); + mInst->GetNPP(&npp); + + nsresult error + = (nsresult)CallNPP_NewStreamProc(callbacks->newstream, + npp, + (char *)contentType, + &mNPStream, + seekable, + (PRUint16*)&mStreamType); + return NS_OK; +} + +NS_IMETHODIMP +ns4xPluginStreamListener::OnDataAvailable(const char* url, nsIInputStream* input, + PRUint32 offset, PRUint32 length, nsIPluginStreamInfo* pluginInfo) +{ + const NPPluginFuncs *callbacks; + NPP npp; + PRUint32 numtowrite = 0; + PRUint32 amountRead = 0; + PRInt32 writeCount = 0; + + mNPStream.url = url; + pluginInfo->GetLastModified((PRUint32*)&(mNPStream.lastmodified)); + + mInst->GetCallbacks(&callbacks); + mInst->GetNPP(&npp); + + if (callbacks->write == NULL) + return NS_OK; // XXX ? + + // Get the data from the input stream + char* buffer = new char[length]; + if (buffer) + input->Read(buffer, offset, length, &amountRead); + + // amountRead tells us how many bytes were put in the buffer + // WriteReady returns to us how many bytes the plugin is + // ready to handle - we have to keep calling WriteReady and + // Write until the buffer is empty + while (amountRead > 0) + { + if (callbacks->writeready != NULL) + { + numtowrite = CallNPP_WriteReadyProc(callbacks->writeready, + npp, + &mNPStream); + + if (numtowrite > amountRead) + numtowrite = amountRead; + } + else // if WriteReady is not supported by the plugin, just write the whole buffer + numtowrite = length; + + + writeCount = CallNPP_WriteProc(callbacks->write, + npp, + &mNPStream, + mPosition, + numtowrite, + (void *)buffer); + if(writeCount < 0) + return NS_ERROR_FAILURE; + + amountRead -= numtowrite; + mPosition += numtowrite; + } + + return NS_OK; +} + +NS_IMETHODIMP +ns4xPluginStreamListener::OnFileAvailable(const char* url, const char* fileName) +{ + const NPPluginFuncs *callbacks; + NPP npp; + + mNPStream.url = url; + + mInst->GetCallbacks(&callbacks); + mInst->GetNPP(&npp); + + if (callbacks->asfile == NULL) + return NS_OK; + + CallNPP_StreamAsFileProc(callbacks->asfile, + npp, + &mNPStream, + fileName); + + return NS_OK; +} + +NS_IMETHODIMP +ns4xPluginStreamListener::OnStopBinding(const char* url, nsresult status, nsIPluginStreamInfo* pluginInfo) +{ + const NPPluginFuncs *callbacks; + NPP npp; + + mNPStream.url = url; + pluginInfo->GetLastModified((PRUint32*)&(mNPStream.lastmodified)); + + mInst->GetCallbacks(&callbacks); + mInst->GetNPP(&npp); + + if (callbacks->destroystream != NULL) + { + CallNPP_DestroyStreamProc(callbacks->destroystream, + npp, + &mNPStream, + nsPluginReason_Done); + } + + return NS_OK; +} + +NS_IMETHODIMP +ns4xPluginStreamListener::GetStreamType(nsPluginStreamType *result) +{ + *result = mStreamType; + return NS_OK; +} + +NS_IMETHODIMP +ns4xPluginStreamListener::OnNotify(const char* url, nsresult status) +{ + const NPPluginFuncs *callbacks; + NPP npp; + + mNPStream.url = url; + + mInst->GetCallbacks(&callbacks); + mInst->GetNPP(&npp); + + // check to see if we have a call back + if (callbacks->urlnotify != NULL && mNotifyData != nsnull) + { + CallNPP_URLNotifyProc(callbacks->urlnotify, + npp, + url, + nsPluginReason_Done, + mNotifyData); + } + + return NS_OK; +} + +#endif ns4xPluginInstance :: ns4xPluginInstance(NPPluginFuncs* callbacks) : fCallbacks(callbacks) @@ -205,6 +451,34 @@ NS_IMETHODIMP ns4xPluginInstance::SetWindow(nsPluginWindow* window) return error; } +#ifdef NEW_PLUGIN_STREAM_API + +/* NOTE: the caller must free the stream listener */ + +NS_IMETHODIMP ns4xPluginInstance::NewStream(nsIPluginStreamListener** listener) +{ + nsISupports* stream = nsnull; + stream = (nsISupports *)(nsIPluginStreamListener *)new ns4xPluginStreamListener(this, nsnull); + + if(stream == nsnull) + return NS_ERROR_OUT_OF_MEMORY; + + nsresult res = stream->QueryInterface(kIPluginStreamListenerIID, (void**)listener); + + // If we didn't get the right interface, clean up + if (res != NS_OK) + delete stream; + + return res; +} + +nsresult ns4xPluginInstance::NewNotifyStream(nsIPluginStreamListener** listener, void* notifyData) +{ + *listener = new ns4xPluginStreamListener(this, notifyData); + return NS_OK; +} + +#else NS_IMETHODIMP ns4xPluginInstance::NewStream(nsIPluginStreamPeer* peer, nsIPluginStream* *result) { (*result) = NULL; @@ -229,6 +503,7 @@ NS_IMETHODIMP ns4xPluginInstance::NewStream(nsIPluginStreamPeer* peer, nsIPlugin (*result) = stream; return NS_OK; } +#endif NS_IMETHODIMP ns4xPluginInstance::Print(nsPluginPrint* platformPrint) { @@ -244,6 +519,7 @@ printf("instance handleevent called\n"); return NS_OK; } +#ifndef NEW_PLUGIN_STREAM_API NS_IMETHODIMP ns4xPluginInstance::URLNotify(const char* url, const char* target, nsPluginReason reason, void* notifyData) { @@ -258,6 +534,7 @@ NS_IMETHODIMP ns4xPluginInstance::URLNotify(const char* url, const char* target, return NS_OK; //XXX this seems bad... } +#endif NS_IMETHODIMP ns4xPluginInstance :: GetValue(nsPluginInstanceVariable variable, void *value) { @@ -280,15 +557,34 @@ NS_IMETHODIMP ns4xPluginInstance :: GetValue(nsPluginInstanceVariable variable, return rv; } -NS_IMETHODIMP ns4xPluginInstance :: SetWindowless(PRBool aWindowless) +nsresult ns4xPluginInstance::GetNPP(NPP* aNPP) +{ + if(aNPP != nsnull) + *aNPP = &fNPP; + else + return NS_ERROR_NULL_POINTER; + + return NS_OK; +} + +nsresult ns4xPluginInstance::GetCallbacks(const NPPluginFuncs ** aCallbacks) +{ + if(aCallbacks != nsnull) + *aCallbacks = fCallbacks; + else + return NS_ERROR_NULL_POINTER; + + return NS_OK; +} + +nsresult ns4xPluginInstance :: SetWindowless(PRBool aWindowless) { mWindowless = aWindowless; return NS_OK; } -NS_IMETHODIMP ns4xPluginInstance :: SetTransparent(PRBool aTransparent) +nsresult ns4xPluginInstance :: SetTransparent(PRBool aTransparent) { mTransparent = aTransparent; return NS_OK; } - diff --git a/mozilla/modules/plugin/nglsrc/ns4xPluginInstance.h b/mozilla/modules/plugin/nglsrc/ns4xPluginInstance.h index 4c0a8270534..f1b1c1ff39a 100644 --- a/mozilla/modules/plugin/nglsrc/ns4xPluginInstance.h +++ b/mozilla/modules/plugin/nglsrc/ns4xPluginInstance.h @@ -32,15 +32,6 @@ 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 //////////////////////////////////////////////////////////////////////// @@ -70,50 +61,62 @@ public: NS_IMETHOD SetWindow(nsPluginWindow* window); +#ifdef NEW_PLUGIN_STREAM_API NS_IMETHOD + NewStream(nsIPluginStreamListener** listener); +#else + NS_IMETHOD NewStream(nsIPluginStreamPeer* peer, nsIPluginStream* *result); +#endif NS_IMETHOD Print(nsPluginPrint* platformPrint); - NS_IMETHOD - HandleEvent(nsPluginEvent* event, PRBool* handled); - +#ifndef NEW_PLUGIN_STREAM_API NS_IMETHOD URLNotify(const char* url, const char* target, nsPluginReason reason, void* notifyData); +#endif NS_IMETHOD GetValue(nsPluginInstanceVariable variable, void *value); - //////////////////////////////////////////////////////////////////////// + NS_IMETHOD + HandleEvent(nsPluginEvent* event, PRBool* handled); + + //////////////////////////////////////////////////////////////////////// // ns4xPluginInstance-specific methods - /** * Return the 4.x-style interface object. */ - NS_IMETHOD - GetNPP(NPP * aNPP) { - *aNPP = &fNPP; - return NS_OK; - }; + nsresult + GetNPP(NPP * aNPP); /** * Return the callbacks for the plugin instance. */ - NS_IMETHOD - GetCallbacks(const NPPluginFuncs ** aCallbacks) { - *aCallbacks = fCallbacks; - return NS_OK; - }; + nsresult + GetCallbacks(const NPPluginFuncs ** aCallbacks); - NS_IMETHOD + nsresult SetWindowless(PRBool aWindowless); - NS_IMETHOD + nsresult SetTransparent(PRBool aTransparent); + nsresult + NewNotifyStream(nsIPluginStreamListener** listener, void* notifyData); + + /** + * Construct a new 4.x plugin instance with the specified peer + * and callbacks. + */ + ns4xPluginInstance(NPPluginFuncs* callbacks); + + // Use Release() to destroy this + ~ns4xPluginInstance(void); + protected: /** diff --git a/mozilla/modules/plugin/nglsrc/nsIPluginHost.h b/mozilla/modules/plugin/nglsrc/nsIPluginHost.h index f169f620fa3..25502d70c92 100644 --- a/mozilla/modules/plugin/nglsrc/nsIPluginHost.h +++ b/mozilla/modules/plugin/nglsrc/nsIPluginHost.h @@ -46,22 +46,14 @@ public: LoadPlugins(void) = 0; NS_IMETHOD - InstantiatePlugin(const char *aMimeType, nsIURL *aURL, nsIPluginInstanceOwner *aOwner) = 0; + InstantiateEmbededPlugin(const char *aMimeType, nsString& aURLSpec, nsIPluginInstanceOwner *aOwner) = 0; NS_IMETHOD - InstantiatePlugin(const char *aMimeType, nsString& aURLSpec, nsIPluginInstanceOwner *aOwner) = 0; + InstantiateFullPagePlugin(const char *aMimeType, nsString& aURLSpec, nsIStreamListener *&aStreamListener, nsIPluginInstanceOwner *aOwner) = 0; NS_IMETHOD - InstantiatePlugin(const char *aMimeType, nsString& aURLSpec, nsIStreamListener *&aStreamListener, nsIPluginInstanceOwner *aOwner) = 0; + SetUpPluginInstance(const char *aMimeType, nsIURL *aURL, nsIPluginInstanceOwner *aOwner) = 0; - NS_IMETHOD - NewPluginStream(const nsString& aURL, nsIPluginInstance *aInstance, void *aNotifyData) = 0; - - NS_IMETHOD - NewPluginStream(const nsString& aURL, nsIPluginInstanceOwner *aOwner, void *aNotifyData) = 0; - - NS_IMETHOD - NewPluginStream(nsIStreamListener *&aStreamListener, nsIPluginInstance *aInstance, void *aNotifyData) = 0; }; -#endif +#endif // nsIPluginHost_h___ diff --git a/mozilla/modules/plugin/nglsrc/nsPluginInstancePeer.cpp b/mozilla/modules/plugin/nglsrc/nsPluginInstancePeer.cpp index a53deadef4f..283bec60676 100644 --- a/mozilla/modules/plugin/nglsrc/nsPluginInstancePeer.cpp +++ b/mozilla/modules/plugin/nglsrc/nsPluginInstancePeer.cpp @@ -25,6 +25,11 @@ #include "prprf.h" #include "nsIOutputStream.h" +#ifdef XP_PC +#include "windows.h" +#include "winbase.h" +#endif + nsPluginInstancePeerImpl :: nsPluginInstancePeerImpl() { NS_INIT_REFCNT(); @@ -755,7 +760,7 @@ printf("instance peer setwindowsize called\n"); nsresult nsPluginInstancePeerImpl :: Initialize(nsIPluginInstanceOwner *aOwner, const nsMIMEType aMIMEType) { - //don't add a ref to precent circular references... MMP + //don't add a ref to prevent circular references... MMP mOwner = aOwner; aOwner->GetInstance(mInstance); @@ -784,3 +789,19 @@ nsresult nsPluginInstancePeerImpl :: GetOwner(nsIPluginInstanceOwner *&aOwner) return NS_ERROR_FAILURE; } + +NS_IMETHODIMP nsPluginInstancePeerImpl::InvalidateRect(nsPluginRect *invalidRect) +{ + return NS_OK; +} + +NS_IMETHODIMP nsPluginInstancePeerImpl::InvalidateRegion(nsPluginRegion invalidRegion) +{ + return NS_OK; +} + +NS_IMETHODIMP nsPluginInstancePeerImpl::ForceRedraw(void) +{ + return NS_OK; +} + diff --git a/mozilla/modules/plugin/nglsrc/nsPluginInstancePeer.h b/mozilla/modules/plugin/nglsrc/nsPluginInstancePeer.h index 4205cf9ffc9..785d1aab6a8 100644 --- a/mozilla/modules/plugin/nglsrc/nsPluginInstancePeer.h +++ b/mozilla/modules/plugin/nglsrc/nsPluginInstancePeer.h @@ -20,14 +20,17 @@ #define nsPluginInstancePeer_h___ #include "nsIPluginInstancePeer.h" +#include "nsIWindowlessPlugInstPeer.h" #include "nsIPluginTagInfo.h" #include "nsIPluginInstanceOwner.h" #include "nsIJVMPluginTagInfo.h" class nsPluginInstancePeerImpl : public nsIPluginInstancePeer, + public nsIWindowlessPluginInstancePeer, public nsIPluginTagInfo2, public nsIJVMPluginTagInfo + { public: nsPluginInstancePeerImpl(); @@ -55,6 +58,23 @@ public: NS_IMETHOD SetWindowSize(PRUint32 width, PRUint32 height); + // nsIWindowlessPluginInstancePeer + + // (Corresponds to NPN_InvalidateRect.) + NS_IMETHOD + InvalidateRect(nsPluginRect *invalidRect); + + // (Corresponds to NPN_InvalidateRegion.) + NS_IMETHOD + InvalidateRegion(nsPluginRegion invalidRegion); + + // (Corresponds to NPN_ForceRedraw.) + NS_IMETHOD + ForceRedraw(void); + + /* The tag info interfaces all pass through calls to the + nsPluginInstanceOwner (see nsObjectFrame.cpp) */ + //nsIPluginTagInfo interface NS_IMETHOD diff --git a/mozilla/modules/plugin/nglsrc/nsPluginStreamPeer.cpp b/mozilla/modules/plugin/nglsrc/nsPluginStreamPeer.cpp index 9d805136c1f..0513181539c 100644 --- a/mozilla/modules/plugin/nglsrc/nsPluginStreamPeer.cpp +++ b/mozilla/modules/plugin/nglsrc/nsPluginStreamPeer.cpp @@ -167,3 +167,5 @@ nsresult nsPluginStreamPeer :: SetReason(nsPluginReason aReason) mReason = aReason; return NS_OK; } + +// eof \ No newline at end of file diff --git a/mozilla/modules/plugin/public/nsIPlugin.h b/mozilla/modules/plugin/public/nsIPlugin.h index 9811adfeb60..036a6c4ee48 100644 --- a/mozilla/modules/plugin/public/nsIPlugin.h +++ b/mozilla/modules/plugin/public/nsIPlugin.h @@ -67,7 +67,7 @@ public: * @result - NS_OK if this operation was successful */ NS_IMETHOD - Initialize(nsISupports* browserInterfaces) = 0; + Initialize() = 0; /** * Called when the browser is done with the plugin factory, or when diff --git a/mozilla/modules/plugin/public/nsIPluginInstance.h b/mozilla/modules/plugin/public/nsIPluginInstance.h index 2d27139a05f..314c64a0e62 100644 --- a/mozilla/modules/plugin/public/nsIPluginInstance.h +++ b/mozilla/modules/plugin/public/nsIPluginInstance.h @@ -37,6 +37,10 @@ #include "nsplugindefs.h" #include "nsIEventHandler.h" +#ifdef NEW_PLUGIN_STREAM_API +#include "nsIPluginStreamListener.h" +#endif + //////////////////////////////////////////////////////////////////////////////// // Plugin Instance Interface @@ -67,7 +71,8 @@ public: * @param peer - the corresponding plugin instance peer * @result - NS_OK if this operation was successful */ - NS_IMETHOD + + NS_IMETHOD Initialize(nsIPluginInstancePeer* peer) = 0; /** @@ -126,7 +131,19 @@ public: NS_IMETHOD SetWindow(nsPluginWindow* window) = 0; -#ifndef NEW_PLUGIN_STREAM_API +#ifdef NEW_PLUGIN_STREAM_API + /** + * Called to tell the plugin that the initial src/data stream is + * ready. Expects the plugin to return a nsIPluginStreamListener. + * + * (Corresponds to NPP_NewStream.) + * + * @param listener - listener the browser will use to give the plugin the data + * @result - NS_OK if this operation was successful + */ + NS_IMETHOD + NewStream(nsIPluginStreamListener** listener) = 0; +#else /** * Called when a new plugin stream must be constructed in order for the plugin * instance to receive a stream of data from the browser. diff --git a/mozilla/modules/plugin/public/nsIPluginStreamListener.h b/mozilla/modules/plugin/public/nsIPluginStreamListener.h index 215fab00d83..8e22c7a4637 100644 --- a/mozilla/modules/plugin/public/nsIPluginStreamListener.h +++ b/mozilla/modules/plugin/public/nsIPluginStreamListener.h @@ -36,14 +36,8 @@ #include "nsplugindefs.h" #include "nsISupports.h" - -class nsIPluginInputStream; - -struct nsPluginStreamInfo { - nsMIMEType contentType; - PRBool seekable; - // more... -}; +#include "nsIPluginStreamInfo.h" +#include "nsIInputStream.h" /** * The nsIPluginStreamListener interface defines the minimum set of functionality that @@ -62,7 +56,7 @@ public: * used to cancel the URL load.. */ NS_IMETHOD - OnStartBinding(const char* url, const nsPluginStreamInfo* info) = 0; + OnStartBinding(const char* url, nsIPluginStreamInfo* pluginInfo) = 0; /** * Notify the client that data is available in the input stream. This @@ -75,12 +69,11 @@ public: * @return The return value is currently ignored. */ NS_IMETHOD - OnDataAvailable(const char* url, nsIPluginInputStream* input, - PRUint32 offset, PRUint32 length) = 0; + OnDataAvailable(const char* url, nsIInputStream* input, + PRUint32 offset, PRUint32 length, nsIPluginStreamInfo* pluginInfo) = 0; NS_IMETHOD OnFileAvailable(const char* url, const char* fileName) = 0; - /** * Notify the observer that the URL has finished loading. This method is * called once when the networking library has finished processing the @@ -93,8 +86,13 @@ public: * @return The return value is currently ignored. */ NS_IMETHOD - OnStopBinding(const char* url, nsresult status) = 0; + OnStopBinding(const char* url, nsresult status, nsIPluginStreamInfo* pluginInfo) = 0; + NS_IMETHOD + OnNotify(const char* url, nsresult status) = 0; + + NS_IMETHOD + GetStreamType(nsPluginStreamType *result) = 0; }; #define NS_IPLUGINSTREAMLISTENER_IID \ diff --git a/mozilla/modules/plugin/public/nsplugindefs.h b/mozilla/modules/plugin/public/nsplugindefs.h index d807841e1c6..5a0a76d76f5 100644 --- a/mozilla/modules/plugin/public/nsplugindefs.h +++ b/mozilla/modules/plugin/public/nsplugindefs.h @@ -34,6 +34,8 @@ #ifndef nsplugindefs_h___ #define nsplugindefs_h___ +#define NEW_PLUGIN_STREAM_API + #ifndef prtypes_h___ #include "prtypes.h" #endif