diff --git a/mozilla/modules/plugin/base/public/nsILegacyPluginWrapperOS2.idl b/mozilla/modules/plugin/base/public/nsILegacyPluginWrapperOS2.idl new file mode 100644 index 00000000000..14e52785c89 --- /dev/null +++ b/mozilla/modules/plugin/base/public/nsILegacyPluginWrapperOS2.idl @@ -0,0 +1,87 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is the Mozilla.org code. + * + * The Initial Developer of the Original Code is + * InnoTek Systemberatung GmbH. + * Portions created by the Initial Developer are Copyright (C) 2003 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * InnoTek Systemberatung GmbH / Knut St. Osmundsen + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +#include "nsISupports.idl" +#include "nspluginroot.idl" + +%{C++ +#include "nsplugindefs.h" + +// {7c4f689b-8c2a-11d7-911e-0003ffba5169} +#define NS_LEGACY_PLUGIN_WRAPPER_CID \ +{ 0x7c4f689b, 0x8c2a, 0x11d7, { 0x91, 0x1e, 0x00, 0x03, 0xff, 0xba, 0x51, 0x69 } } + +#define NS_LEGACY_PLUGIN_WRAPPER_CONTRACTID "@mozilla.org/plugin/legacypluginwrapper;1" + +struct PRLibrary; +%} + +interface nsIServiceManagerObsolete; +interface nsIPlugin; + +[ptr] native PRLibraryPtr(PRLibrary); + +[uuid(7c4f689b-8c2a-11d7-911e-0003ffba5169)] +interface nsILegacyPluginWrapperOS2 : nsISupports +{ + /** + * PR_FindSymbol(,"NSGetFactory") + NSGetFactory(). + */ + void getFactory(in nsIServiceManagerObsolete aServMgr, + in REFNSIID aClass, + in string aClassName, + in string aContractID, + in PRLibraryPtr aLibrary, + out nsIPlugin aResult); + + /** + * Create a wrapper for the given interface if it's a legacy interface. + * @returns NS_OK on success. + * @returns NS_ERROR_NO_INTERFACE if aIID isn't supported. aOut is nsnull. + * @returns NS_ERROR_FAILURE on other error. aOut undefined. + * @param aIID Interface Identifier of aIn and aOut. + * @param aIn Interface of type aIID which may be a legacy interface + * requiring a wrapper. + * @param aOut The native interface. + * If aIn is a legacy interface, this will be a wrappre. + * If aIn is not a legacy interface, this is aIn. + * @remark Typically used for the flash plugin. + */ + void maybeWrap(in REFNSIID aIID, in nsISupports aIn, out nsISupports aOut); +}; + diff --git a/mozilla/modules/plugin/base/src/Makefile.in b/mozilla/modules/plugin/base/src/Makefile.in index ce5638aa8cc..fc6b9aeccb8 100644 --- a/mozilla/modules/plugin/base/src/Makefile.in +++ b/mozilla/modules/plugin/base/src/Makefile.in @@ -118,6 +118,10 @@ ifneq (,$(filter mac cocoa,$(MOZ_WIDGET_TOOLKIT))) EXTRA_DSO_LDOPTS += $(TK_LIBS) endif +ifeq ($(OS_ARCH),OS2) +XPIDLSRCS += nsILegacyPluginWrapperOS2.idl +endif + include $(topsrcdir)/config/rules.mk ifeq ($(OS_ARCH),WINNT) diff --git a/mozilla/modules/plugin/base/src/ns4xPluginInstance.cpp b/mozilla/modules/plugin/base/src/ns4xPluginInstance.cpp index cee50036b11..041d6748688 100644 --- a/mozilla/modules/plugin/base/src/ns4xPluginInstance.cpp +++ b/mozilla/modules/plugin/base/src/ns4xPluginInstance.cpp @@ -49,6 +49,10 @@ #include "nsIPref.h" // needed for NS_TRY_SAFE_CALL_* #include "nsPluginLogging.h" +#ifdef XP_OS2 +#include "nsILegacyPluginWrapperOS2.h" +#endif + #ifdef MOZ_WIDGET_GTK #include #include @@ -1187,6 +1191,24 @@ nsresult ns4xPluginInstance::GetValueInternal(NPPVariable variable, void* value) NPP_PLUGIN_LOG(PLUGIN_LOG_NORMAL, ("NPP GetValue called: this=%p, npp=%p, var=%d, value=%d, return=%d\n", this, &fNPP, variable, value, res)); + +#ifdef XP_OS2 + /* Query interface for legacy Flash plugin */ + if (res == NS_OK && variable == NPPVpluginScriptableInstance) + { + nsCOMPtr wrapper = + do_GetService(NS_LEGACY_PLUGIN_WRAPPER_CONTRACTID, &res); + if (res == NS_OK) + { + nsIID *iid = nsnull; + res = CallNPP_GetValueProc(fCallbacks->getvalue, &fNPP, + NPPVpluginScriptableIID, (void *)&iid); + if (res == NS_OK) + res = wrapper->MaybeWrap(*iid, *(nsISupports**)value, + (nsISupports**)value); + } + } +#endif } return res; diff --git a/mozilla/modules/plugin/base/src/nsPluginHostImpl.cpp b/mozilla/modules/plugin/base/src/nsPluginHostImpl.cpp index 097b2c68b2e..dc60da9120f 100644 --- a/mozilla/modules/plugin/base/src/nsPluginHostImpl.cpp +++ b/mozilla/modules/plugin/base/src/nsPluginHostImpl.cpp @@ -177,6 +177,10 @@ #endif #endif +#ifdef XP_OS2 +#include "nsILegacyPluginWrapperOS2.h" +#endif + // this is the name of the directory which will be created // to cache temporary files. #define kPluginTmpDirName NS_LITERAL_CSTRING("plugtmp") @@ -4569,7 +4573,11 @@ NS_IMETHODIMP nsPluginHostImpl::GetPluginFactory(const char *aMimeType, nsIPlugi // need to get the plugin factory from this plugin. nsFactoryProc nsGetFactory = nsnull; +#ifdef XP_OS2 + nsGetFactory = (nsFactoryProc) PR_FindSymbol(pluginTag->mLibrary, "_NSGetFactory"); +#else nsGetFactory = (nsFactoryProc) PR_FindSymbol(pluginTag->mLibrary, "NSGetFactory"); +#endif if(nsGetFactory != nsnull && IsCompatibleExecutable(pluginTag->mFullPath)) { // XPCOM-style plugins (or at least the OJI one) cause crashes on @@ -4582,6 +4590,25 @@ NS_IMETHODIMP nsPluginHostImpl::GetPluginFactory(const char *aMimeType, nsIPlugi plugin->Initialize(); #endif } +#ifdef XP_OS2 + // on OS2, first check if this might be legacy XPCOM module. + else if (PR_FindSymbol(pluginTag->mLibrary, "NSGetFactory") && + IsCompatibleExecutable(pluginTag->mFullPath)) + { + // Possibly a legacy XPCOM module. We'll need to create a calling + // vtable/calling convention wrapper for it. + nsCOMPtr wrapper = + do_GetService(NS_LEGACY_PLUGIN_WRAPPER_CONTRACTID, &rv); + if (NS_SUCCEEDED(rv)) + { + rv = wrapper->GetFactory(serviceManager, kPluginCID, nsnull, nsnull, + pluginTag->mLibrary, &pluginTag->mEntryPoint); + plugin = pluginTag->mEntryPoint; + if (plugin != NULL) + plugin->Initialize(); + } + } +#endif else { // Now lets try to get the entry point from a 4.x plugin