Files correlati : Commento : Spostamento in libraries delle librerie esterne di Campo per una maggiore pulizia e organizzazione git-svn-id: svn://10.65.10.50/branches/R_10_00@24150 c028cbd2-c16b-5b4b-a496-9718f37d4682
		
			
				
	
	
		
			279 lines
		
	
	
		
			7.0 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			279 lines
		
	
	
		
			7.0 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()
 | |
| }
 | |
| 
 |