merged tag ooo/OOO330_m14
[LibreOffice.git] / extensions / source / plugin / aqua / sysplug.cxx
blob81637eb2d5644df936d766b1b2985640e26455f1
1 /*************************************************************************
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 * Copyright 2000, 2010 Oracle and/or its affiliates.
7 * OpenOffice.org - a multi-platform office productivity suite
9 * This file is part of OpenOffice.org.
11 * OpenOffice.org is free software: you can redistribute it and/or modify
12 * it under the terms of the GNU Lesser General Public License version 3
13 * only, as published by the Free Software Foundation.
15 * OpenOffice.org is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU Lesser General Public License version 3 for more details
19 * (a copy is included in the LICENSE file that accompanied this code).
21 * You should have received a copy of the GNU Lesser General Public License
22 * version 3 along with OpenOffice.org. If not, see
23 * <http://www.openoffice.org/license.html>
24 * for a copy of the LGPLv3 License.
26 ************************************************************************/
27 #include <cstdarg>
29 #include <sys/types.h>
30 #include <signal.h>
31 #include <sys/wait.h>
32 #include <osl/thread.h>
34 #include <plugin/impl.hxx>
36 extern NPNetscapeFuncs aNPNFuncs;
38 #include <tools/debug.hxx>
40 using namespace rtl;
41 using namespace plugstringhelper;
43 #if OSL_DEBUG_LEVEL > 1
44 void TRACE( char const * s );
45 void TRACEN( char const * s, long n );
46 #else
47 #define TRACE(x)
48 #define TRACEN(x,n)
49 #endif
51 struct FakeEventRecord : public EventRecord
53 FakeEventRecord()
55 memset( this, 0, sizeof(EventRecord) );
56 ::GetGlobalMouse( &where );
57 when = ::TickCount();
58 modifiers = ::GetCurrentEventKeyModifiers();
63 @interface OOoPluginView : NSView
65 XPlugin_Impl* m_pImpl;
66 MacPluginComm* m_pCom;
68 -(id)initWithInstance: (XPlugin_Impl*)i_pImpl pluginComm: (MacPluginComm*)i_pCom frame: (NSRect)i_aRect;
69 -(void)drawRect: (NSRect)i_aRect;
70 -(MacOSBOOL)isOpaque;
71 -(MacOSBOOL)isFlipped;
73 // NSResponder
74 -(void)mouseMoved: (NSEvent*)i_pEvent;
75 -(void)mouseDown: (NSEvent*)i_pEvent;
76 -(void)mouseDragged: (NSEvent*)i_pEvent;
77 -(void)mouseUp: (NSEvent*)i_pEvent;
78 -(void)rightMouseDown: (NSEvent*)i_pEvent;
79 -(void)rightMouseDragged: (NSEvent*)i_pEvent;
80 -(void)rightMouseUp: (NSEvent*)i_pEvent;
81 -(void)otherMouseDown: (NSEvent*)i_pEvent;
82 -(void)otherMouseDragged: (NSEvent*)i_pEvent;
83 -(void)otherMouseUp: (NSEvent*)i_pEvent;
84 -(void)mouseEntered: (NSEvent*)i_pEvent;
85 -(void)mouseExited: (NSEvent*)i_pEvent;
86 @end
88 @implementation OOoPluginView
89 -(id)initWithInstance: (XPlugin_Impl*)i_pImpl pluginComm: (MacPluginComm*)i_pCom frame: (NSRect) i_aRect
91 if( (self = [super initWithFrame: i_aRect]) )
93 m_pImpl = i_pImpl;
94 m_pCom = i_pCom;
96 return self;
99 -(void)drawRect: (NSRect) i_aRect
101 m_pCom->drawView( m_pImpl );
104 -(MacOSBOOL)isOpaque
106 return NO;
109 -(MacOSBOOL)isFlipped
111 return YES;
114 // NSResponder
115 -(void)mouseMoved: (NSEvent*)i_pEvent
117 FakeEventRecord aRec;
118 aRec.what = osEvt + 18; // NPEventType_AdjustCursorEvent
119 m_pCom->NPP_HandleEvent( m_pImpl->getNPPInstance(), &aRec );
122 -(void)mouseDown: (NSEvent*)i_pEvent;
124 FakeEventRecord aRec;
125 aRec.what = mouseDown;
126 m_pCom->NPP_HandleEvent( m_pImpl->getNPPInstance(), &aRec );
129 -(void)mouseDragged: (NSEvent*)i_pEvent;
131 FakeEventRecord aRec;
132 aRec.what = aRec.what = osEvt + 18; // NPEventType_AdjustCursorEvent
133 m_pCom->NPP_HandleEvent( m_pImpl->getNPPInstance(), &aRec );
136 -(void)mouseUp: (NSEvent*)i_pEvent;
138 FakeEventRecord aRec;
139 aRec.what = mouseUp;
140 m_pCom->NPP_HandleEvent( m_pImpl->getNPPInstance(), &aRec );
143 -(void)rightMouseDown: (NSEvent*)i_pEvent;
145 FakeEventRecord aRec;
146 aRec.what = mouseDown;
147 m_pCom->NPP_HandleEvent( m_pImpl->getNPPInstance(), &aRec );
150 -(void)rightMouseDragged: (NSEvent*)i_pEvent;
152 FakeEventRecord aRec;
153 aRec.what = aRec.what = osEvt + 18; // NPEventType_AdjustCursorEvent
154 m_pCom->NPP_HandleEvent( m_pImpl->getNPPInstance(), &aRec );
157 -(void)rightMouseUp: (NSEvent*)i_pEvent;
159 FakeEventRecord aRec;
160 aRec.what = mouseUp;
161 m_pCom->NPP_HandleEvent( m_pImpl->getNPPInstance(), &aRec );
164 -(void)otherMouseDown: (NSEvent*)i_pEvent;
166 FakeEventRecord aRec;
167 aRec.what = mouseDown;
168 m_pCom->NPP_HandleEvent( m_pImpl->getNPPInstance(), &aRec );
171 -(void)otherMouseDragged: (NSEvent*)i_pEvent;
173 FakeEventRecord aRec;
174 aRec.what = aRec.what = osEvt + 18; // NPEventType_AdjustCursorEvent
175 m_pCom->NPP_HandleEvent( m_pImpl->getNPPInstance(), &aRec );
178 -(void)otherMouseUp: (NSEvent*)i_pEvent;
180 FakeEventRecord aRec;
181 aRec.what = mouseUp;
182 m_pCom->NPP_HandleEvent( m_pImpl->getNPPInstance(), &aRec );
185 -(void)mouseEntered: (NSEvent*)i_pEvent;
187 FakeEventRecord aRec;
188 aRec.what = aRec.what = osEvt + 18; // NPEventType_AdjustCursorEvent
189 m_pCom->NPP_HandleEvent( m_pImpl->getNPPInstance(), &aRec );
192 -(void)mouseExited: (NSEvent*)i_pEvent;
194 FakeEventRecord aRec;
195 aRec.what = aRec.what = osEvt + 18; // NPEventType_AdjustCursorEvent
196 m_pCom->NPP_HandleEvent( m_pImpl->getNPPInstance(), &aRec );
199 @end
201 //--------------------------------------------------------------------------------------------------
202 MacPluginComm::MacPluginComm( const rtl::OUString& i_rMimetype, const rtl::OUString& i_rBundle, NSView* i_pParent )
203 : PluginComm( OUStringToOString( i_rBundle, RTL_TEXTENCODING_UTF8 ) ),
204 m_xBundle( NULL ),
205 m_hPlugLib( NULL ),
206 m_pNullTimer( NULL )
208 // initialize plugin function table
209 memset( &m_aNPPfuncs, 0, sizeof( m_aNPPfuncs ) );
211 // load the bundle
212 CFURLRef xURL = createURL( i_rBundle );
213 m_xBundle = CFBundleCreate( NULL, xURL );
214 CFRelease( xURL );
215 if( m_xBundle )
217 // ask the plugin library
218 // first get its location
219 CFURLRef xLibURL = CFBundleCopyExecutableURL( m_xBundle );
220 if( xLibURL )
222 // get the file system path
223 rtl::OUString aModuleURL( CFURLtoOSLURL( xLibURL ) );
224 CFRelease( xLibURL );
225 m_hPlugLib = osl_loadModule( aModuleURL.pData, SAL_LOADMODULE_DEFAULT );
226 #if OSL_DEBUG_LEVEL > 1
227 if( ! m_hPlugLib )
228 fprintf( stderr, "module %s could not be loaded\n", OUStringToOString( aModuleURL, RTL_TEXTENCODING_UTF8 ).getStr() );
229 #endif
231 #if OSL_DEBUG_LEVEL > 1
232 else
233 fprintf( stderr, "bundle %s has no exectutable URL\n", OUStringToOString( i_rBundle, RTL_TEXTENCODING_UTF8 ).getStr() );
234 #endif
236 else
238 #if OSL_DEBUG_LEVEL > 1
239 fprintf( stderr, "bundle %s could not be loaded\n", OUStringToOString( i_rBundle, RTL_TEXTENCODING_UTF8 ).getStr() );
240 #endif
243 DBG_ASSERT( m_xBundle && m_hPlugLib, "loading plugin bundle failed!" );
246 m_aNPPfuncs.size = sizeof( m_aNPPfuncs );
247 m_aNPPfuncs.version = 0;
250 m_eCall = eNP_Initialize;
251 execute();
254 //--------------------------------------------------------------------------------------------------
255 MacPluginComm::~MacPluginComm()
257 if( m_hPlugLib )
259 // NPP_Shutdown();
260 NPError (*pShutdown)();
261 if( retrieveFunction( "NP_Shutdown", (void**)&pShutdown ) )
263 NPError nErr = (*pShutdown)(); (void)nErr;
264 DBG_ASSERT( nErr == NPERR_NO_ERROR, "NP_Shutdown() failed!" );
266 osl_unloadModule( m_hPlugLib );
268 if( m_xBundle )
269 CFRelease( m_xBundle );
272 //--------------------------------------------------------------------------------------------------
273 BOOL MacPluginComm::retrieveFunction( const char* i_pName, void** o_ppFunc ) const
275 if( ! m_hPlugLib || ! o_ppFunc )
276 return FALSE;
278 *o_ppFunc = (void*)osl_getAsciiFunctionSymbol( m_hPlugLib, i_pName );
280 if( ! *o_ppFunc && m_xBundle )
282 rtl::OUString aName( OUString::createFromAscii( *i_pName == '_' ? i_pName+1 : i_pName ) );
283 CFStringRef xName = createString( aName );
284 if( xName )
286 *o_ppFunc = CFBundleGetFunctionPointerForName( m_xBundle, xName );
287 CFRelease( xName );
291 return (*o_ppFunc != NULL);
294 IMPL_LINK( MacPluginComm, NullTimerHdl, void*, EMPTYARG )
296 // note: this is a Timer handler, we are already protected by the SolarMutex
298 FakeEventRecord aRec;
299 aRec.what = nullEvent;
300 aRec.where.h = aRec.where.v = 20000;
302 for( std::list< XPlugin_Impl* >::iterator it = m_aNullEventClients.begin();
303 it != m_aNullEventClients.end(); ++it )
305 SysPlugData& rPlugData( (*it)->getSysPlugData() );
306 if( rPlugData.m_pPlugView ) // for safety do not dispatch null events before first NPP_SetWindow
307 (*m_aNPPfuncs.event)( (*it)->getNPPInstance(), &aRec );
310 return 0;
313 //--------------------------------------------------------------------------------------------------
315 long MacPluginComm::doIt()
317 long nRet = 0;
318 switch( m_eCall )
320 case eNP_Initialize:
322 TRACE( "eNP_Initialize" );
323 NPError (*pInit)( NPNetscapeFuncs* );
324 if( retrieveFunction( "NP_Initialize", (void**)&pInit ) )
326 nRet = (*pInit)( &aNPNFuncs );
328 NPError nErr = NPERR_NO_ERROR;
329 NPError (*pEntry)( NPPluginFuncs* );
330 retrieveFunction( "NP_GetEntryPoints", (void**)&pEntry );
331 nErr = (*pEntry)( &m_aNPPfuncs );
333 DBG_ASSERT( nErr == NPERR_NO_ERROR, "NP_GetEntryPoints() failed!" );
335 else
337 nRet = NPERR_GENERIC_ERROR;
339 DBG_ASSERT( nRet == NPERR_NO_ERROR, "### NP_Initialize() failed!" );
341 break;
342 case eNPP_Destroy:
343 if( m_aNullEventClients.empty() )
344 delete m_pNullTimer, m_pNullTimer = NULL;
346 TRACE( "eNPP_Destroy" );
347 nRet = (m_aNPPfuncs.destroy
348 ? (*m_aNPPfuncs.destroy)(
349 (NPP)m_aArgs[0],
350 (NPSavedData**)m_aArgs[1] )
351 : NPERR_GENERIC_ERROR);
352 break;
353 case eNPP_DestroyStream:
354 TRACE( "eNPP_DestroyStream" );
355 nRet = (m_aNPPfuncs.destroystream
356 ? (*m_aNPPfuncs.destroystream)(
357 (NPP)m_aArgs[0],
358 (NPStream*)m_aArgs[1],
359 (NPError)(sal_IntPtr)m_aArgs[2] )
360 : NPERR_GENERIC_ERROR);
361 break;
362 case eNPP_New:
363 TRACE( "eNPP_New" );
364 nRet = (m_aNPPfuncs.newp
365 ? (*m_aNPPfuncs.newp)(
366 (NPMIMEType)m_aArgs[0],
367 (NPP)m_aArgs[1],
368 (uint16)(sal_IntPtr)m_aArgs[2],
369 (int16)(sal_IntPtr)m_aArgs[3],
370 (char**)m_aArgs[4],
371 (char**)m_aArgs[5],
372 (NPSavedData*)m_aArgs[6] )
373 : NPERR_GENERIC_ERROR);
375 if( ! m_pNullTimer && m_aNPPfuncs.event )
377 m_pNullTimer = new AutoTimer();
378 m_pNullTimer->SetTimeout( 50 );
379 m_pNullTimer->SetTimeoutHdl( LINK( this, MacPluginComm, NullTimerHdl ) );
380 m_pNullTimer->Start();
383 break;
384 case eNPP_NewStream:
385 TRACE( "eNPP_NewStream" );
386 nRet = (m_aNPPfuncs.newstream
387 ? (*m_aNPPfuncs.newstream)(
388 (NPP)m_aArgs[0],
389 (NPMIMEType)m_aArgs[1],
390 (NPStream*)m_aArgs[2],
391 (NPBool)(sal_IntPtr)m_aArgs[3],
392 (uint16*)m_aArgs[4] )
393 : NPERR_GENERIC_ERROR);
394 break;
395 case eNPP_Print:
396 TRACE( "eNPP_Print" );
397 if (m_aNPPfuncs.print)
398 (*m_aNPPfuncs.print)(
399 (NPP)m_aArgs[0],
400 (NPPrint*)m_aArgs[1] );
401 break;
402 case eNPP_SetWindow:
404 TRACE( "eNPP_SetWindow" );
405 nRet = (m_aNPPfuncs.setwindow
406 ? (*m_aNPPfuncs.setwindow)(
407 (NPP)m_aArgs[0],
408 (NPWindow*)m_aArgs[1] )
409 : NPERR_GENERIC_ERROR);
411 break;
413 case eNPP_HandleEvent:
415 TRACE( "eNPP_HandleEvent" );
416 nRet = (m_aNPPfuncs.event
417 ? (*m_aNPPfuncs.event)(
418 (NPP)m_aArgs[0],
419 m_aArgs[1] )
420 : NPERR_GENERIC_ERROR);
422 break;
424 case eNPP_StreamAsFile:
425 TRACE( "eNPP_StreamAsFile" );
426 if (m_aNPPfuncs.asfile)
427 (*m_aNPPfuncs.asfile)(
428 (NPP)m_aArgs[0],
429 (NPStream*)m_aArgs[1],
430 (char*)m_aArgs[2] );
431 break;
432 case eNPP_URLNotify:
433 TRACE( "eNPP_URLNotify" );
434 if (m_aNPPfuncs.urlnotify)
435 (*m_aNPPfuncs.urlnotify)(
436 (NPP)m_aArgs[0],
437 (char*)m_aArgs[1],
438 (NPReason)(sal_IntPtr)m_aArgs[2],
439 m_aArgs[3] );
440 break;
441 case eNPP_Write:
442 TRACEN( "eNPP_Write n=", (int32)m_aArgs[3] );
443 nRet = (m_aNPPfuncs.write
444 ? (*m_aNPPfuncs.write)(
445 (NPP)m_aArgs[0],
446 (NPStream*)m_aArgs[1],
447 (int32)m_aArgs[2],
448 (int32)m_aArgs[3],
449 m_aArgs[4] )
450 : 0);
451 break;
452 case eNPP_WriteReady:
453 TRACE( "eNPP_WriteReady" );
454 nRet = (m_aNPPfuncs.writeready
455 ? (*m_aNPPfuncs.writeready)(
456 (NPP)m_aArgs[0],
457 (NPStream*)m_aArgs[1] )
458 : 0);
459 break;
460 case eNPP_GetValue:
461 TRACE( "eNPP_GetValue" );
462 nRet = (m_aNPPfuncs.getvalue
463 ? (*m_aNPPfuncs.getvalue)(
464 (NPP)m_aArgs[0],
465 (NPPVariable)(int)m_aArgs[1],
466 m_aArgs[2] )
467 : NPERR_GENERIC_ERROR);
468 break;
469 case eNPP_SetValue:
470 TRACE( "eNPP_SetValue" );
471 nRet = (m_aNPPfuncs.setvalue
472 ? (*m_aNPPfuncs.setvalue)(
473 (NPP)m_aArgs[0],
474 (NPNVariable)(int)m_aArgs[1],
475 m_aArgs[2] )
476 : NPERR_GENERIC_ERROR);
477 break;
478 case eNPP_Shutdown:
480 TRACE( "eNPP_Shutdown" );
481 NPP_ShutdownUPP pFunc;
482 if (retrieveFunction( "NPP_Shutdown", (void**)&pFunc ))
483 (*pFunc)();
485 break;
486 case eNPP_Initialize:
487 TRACE( "eNPP_Initialize" );
488 OSL_ENSURE( false, "NPP_Initialize: not implemented!" );
489 break;
490 case eNPP_GetJavaClass:
491 TRACE( "eNPP_GetJavaClass" );
492 OSL_ENSURE( false, "NPP_GetJavaClass: not implemented!" );
493 break;
495 return nRet;
498 //--------------------------------------------------------------------------------------------------
499 NPError MacPluginComm::NPP_Destroy( XPlugin_Impl* i_pImpl, NPSavedData** save )
501 // remove from NullEvent timer
502 m_aNullEventClients.remove( i_pImpl );
504 NPError nErr = NPP_Destroy( i_pImpl->getNPPInstance(), save );
506 // release plugin view
507 SysPlugData& rPlugData( i_pImpl->getSysPlugData() );
508 if( rPlugData.m_pPlugView )
510 [rPlugData.m_pPlugView removeFromSuperview];
511 [rPlugData.m_pPlugView release];
512 rPlugData.m_pPlugView = nil;
515 return nErr;
519 NPError MacPluginComm::NPP_Destroy( NPP instance, NPSavedData** save )
521 DBG_ASSERT( m_aNPPfuncs.destroy, "### NPP_Destroy(): null pointer in NPP functions table!" );
522 m_eCall = eNPP_Destroy;
523 m_aArgs[0] = (void*)instance;
524 m_aArgs[1] = (void*)save;
525 return (NPError)execute();
528 //--------------------------------------------------------------------------------------------------
529 NPError MacPluginComm::NPP_DestroyStream( NPP instance, NPStream* stream, NPError reason )
531 DBG_ASSERT( m_aNPPfuncs.destroystream, "### NPP_DestroyStream(): null pointer in NPP functions table!" );
532 m_eCall = eNPP_DestroyStream;
533 m_aArgs[0] = (void*)instance;
534 m_aArgs[1] = (void*)stream;
535 m_aArgs[2] = (void*)reason;
536 return (NPError)execute();
539 //--------------------------------------------------------------------------------------------------
540 NPError MacPluginComm::NPP_New( NPMIMEType pluginType, NPP instance, uint16 mode, int16 argc,
541 char* argn[], char* argv[], NPSavedData *saved )
543 XPlugin_Impl* pImpl = XPluginManager_Impl::getXPluginFromNPP( instance );
544 DBG_ASSERT( pImpl, "no instance found" );
546 if( pImpl ) // sanity check
547 m_aNullEventClients.push_back( pImpl );
549 DBG_ASSERT( m_aNPPfuncs.newp, "### NPP_New(): null pointer in NPP functions table!" );
550 #if OSL_DEBUG_LEVEL > 1
551 fprintf( stderr, "NPP_New( %s. %p, %d, %d",
552 pluginType, instance, (int)mode, (int)argc );
553 for( int16 i = 0; i < argc; i++ )
554 fprintf( stderr, "\n%s = %s", argn[i], argv[i] );
555 fprintf( stderr, ", %p )\n", saved );
556 #endif
557 m_eCall = eNPP_New;
558 m_aArgs[0] = (void*)pluginType;
559 m_aArgs[1] = (void*)instance;
560 m_aArgs[2] = (void*)mode;
561 m_aArgs[3] = (void*)argc;
562 m_aArgs[4] = (void*)argn;
563 m_aArgs[5] = (void*)argv;
564 m_aArgs[6] = (void*)saved;
566 return (NPError)execute();
569 //--------------------------------------------------------------------------------------------------
570 NPError MacPluginComm::NPP_NewStream( NPP instance, NPMIMEType type, NPStream* stream,
571 NPBool seekable, uint16* stype )
573 DBG_ASSERT( m_aNPPfuncs.newstream, "### NPP_NewStream(): null pointer in NPP functions table!" );
574 m_eCall = eNPP_NewStream;
575 m_aArgs[0] = (void*)instance;
576 m_aArgs[1] = (void*)type;
577 m_aArgs[2] = (void*)stream;
578 m_aArgs[3] = (void*)seekable;
579 m_aArgs[4] = (void*)stype;
580 return (NPError)execute();
583 //--------------------------------------------------------------------------------------------------
584 void MacPluginComm::NPP_Print( NPP instance, NPPrint* platformPrint )
586 DBG_ASSERT( m_aNPPfuncs.print, "### NPP_Print(): null pointer in NPP functions table!" );
587 m_eCall = eNPP_Print;
588 m_aArgs[0] = (void*)instance;
589 m_aArgs[1] = (void*)platformPrint;
590 execute();
593 //--------------------------------------------------------------------------------------------------
594 NPError MacPluginComm::NPP_SetWindow( NPP instance, NPWindow* window )
596 DBG_ASSERT( m_aNPPfuncs.setwindow, "### NPP_SetWindow(): null pointer in NPP functions table!" );
597 m_eCall = eNPP_SetWindow;
598 m_aArgs[0] = (void*)instance;
599 m_aArgs[1] = (void*)window;
600 return (NPError)execute();
603 //--------------------------------------------------------------------------------------------------
604 NPError MacPluginComm::NPP_HandleEvent( NPP instance, void* event )
606 DBG_ASSERT( m_aNPPfuncs.event, "### NPP_HandleEvent(): null pointer in NPP functions table!" );
607 m_eCall = eNPP_HandleEvent;
608 m_aArgs[0] = (void*)instance;
609 m_aArgs[1] = event;
610 return (NPError)execute();
613 //--------------------------------------------------------------------------------------------------
614 void MacPluginComm::NPP_StreamAsFile( NPP instance, NPStream* stream, const char* fname )
616 DBG_ASSERT( m_aNPPfuncs.asfile, "### NPP_StreamAsFile(): null pointer in NPP functions table!" );
617 m_eCall = eNPP_StreamAsFile;
618 m_aArgs[0] = (void*)instance;
619 m_aArgs[1] = (void*)stream;
620 m_aArgs[2] = (void*)fname;
621 execute();
624 //--------------------------------------------------------------------------------------------------
625 void MacPluginComm::NPP_URLNotify( NPP instance, const char* url, NPReason reason, void* notifyData )
627 DBG_ASSERT( m_aNPPfuncs.urlnotify, "### NPP_URLNotify(): null pointer in NPP functions table!" );
628 m_eCall = eNPP_URLNotify;
629 m_aArgs[0] = (void*)instance;
630 m_aArgs[1] = (void*)url;
631 m_aArgs[2] = (void*)reason;
632 m_aArgs[3] = notifyData;
633 execute();
636 //--------------------------------------------------------------------------------------------------
637 int32 MacPluginComm::NPP_Write( NPP instance, NPStream* stream, int32 offset, int32 len, void* buffer )
639 DBG_ASSERT( m_aNPPfuncs.write, "### NPP_Write(): null pointer in NPP functions table!" );
640 m_eCall = eNPP_Write;
641 m_aArgs[0] = (void*)instance;
642 m_aArgs[1] = (void*)stream;
643 m_aArgs[2] = (void*)offset;
644 m_aArgs[3] = (void*)len;
645 m_aArgs[4] = buffer;
646 return (NPError)execute();
649 //--------------------------------------------------------------------------------------------------
650 int32 MacPluginComm::NPP_WriteReady( NPP instance, NPStream* stream )
652 DBG_ASSERT( m_aNPPfuncs.writeready, "### NPP_WriteReady(): null pointer in NPP functions table!" );
653 m_eCall = eNPP_WriteReady;
654 m_aArgs[0] = (void*)instance;
655 m_aArgs[1] = (void*)stream;
656 return execute();
659 //--------------------------------------------------------------------------------------------------
660 NPError MacPluginComm::NPP_GetValue( NPP instance, NPPVariable variable, void *ret_value )
662 DBG_ASSERT( m_aNPPfuncs.getvalue, "### NPP_GetValue(): null pointer in NPP functions table!" );
663 m_eCall = eNPP_GetValue;
664 m_aArgs[0] = (void*)instance;
665 m_aArgs[1] = (void*)variable;
666 m_aArgs[2] = ret_value;
667 return (NPError)execute();
670 //--------------------------------------------------------------------------------------------------
671 NPError MacPluginComm::NPP_SetValue( NPP instance, NPNVariable variable, void *set_value )
673 DBG_ASSERT( m_aNPPfuncs.setvalue, "### NPP_SetValue(): null pointer in NPP functions table!" );
674 m_eCall = eNPP_SetValue;
675 m_aArgs[0] = (void*)instance;
676 m_aArgs[1] = (void*)variable;
677 m_aArgs[2] = set_value;
678 return (NPError)execute();
681 //--------------------------------------------------------------------------------------------------
682 void * MacPluginComm::NPP_GetJavaClass()
684 DBG_ERROR( "no java class available!" );
685 return 0;
688 //--------------------------------------------------------------------------------------------------
689 NPError MacPluginComm::NPP_Initialize()
691 return NPERR_NO_ERROR;
694 //--------------------------------------------------------------------------------------------------
695 void MacPluginComm::NPP_Shutdown()
697 m_eCall = eNPP_Shutdown;
698 execute();
701 //--------------------------------------------------------------------------------------------------
702 NPError MacPluginComm::NPP_SetWindow( XPlugin_Impl* i_pImpl )
704 // update window NPWindow from view
705 SysPlugData& rPlugData( i_pImpl->getSysPlugData() );
707 // update plug view
708 NSRect aPlugRect = [rPlugData.m_pParentView frame];
709 aPlugRect.origin.x = aPlugRect.origin.y = 0;
710 if( ! rPlugData.m_pPlugView )
712 rPlugData.m_pPlugView = [[OOoPluginView alloc] initWithInstance: i_pImpl pluginComm: this frame: aPlugRect];
713 [rPlugData.m_pParentView addSubview: rPlugData.m_pPlugView];
715 else
716 [rPlugData.m_pPlugView setFrame: aPlugRect];
718 NPWindow* pNPWin = i_pImpl->getNPWindow();
719 NSWindow* pWin = [rPlugData.m_pPlugView window];
720 NSRect aWinRect = [pWin frame];
721 NSRect aBounds = [rPlugData.m_pPlugView frame];
722 NSRect aVisibleBounds = [rPlugData.m_pPlugView visibleRect];
724 #if OSL_DEBUG_LEVEL > 1
725 fprintf( stderr, "visible bounds = %d+%d+%dx%d\n",
726 (int)aVisibleBounds.origin.x, (int)aVisibleBounds.origin.y,
727 (int)aVisibleBounds.size.width, (int)aVisibleBounds.size.height );
728 #endif
730 NSPoint aViewOrigin = [rPlugData.m_pPlugView convertPoint: NSZeroPoint toView: nil];
731 // save view origin so we can notice movement of the view in drawView
732 // in case of a moved view we need to reset the port/context
733 rPlugData.m_aLastPlugViewOrigin = aViewOrigin;
735 // convert view origin to topdown coordinates
736 aViewOrigin.y = aWinRect.size.height - aViewOrigin.y;
738 // same for clipping
739 NSPoint aClipOrigin = [rPlugData.m_pPlugView convertPoint: aVisibleBounds.origin toView: nil];
740 aClipOrigin.y = aWinRect.size.height - aClipOrigin.y;
742 #if OSL_DEBUG_LEVEL > 1
743 fprintf( stderr, "view origin: %d+%d, clip origin = %d+%d\n",
744 (int)aViewOrigin.x, (int)aViewOrigin.y,
745 (int)aClipOrigin.x, (int)aClipOrigin.y );
746 #endif
748 pNPWin->x = aViewOrigin.x;
749 pNPWin->y = aViewOrigin.y;
750 pNPWin->width = aBounds.size.width;
751 pNPWin->height = aBounds.size.height;
752 pNPWin->clipRect.left = aClipOrigin.x;
753 pNPWin->clipRect.top = aClipOrigin.y;
754 pNPWin->clipRect.right = aClipOrigin.x + aVisibleBounds.size.width;
755 pNPWin->clipRect.bottom = aClipOrigin.y + aVisibleBounds.size.height;
757 if( rPlugData.m_nDrawingModel == 1 )
759 rPlugData.m_aCGContext.window = reinterpret_cast<WindowRef>([pWin windowRef]);
760 pNPWin->window = &rPlugData.m_aCGContext;
761 rPlugData.m_aCGContext.context = reinterpret_cast<CGContextRef>([[pWin graphicsContext] graphicsPort]);
762 #if OSL_DEBUG_LEVEL > 1
763 fprintf( stderr, "window is %p, context is %p\n",
764 rPlugData.m_aCGContext.window, rPlugData.m_aCGContext.context );
765 #endif
767 else
769 rPlugData.m_aNPPort.port = GetWindowPort( reinterpret_cast<WindowRef>([pWin windowRef]) );
770 rPlugData.m_aNPPort.portx = aClipOrigin.x;
771 rPlugData.m_aNPPort.porty = aClipOrigin.y;
772 pNPWin->window = &rPlugData.m_aNPPort;
773 #if OSL_DEBUG_LEVEL > 1
774 fprintf( stderr, "port is %p at (%d,%d)\n",
775 rPlugData.m_aNPPort.port, (int)rPlugData.m_aNPPort.portx, (int)rPlugData.m_aNPPort.porty );
776 #endif
779 if( pNPWin->width == 0 || pNPWin->height == 0 || [rPlugData.m_pPlugView isHiddenOrHasHiddenAncestor] )
780 rPlugData.m_bSetWindowOnDraw = true;
782 NPError nErr = NPP_SetWindow( i_pImpl->getNPPInstance(), i_pImpl->getNPWindow() );
784 return nErr;
787 void MacPluginComm::drawView( XPlugin_Impl* i_pImpl )
789 SysPlugData& rPlugData( i_pImpl->getSysPlugData() );
791 // check if the view was moved since the last SetWindow
792 NSPoint aViewOrigin = [rPlugData.m_pPlugView convertPoint: NSZeroPoint toView: nil];
793 if( rPlugData.m_bSetWindowOnDraw ||
794 aViewOrigin.x != rPlugData.m_aLastPlugViewOrigin.x ||
795 aViewOrigin.y != rPlugData.m_aLastPlugViewOrigin.y )
797 NPP_SetWindow( i_pImpl );
798 rPlugData.m_bSetWindowOnDraw = false;
801 // send a paint event
802 NSWindow* pWin = [rPlugData.m_pPlugView window];
803 FakeEventRecord aRec;
804 aRec.what = updateEvt;
805 aRec.message = (UInt32)[pWin windowRef];
806 this->NPP_HandleEvent( i_pImpl->getNPPInstance(), &aRec );