235 lines
6.3 KiB
C++
235 lines
6.3 KiB
C++
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
|
*
|
|
* The contents of this file are subject to the Netscape Public License
|
|
* Version 1.0 (the "NPL"); you may not use this file except in
|
|
* compliance with the NPL. You may obtain a copy of the NPL at
|
|
* http://www.mozilla.org/NPL/
|
|
*
|
|
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
|
* for the specific language governing rights and limitations under the
|
|
* NPL.
|
|
*
|
|
* The Initial Developer of this code under the NPL is Netscape
|
|
* Communications Corporation. Portions created by Netscape are
|
|
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
|
* Reserved.
|
|
*/
|
|
|
|
#include "nsPluginInstancePeer.h"
|
|
#include "nsPluginTagInfo.h"
|
|
#include "nsPluginManagerStream.h"
|
|
#include "nsIPluginInstance.h"
|
|
|
|
static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID);
|
|
static NS_DEFINE_IID(kPluginInstancePeerCID, NS_PLUGININSTANCEPEER_CID);
|
|
static NS_DEFINE_IID(kIPluginInstancePeerIID, NS_IPLUGININSTANCEPEER_IID);
|
|
static NS_DEFINE_IID(kILiveConnectPluginInstancePeerIID, NS_ILIVECONNECTPLUGININSTANCEPEER_IID);
|
|
static NS_DEFINE_IID(kIWindowlessPluginInstancePeerIID, NS_IWINDOWLESSPLUGININSTANCEPEER_IID);
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
// Plugin Instance Peer Interface
|
|
|
|
nsPluginInstancePeer::nsPluginInstancePeer(NPP npp)
|
|
: fNPP(npp), fPluginInst(NULL), fTagInfo(NULL)
|
|
{
|
|
// NS_INIT_AGGREGATED(NULL);
|
|
NS_INIT_REFCNT();
|
|
fTagInfo = new nsPluginTagInfo(npp);
|
|
fTagInfo->AddRef();
|
|
}
|
|
|
|
nsPluginInstancePeer::~nsPluginInstancePeer(void)
|
|
{
|
|
if (fTagInfo != NULL) {
|
|
fTagInfo->Release();
|
|
fTagInfo = NULL;
|
|
}
|
|
}
|
|
|
|
NS_IMPL_ADDREF(nsPluginInstancePeer);
|
|
NS_IMPL_RELEASE(nsPluginInstancePeer);
|
|
|
|
NS_METHOD
|
|
nsPluginInstancePeer::QueryInterface(const nsIID& aIID, void** aInstancePtr)
|
|
{
|
|
if (NULL == aInstancePtr) {
|
|
return NS_ERROR_NULL_POINTER;
|
|
}
|
|
if (aIID.Equals(kIPluginInstancePeerIID) ||
|
|
aIID.Equals(kPluginInstancePeerCID) ||
|
|
aIID.Equals(kISupportsIID)) {
|
|
// *aInstancePtr = (void*) (nsISupports*) (nsIPluginInstancePeer*)this;
|
|
*aInstancePtr = (nsIPluginInstancePeer*) this;
|
|
AddRef();
|
|
return NS_OK;
|
|
}
|
|
// beard: check for interfaces that aren't on the left edge of the inheritance graph.
|
|
// this is required so that the proper offsets are applied to this, and so the proper
|
|
// vtable is used.
|
|
if (aIID.Equals(kILiveConnectPluginInstancePeerIID)) {
|
|
*aInstancePtr = (nsILiveConnectPluginInstancePeer*) this;
|
|
AddRef();
|
|
return NS_OK;
|
|
}
|
|
if (aIID.Equals(kIWindowlessPluginInstancePeerIID)) {
|
|
*aInstancePtr = (nsIWindowlessPluginInstancePeer*) this;
|
|
AddRef();
|
|
return NS_OK;
|
|
}
|
|
return fTagInfo->QueryInterface(aIID, aInstancePtr);
|
|
}
|
|
|
|
NS_METHOD
|
|
nsPluginInstancePeer::GetValue(nsPluginInstancePeerVariable variable, void *value)
|
|
{
|
|
NPError err = npn_getvalue(fNPP, (NPNVariable)variable, value);
|
|
return fromNPError[err];
|
|
}
|
|
|
|
#if 0
|
|
NS_METHOD
|
|
nsPluginInstancePeer::SetValue(nsPluginInstancePeerVariable variable, void *value)
|
|
{
|
|
NPError err = npn_setvalue(fNPP, (NPPVariable)variable, value);
|
|
return fromNPError[err];
|
|
}
|
|
#endif
|
|
|
|
NS_METHOD
|
|
nsPluginInstancePeer::GetMIMEType(nsMIMEType *result)
|
|
{
|
|
np_instance* instance = (np_instance*)fNPP->ndata;
|
|
*result = instance->typeString;
|
|
return NS_OK;
|
|
}
|
|
|
|
NS_METHOD
|
|
nsPluginInstancePeer::GetMode(nsPluginMode *result)
|
|
{
|
|
np_instance* instance = (np_instance*)fNPP->ndata;
|
|
*result = (nsPluginMode)instance->type;
|
|
return NS_OK;
|
|
}
|
|
|
|
NS_METHOD
|
|
nsPluginInstancePeer::NewStream(nsMIMEType type, const char* target, nsIOutputStream* *result)
|
|
{
|
|
NPStream* pstream;
|
|
NPError err = npn_newstream(fNPP, (char*)type, (char*)target, &pstream);
|
|
if (err != NPERR_NO_ERROR)
|
|
return err;
|
|
*result = new nsPluginManagerStream(fNPP, pstream);
|
|
return NS_OK;
|
|
}
|
|
|
|
NS_METHOD
|
|
nsPluginInstancePeer::ShowStatus(const char* message)
|
|
{
|
|
npn_status(fNPP, message);
|
|
return NS_OK;
|
|
}
|
|
|
|
NS_METHOD
|
|
nsPluginInstancePeer::SetWindowSize(PRUint32 width, PRUint32 height)
|
|
{
|
|
NPError err;
|
|
NPSize size;
|
|
size.width = width;
|
|
size.height = height;
|
|
err = npn_SetWindowSize((np_instance*)fNPP->ndata, &size);
|
|
return fromNPError[err];
|
|
}
|
|
|
|
NS_METHOD
|
|
nsPluginInstancePeer::InvalidateRect(nsPluginRect *invalidRect)
|
|
{
|
|
npn_invalidaterect(fNPP, (NPRect*)invalidRect);
|
|
return NS_OK;
|
|
}
|
|
|
|
NS_METHOD
|
|
nsPluginInstancePeer::InvalidateRegion(nsPluginRegion invalidRegion)
|
|
{
|
|
npn_invalidateregion(fNPP, invalidRegion);
|
|
return NS_OK;
|
|
}
|
|
|
|
NS_METHOD
|
|
nsPluginInstancePeer::ForceRedraw(void)
|
|
{
|
|
npn_forceredraw(fNPP);
|
|
return NS_OK;
|
|
}
|
|
|
|
NS_METHOD
|
|
nsPluginInstancePeer::GetJavaPeer(jref *peer)
|
|
{
|
|
*peer = npn_getJavaPeer(fNPP);
|
|
return NS_OK;
|
|
}
|
|
|
|
void nsPluginInstancePeer::SetPluginInstance(nsIPluginInstance* inst)
|
|
{
|
|
// We're now maintaining our reference to plugin instance in the
|
|
// npp->ndata->sdata (saved data) field, and we access the peer
|
|
// from there. This method should be totally unnecessary.
|
|
#if 0
|
|
if (fPluginInst != NULL) {
|
|
fPluginInst->Release();
|
|
}
|
|
#endif
|
|
fPluginInst = inst;
|
|
#if 0
|
|
if (fPluginInst != NULL) {
|
|
fPluginInst->AddRef();
|
|
}
|
|
#endif
|
|
}
|
|
|
|
nsIPluginInstance* nsPluginInstancePeer::GetPluginInstance(void)
|
|
{
|
|
if (fPluginInst != NULL) {
|
|
fPluginInst->AddRef();
|
|
return fPluginInst;
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
NPP
|
|
nsPluginInstancePeer::GetNPP(void)
|
|
{
|
|
return fNPP;
|
|
}
|
|
|
|
JSContext *
|
|
nsPluginInstancePeer::GetJSContext(void)
|
|
{
|
|
MWContext *pMWCX = GetMWContext();
|
|
JSContext *pJSCX = NULL;
|
|
if (!pMWCX || (pMWCX->type != MWContextBrowser && pMWCX->type != MWContextPane))
|
|
{
|
|
return 0;
|
|
}
|
|
if( pMWCX->mocha_context != NULL)
|
|
{
|
|
pJSCX = pMWCX->mocha_context;
|
|
}
|
|
else
|
|
{
|
|
pJSCX = LM_GetCrippledContext();
|
|
}
|
|
return pJSCX;
|
|
}
|
|
|
|
MWContext *
|
|
nsPluginInstancePeer::GetMWContext(void)
|
|
{
|
|
np_instance* instance = (np_instance*) fNPP->ndata;
|
|
MWContext *pMWCX = instance->cx;
|
|
|
|
return pMWCX;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|