git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@27429 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
279 lines
6.8 KiB
C++
279 lines
6.8 KiB
C++
/*
|
|
* File: NPApp.cc
|
|
* Purpose: wxPluginApp implementation
|
|
* Author: Julian Smart
|
|
* Created: 1997
|
|
* Updated:
|
|
* Copyright: (c) Julian Smart
|
|
*/
|
|
|
|
// For compilers that support precompilation, includes "wx/wx.h".
|
|
#include "wx/wxprec.h"
|
|
|
|
#ifdef __BORLANDC__
|
|
#pragma hdrstop
|
|
#endif
|
|
|
|
#include "NPApp.h"
|
|
#include "NPFrame.h"
|
|
|
|
#include <windows.h>
|
|
|
|
IMPLEMENT_ABSTRACT_CLASS(wxPluginApp, wxApp)
|
|
|
|
wxPluginApp *wxGetPluginApp(void)
|
|
{
|
|
if ( wxTheApp && wxTheApp->IsKindOf(CLASSINFO(wxPluginApp)))
|
|
return (wxPluginApp *)wxTheApp;
|
|
else
|
|
return NULL;
|
|
}
|
|
|
|
wxPluginApp::wxPluginApp(void)
|
|
{
|
|
m_data.m_argc = NULL;
|
|
m_data.m_argn = NULL;
|
|
m_data.m_argv = NULL;
|
|
m_data.m_type = 0;
|
|
m_data.m_instance = 0;
|
|
m_data.m_mode = 0;
|
|
m_data.m_window = 0;
|
|
}
|
|
|
|
wxPluginApp::~wxPluginApp(void)
|
|
{
|
|
if ( m_data.m_argn )
|
|
delete[] m_data.m_argn;
|
|
if ( m_data.m_argv )
|
|
delete[] m_data.m_argv;
|
|
}
|
|
|
|
// Add a frame
|
|
void wxPluginApp::AddFrame(wxPluginFrame *frame)
|
|
{
|
|
m_frames.Append(frame);
|
|
}
|
|
|
|
// Remove a frame
|
|
void wxPluginApp::RemoveFrame(wxPluginFrame *frame)
|
|
{
|
|
m_frames.DeleteObject(frame);
|
|
}
|
|
|
|
// Find a frame given a NP instance
|
|
wxPluginFrame *wxPluginApp::FindFrame(NPP instance)
|
|
{
|
|
wxNode *node = m_frames.First();
|
|
while ( node )
|
|
{
|
|
wxPluginFrame *frame = (wxPluginFrame *)node->Data();
|
|
if ( frame->GetInstance() == instance )
|
|
{
|
|
return frame;
|
|
}
|
|
node = node->Next();
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
void wxPluginApp::SetAttributeValues(const int n, char *argn[], char *argv[])
|
|
{
|
|
if ( m_data.m_argn )
|
|
delete[] m_data.m_argn;
|
|
if ( m_data.m_argv )
|
|
delete[] m_data.m_argv;
|
|
|
|
m_data.m_argc = n;
|
|
|
|
m_data.m_argn = new wxString[n];
|
|
m_data.m_argv = new wxString[n];
|
|
int i;
|
|
for ( i = 0; i < n ; i ++)
|
|
{
|
|
m_data.m_argn[i] = argn[i];
|
|
m_data.m_argv[i] = argv[i];
|
|
}
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////
|
|
// Netscape Plugin API calls routed via wxPluginApp
|
|
|
|
NPError wxPluginApp::NPP_Destroy(NPP instance, NPSavedData** save)
|
|
{
|
|
wxPluginFrame *frame = FindFrame(instance);
|
|
if ( frame )
|
|
{
|
|
frame->Close();
|
|
}
|
|
return NPERR_NO_ERROR;
|
|
}
|
|
|
|
NPError wxPluginApp::NPP_DestroyStream(NPP instance, NPStream* stream, NPError reason)
|
|
{
|
|
return NPERR_NO_ERROR;
|
|
}
|
|
|
|
/*
|
|
jref wxPluginApp::NPP_GetJavaClass(void)
|
|
{
|
|
return 0;
|
|
}
|
|
*/
|
|
|
|
// This can't work now because we don't have a global app until wxEntry is called.
|
|
// We'll put the wxEntry call in npshell.cpp instead.
|
|
NPError wxPluginApp::NPP_Initialize(void)
|
|
{
|
|
static int init = FALSE;
|
|
|
|
if ( init == TRUE )
|
|
MessageBox(NULL, "wxPluginApp::NPP_Initialize:\nabout to call wxEntry for 2nd time!!!", "wxPlugin", MB_OK);
|
|
|
|
wxEntry((WXHINSTANCE) GetModuleHandle(NULL));
|
|
|
|
init = TRUE;
|
|
|
|
// MessageBox(NULL, "wxPluginApp::NPP_Initialize: have called wxEntry", "wxPlugin", MB_OK);
|
|
return NPERR_NO_ERROR;
|
|
}
|
|
|
|
NPError wxPluginApp::NPP_New(NPMIMEType pluginType, NPP instance, uint16 mode,
|
|
int16 argc, char* argn[], char* argv[], NPSavedData* saved)
|
|
{
|
|
// MessageBox(NULL, "wxPluginApp::NPP_New", "wxPlugin", MB_OK);
|
|
|
|
// Save values so frame can be created in first NPP_SetWindow
|
|
if ( m_data.m_instance != 0 )
|
|
{
|
|
MessageBox(NULL, "wxPluginApp::NPP_New: whoops, 2 NPP_New calls in succession without NPP_SetWindow.\n Need to modify my code!", "wxPlugin", MB_OK);
|
|
return NPERR_NO_ERROR;
|
|
}
|
|
|
|
m_data.m_instance = instance;
|
|
m_data.m_type = pluginType;
|
|
m_data.m_mode = mode;
|
|
|
|
SetAttributeValues(argc, argn, argv);
|
|
|
|
// Unfortunately, we may get a stream event before we've got a valid window
|
|
// handle, so we just have to go ahead and create a new instance.
|
|
wxPluginFrame *frame = OnNewInstance(m_data);
|
|
|
|
m_data.m_instance = NULL;
|
|
m_data.m_window = NULL;
|
|
delete[] m_data.m_argv;
|
|
delete[] m_data.m_argn;
|
|
m_data.m_argv = NULL;
|
|
m_data.m_argn = NULL;
|
|
|
|
return NPERR_NO_ERROR;
|
|
}
|
|
|
|
NPError wxPluginApp::NPP_NewStream(NPP instance, NPMIMEType type, NPStream *stream,
|
|
NPBool seekable, uint16* stype)
|
|
{
|
|
// By default, we want to receive a file instead of a stream.
|
|
wxPluginFrame *frame = FindFrame(instance);
|
|
if ( frame )
|
|
{
|
|
return frame->OnNPNewStream(type, stream, seekable, stype);
|
|
}
|
|
return NPERR_NO_ERROR;
|
|
}
|
|
|
|
void wxPluginApp::NPP_Print(NPP instance, NPPrint* printInfo)
|
|
{
|
|
if (instance == NULL)
|
|
return;
|
|
|
|
wxPluginFrame *frame = FindFrame(instance);
|
|
if ( frame )
|
|
{
|
|
frame->OnNPPrint(printInfo);
|
|
}
|
|
}
|
|
|
|
NPError wxPluginApp::NPP_SetWindow(NPP instance, NPWindow* window)
|
|
{
|
|
// MessageBox(NULL, "wxPluginApp::NPP_SetWindow", "wxPlugin", MB_OK);
|
|
|
|
if ( window )
|
|
wxDebugMsg("%d\n", (int) window->window);
|
|
|
|
wxPluginFrame *frame = FindFrame(instance);
|
|
if ( frame )
|
|
{
|
|
frame->SetNPWindow(window);
|
|
}
|
|
else
|
|
{
|
|
#if 0
|
|
// No such frame: must make it.
|
|
if ( m_data.m_instance == NULL )
|
|
{
|
|
MessageBox(NULL, "wxPluginApp::NPP_SetWindow: whoops, no data to create window. SetWindow called in funny order?", "wxPlugin", MB_OK);
|
|
return NPERR_NO_ERROR;
|
|
}
|
|
|
|
if ( window->window == NULL )
|
|
{
|
|
// We're receiving a NULL window before we've even received
|
|
// a valid window. Ignore this silly thing.
|
|
return NPERR_NO_ERROR;
|
|
}
|
|
|
|
m_data.m_window = window;
|
|
m_data.m_instance = instance;
|
|
|
|
// wxPluginFrame *frame = OnNewInstance(m_data);
|
|
|
|
m_data.m_instance = NULL;
|
|
m_data.m_window = NULL;
|
|
delete[] m_data.m_argv;
|
|
delete[] m_data.m_argn;
|
|
m_data.m_argv = NULL;
|
|
m_data.m_argn = NULL;
|
|
#endif
|
|
}
|
|
return NPERR_NO_ERROR;
|
|
}
|
|
|
|
void wxPluginApp::NPP_Shutdown(void)
|
|
{
|
|
// Clean up wxWidgets
|
|
CleanUp();
|
|
}
|
|
|
|
void wxPluginApp::NPP_StreamAsFile(NPP instance, NPStream* stream, const char *fname)
|
|
{
|
|
wxPluginFrame *frame = FindFrame(instance);
|
|
if ( frame )
|
|
{
|
|
wxString str(fname);
|
|
frame->OnNPNewFile(stream, str);
|
|
}
|
|
}
|
|
|
|
/*
|
|
void wxPluginApp::NPP_URLNotify(NPP instance, const char* url, NPReason reason,
|
|
void* notifyData)
|
|
{
|
|
}
|
|
*/
|
|
|
|
int32 wxPluginApp::NPP_Write(NPP instance, NPStream* stream, int32 offset, int32 len,
|
|
void* buf)
|
|
{
|
|
return len; // The number of bytes accepted
|
|
}
|
|
|
|
static int32 STREAMBUFSIZE = 0X0FFFFFFF; // If we are reading from a file in NPAsFile
|
|
// mode so we can take any size stream in our
|
|
// write call (since we ignore it)
|
|
|
|
int32 wxPluginApp::NPP_WriteReady(NPP instance, NPStream* stream)
|
|
{
|
|
return STREAMBUFSIZE; // Number of bytes ready to accept in NPP_Write()
|
|
}
|
|
|