Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*************************************************************************
3 : *
4 : * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 : *
6 : * Copyright 2000, 2010 Oracle and/or its affiliates.
7 : *
8 : * OpenOffice.org - a multi-platform office productivity suite
9 : *
10 : * This file is part of OpenOffice.org.
11 : *
12 : * OpenOffice.org is free software: you can redistribute it and/or modify
13 : * it under the terms of the GNU Lesser General Public License version 3
14 : * only, as published by the Free Software Foundation.
15 : *
16 : * OpenOffice.org is distributed in the hope that it will be useful,
17 : * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 : * GNU Lesser General Public License version 3 for more details
20 : * (a copy is included in the LICENSE file that accompanied this code).
21 : *
22 : * You should have received a copy of the GNU Lesser General Public License
23 : * version 3 along with OpenOffice.org. If not, see
24 : * <http://www.openoffice.org/license.html>
25 : * for a copy of the LGPLv3 License.
26 : *
27 : ************************************************************************/
28 :
29 :
30 : #ifdef AIX
31 : #define _LINUX_SOURCE_COMPAT
32 : #include <sys/timer.h>
33 : #undef _LINUX_SOURCE_COMPAT
34 : #endif
35 :
36 : #ifdef WNT
37 : #include <prewin.h>
38 : #include <postwin.h>
39 : #undef OPTIONAL
40 : #endif
41 :
42 : #include <cstdarg>
43 : #include <list>
44 :
45 : #include <plugin/impl.hxx>
46 : #include <vcl/svapp.hxx>
47 :
48 : #if OSL_DEBUG_LEVEL > 1
49 : #include <osl/thread.h>
50 : #include <stdio.h>
51 : static FILE * s_file = 0;
52 : void TRACE( char const * s )
53 : {
54 : if (! s_file)
55 : s_file = stderr;
56 : if (s_file)
57 : {
58 : oslThreadIdentifier t = osl_getThreadIdentifier(0);
59 : fprintf( s_file, "log [t_id=%" SAL_PRIuUINT32 "]: %s\n", t, s );
60 : fflush( s_file );
61 : }
62 : }
63 : void TRACEN( char const * s, long n )
64 : {
65 : if (! s_file)
66 : s_file = stderr;
67 : if (s_file)
68 : {
69 : oslThreadIdentifier t = osl_getThreadIdentifier(0);
70 : fprintf( s_file, "log [t_id=%" SAL_PRIuUINT32 "]: %s%ld\n", t, s, n );
71 : fflush( s_file );
72 : }
73 : }
74 : void TRACES( char const* s, char const* s2 )
75 : {
76 : if (! s_file)
77 : s_file = stderr;
78 : if (s_file)
79 : {
80 : oslThreadIdentifier t = osl_getThreadIdentifier(0);
81 : fprintf( s_file, "log [t_id=%" SAL_PRIuUINT32 "]: %s %s\n", t, s, s2 );
82 : fflush( s_file );
83 : }
84 : }
85 : #else
86 : #define TRACE(x)
87 : #define TRACEN(x,n)
88 : #define TRACES(x,s)
89 : #endif
90 :
91 : using namespace com::sun::star::lang;
92 :
93 : using ::rtl::OUString;
94 : using ::rtl::OString;
95 : using ::rtl::OStringToOUString;
96 :
97 : // Move deprecated functions which no longer appear in npapi.h before
98 : // their use to avoid errors that they're undeclared at point of use
99 : extern "C"
100 : {
101 0 : const JRIEnvInterface** SAL_CALL NP_LOADDS NPN_GetJavaEnv()
102 : {
103 : TRACE( "NPN_GetJavaEnv" );
104 : // no java in this program
105 0 : return NULL;
106 : }
107 :
108 0 : jref SAL_CALL NP_LOADDS NPN_GetJavaPeer( NPP /*instance*/ )
109 : {
110 : TRACE( "NPN_GetJavaPeer" );
111 0 : return NULL;
112 : }
113 : }
114 :
115 : NPNetscapeFuncs aNPNFuncs =
116 : {
117 : sizeof( NPNetscapeFuncs ),
118 : (NP_VERSION_MAJOR << 8) | NP_VERSION_MINOR,
119 : NPN_GetURL,
120 : NPN_PostURL,
121 : NPN_RequestRead,
122 : NPN_NewStream,
123 : NPN_Write,
124 : NPN_DestroyStream,
125 : NPN_Status,
126 : NPN_UserAgent,
127 : NPN_MemAlloc,
128 : NPN_MemFree,
129 : NPN_MemFlush,
130 : NPN_ReloadPlugins,
131 : NPN_GetJavaEnv,
132 : NPN_GetJavaPeer,
133 : NPN_GetURLNotify,
134 : NPN_PostURLNotify,
135 : NPN_GetValue,
136 : NPN_SetValue,
137 : NPN_InvalidateRect,
138 : NPN_InvalidateRegion,
139 : NPN_ForceRedraw
140 : };
141 :
142 0 : static ::rtl::OString normalizeURL( XPlugin_Impl* plugin, const ::rtl::OString& url )
143 : {
144 0 : ::rtl::OString aLoadURL;
145 0 : if( url.indexOf( ':' ) == -1 )
146 : {
147 0 : aLoadURL = ::rtl::OUStringToOString( plugin->getCreationURL(), plugin->getTextEncoding() );
148 : int nPos;
149 0 : if( ( nPos = aLoadURL.indexOf( "://" ) ) != -1 )
150 : {
151 0 : if( !url.isEmpty() && (url.getStr()[ 0 ] == '/' || url.indexOf( '/' ) != -1) )
152 : {
153 : // this means same server but new path
154 0 : nPos = aLoadURL.indexOf( '/', nPos+3 );
155 :
156 0 : if( nPos != -1 )
157 0 : aLoadURL = aLoadURL.copy( 0, url.getStr()[0] == '/' ? nPos : nPos+1 );
158 : }
159 : else
160 : {
161 : // same server but new file
162 0 : nPos = aLoadURL.lastIndexOf( '/' );
163 0 : aLoadURL = aLoadURL.copy( 0, nPos+1 );
164 : }
165 0 : aLoadURL += url;
166 : }
167 : else
168 0 : aLoadURL = url;
169 : }
170 0 : else if( url.indexOf( ":/" ) != -1 )
171 0 : aLoadURL = url;
172 :
173 0 : return aLoadURL;
174 : }
175 :
176 0 : struct AsynchronousGetURL
177 : {
178 : OUString aUrl;
179 : OUString aTarget;
180 : Reference< XEventListener > xListener;
181 :
182 : DECL_LINK( getURL, XPlugin_Impl* );
183 : };
184 :
185 0 : IMPL_LINK( AsynchronousGetURL, getURL, XPlugin_Impl*, pImpl )
186 : {
187 : try
188 : {
189 0 : pImpl->enterPluginCallback();
190 0 : if( xListener.is() )
191 0 : pImpl->getPluginContext()->
192 : getURLNotify( pImpl,
193 : aUrl,
194 : aTarget,
195 0 : xListener );
196 : else
197 0 : pImpl->getPluginContext()->
198 : getURL( pImpl,
199 : aUrl,
200 0 : aTarget );
201 : }
202 0 : catch(const ::com::sun::star::plugin::PluginException&)
203 : {
204 : }
205 0 : pImpl->leavePluginCallback();
206 0 : delete this;
207 0 : return 0;
208 : }
209 :
210 :
211 : extern "C" {
212 :
213 0 : void* SAL_CALL NP_LOADDS NPN_MemAlloc( uint32_t nBytes )
214 : {
215 : TRACE( "NPN_MemAlloc" );
216 0 : void* pMem = malloc( nBytes );
217 0 : return pMem;
218 : }
219 :
220 0 : void SAL_CALL NP_LOADDS NPN_MemFree( void* pMem )
221 : {
222 : TRACE( "NPN_MemFree" );
223 0 : free( pMem );
224 0 : }
225 :
226 0 : uint32_t SAL_CALL NP_LOADDS NPN_MemFlush( uint32_t /*nSize*/ )
227 : {
228 : TRACE( "NPN_MemFlush" );
229 0 : return 0;
230 : }
231 :
232 0 : NPError SAL_CALL NP_LOADDS NPN_DestroyStream( NPP instance, NPStream* stream, NPError /*reason*/ )
233 : {
234 : TRACE( "NPN_DestroyStream" );
235 0 : XPlugin_Impl* pImpl = XPluginManager_Impl::getXPluginFromNPP( instance );
236 0 : if( ! pImpl )
237 0 : return NPERR_INVALID_INSTANCE_ERROR;
238 :
239 0 : PluginStream* pStream = pImpl->getStreamFromNPStream( stream );
240 0 : if( pStream )
241 : {
242 0 : if( pStream->getStreamType() == InputStream )
243 0 : static_cast<PluginInputStream*>(pStream)->releaseSelf();
244 : else
245 0 : delete pStream;
246 : }
247 :
248 0 : return NPERR_NO_ERROR;
249 : }
250 :
251 0 : NPError SAL_CALL NP_LOADDS NPN_GetURL( NPP instance, const char* url, const char* window )
252 : {
253 : TRACES( "NPN_GetURL", url );
254 0 : XPlugin_Impl* pImpl = XPluginManager_Impl::getXPluginFromNPP( instance );
255 0 : if( ! pImpl )
256 0 : return NPERR_INVALID_INSTANCE_ERROR;
257 :
258 0 : AsynchronousGetURL* pAsync = new AsynchronousGetURL();
259 :
260 0 : OString aLoadURL = normalizeURL( pImpl, url );
261 : TRACES( "NPN_GetURL", aLoadURL.getStr() );
262 0 : pAsync->aUrl = OStringToOUString( aLoadURL, pImpl->getTextEncoding() );
263 0 : pAsync->aTarget = OStringToOUString( window, pImpl->getTextEncoding() );
264 0 : pImpl->setLastGetUrl( aLoadURL );
265 0 : Application::PostUserEvent( LINK( pAsync, AsynchronousGetURL, getURL ), pImpl );
266 0 : return NPERR_NO_ERROR;
267 : }
268 :
269 0 : NPError SAL_CALL NP_LOADDS NPN_GetURLNotify( NPP instance, const char* url, const char* target,
270 : void* notifyData )
271 : {
272 : TRACES( "NPN_GetURLNotify", url );
273 0 : XPlugin_Impl* pImpl = XPluginManager_Impl::getXPluginFromNPP( instance );
274 0 : if( ! pImpl )
275 0 : return NPERR_INVALID_INSTANCE_ERROR;
276 :
277 0 : OString aLoadURL = normalizeURL( pImpl, url );
278 0 : if( aLoadURL.isEmpty() )
279 0 : return NPERR_INVALID_URL;
280 :
281 0 : AsynchronousGetURL* pAsync = new AsynchronousGetURL();
282 : PluginEventListener* pListener =
283 0 : new PluginEventListener( pImpl, url, aLoadURL.getStr(), notifyData );
284 0 : if( ! target || ! *target )
285 : {
286 : // stream will be fed back to plugin,
287 : // notify immediately after destruction of stream
288 0 : pImpl->addPluginEventListener( pListener );
289 0 : pListener = NULL;
290 : }
291 0 : pAsync->aUrl = OStringToOUString( aLoadURL, pImpl->getTextEncoding() );
292 0 : pAsync->aTarget = OStringToOUString( target, pImpl->getTextEncoding() );
293 0 : pAsync->xListener = pListener;
294 0 : pImpl->setLastGetUrl( aLoadURL );
295 0 : Application::PostUserEvent( LINK( pAsync, AsynchronousGetURL, getURL ), pImpl );
296 :
297 0 : return NPERR_NO_ERROR;
298 : }
299 :
300 0 : NPError SAL_CALL NP_LOADDS NPN_NewStream( NPP instance, NPMIMEType type, const char* target,
301 : NPStream** stream )
302 : // stream is a return value
303 : {
304 : TRACE( "NPN_NewStream" );
305 0 : XPlugin_Impl* pImpl = XPluginManager_Impl::getXPluginFromNPP( instance );
306 0 : if( ! pImpl )
307 0 : return NPERR_INVALID_INSTANCE_ERROR;
308 :
309 : PluginOutputStream* pStream = new PluginOutputStream( pImpl,
310 0 : "", 0, 0 );
311 0 : *stream = pStream->getStream();
312 :
313 : try
314 : {
315 0 : pImpl->enterPluginCallback();
316 0 : pImpl->getPluginContext()->
317 : newStream(
318 : pImpl,
319 0 : ::rtl::OStringToOUString( type, pImpl->getTextEncoding () ),
320 0 : ::rtl::OStringToOUString( target, pImpl->getTextEncoding() ),
321 0 : ::com::sun::star::uno::Reference< ::com::sun::star::io::XActiveDataSource > ( pStream->getOutputStream(), UNO_QUERY )
322 0 : );
323 0 : pImpl->leavePluginCallback();
324 : }
325 0 : catch( const ::com::sun::star::plugin::PluginException& e )
326 : {
327 0 : pImpl->leavePluginCallback();
328 0 : return e.ErrorCode;
329 : }
330 :
331 0 : return NPERR_NO_ERROR;
332 : }
333 :
334 0 : NPError SAL_CALL NP_LOADDS NPN_PostURLNotify( NPP instance, const char* url, const char* target, uint32_t len, const char* buf, NPBool file, void* notifyData )
335 : {
336 : TRACE( "NPN_PostURLNotify" );
337 0 : XPlugin_Impl* pImpl = XPluginManager_Impl::getXPluginFromNPP( instance );
338 0 : if( ! pImpl )
339 0 : return NPERR_INVALID_INSTANCE_ERROR;
340 :
341 0 : ::com::sun::star::uno::Sequence<sal_Int8> Bytes( (sal_Int8*)buf, len );
342 :
343 0 : ::rtl::OString aPostURL = normalizeURL( pImpl, url );
344 : PluginEventListener* pListener =
345 0 : new PluginEventListener( pImpl, url, aPostURL.getStr(), notifyData );
346 :
347 0 : if( ! target || ! *target )
348 : {
349 : // stream will be fed back to plugin,
350 : // notify immediately after destruction of stream
351 0 : pImpl->addPluginEventListener( pListener );
352 0 : pListener = NULL;
353 : }
354 :
355 : try
356 : {
357 0 : pImpl->enterPluginCallback();
358 0 : pImpl->getPluginContext()->
359 : postURLNotify( pImpl,
360 0 : ::rtl::OStringToOUString( aPostURL, pImpl->getTextEncoding() ),
361 0 : ::rtl::OStringToOUString( target, pImpl->getTextEncoding() ),
362 : Bytes,
363 : file,
364 0 : ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener > ( pListener ) );
365 0 : pImpl->leavePluginCallback();
366 : }
367 0 : catch( const ::com::sun::star::plugin::PluginException& e )
368 : {
369 0 : pImpl->leavePluginCallback();
370 0 : return e.ErrorCode;
371 : }
372 :
373 0 : return NPERR_NO_ERROR;
374 : }
375 :
376 0 : NPError SAL_CALL NP_LOADDS NPN_PostURL( NPP instance, const char* url, const char* window, uint32_t len, const char* buf, NPBool file )
377 : {
378 : TRACE( "NPN_PostURL" );
379 0 : XPlugin_Impl* pImpl = XPluginManager_Impl::getXPluginFromNPP( instance );
380 0 : if( ! pImpl )
381 0 : return NPERR_INVALID_INSTANCE_ERROR;
382 :
383 0 : ::com::sun::star::uno::Sequence<sal_Int8> Bytes( (sal_Int8*)buf, len );
384 0 : ::rtl::OString aPostURL = normalizeURL( pImpl, url );
385 : try
386 : {
387 0 : pImpl->enterPluginCallback();
388 0 : pImpl->getPluginContext()->
389 : postURL( pImpl,
390 0 : ::rtl::OStringToOUString( aPostURL, pImpl->getTextEncoding() ),
391 0 : ::rtl::OStringToOUString( window, pImpl->getTextEncoding () ),
392 : Bytes,
393 0 : file );
394 0 : pImpl->leavePluginCallback();
395 : }
396 0 : catch( const ::com::sun::star::plugin::PluginException& e )
397 : {
398 0 : pImpl->leavePluginCallback();
399 0 : return e.ErrorCode;
400 : }
401 :
402 0 : return NPERR_NO_ERROR;
403 : }
404 :
405 0 : NPError SAL_CALL NP_LOADDS NPN_RequestRead( NPStream* stream, NPByteRange* rangeList )
406 : {
407 : TRACE( "NPN_RequestRead" );
408 0 : if( ! rangeList )
409 0 : return NPERR_NO_ERROR;
410 :
411 0 : ::std::list<XPlugin_Impl*>& rList = PluginManager::get().getPlugins();
412 0 : ::std::list<XPlugin_Impl*>::iterator iter;
413 0 : XPlugin_Impl* pPlugin = NULL;
414 0 : PluginStream* pStream = NULL;
415 0 : for( iter = rList.begin(); iter!= rList.end(); ++iter )
416 : {
417 0 : pStream = (*iter)->getStreamFromNPStream( stream );
418 0 : if( pStream )
419 : {
420 0 : pPlugin = *iter;
421 0 : break;
422 : }
423 : }
424 0 : if( ! pPlugin )
425 0 : return NPERR_INVALID_INSTANCE_ERROR;
426 0 : if( ! pStream || pStream->getStreamType() != InputStream )
427 0 : return NPERR_FILE_NOT_FOUND;
428 :
429 0 : PluginInputStream* pInputStream = (PluginInputStream*)pStream;
430 0 : sal_Int8* pBytes = NULL;
431 0 : int nBytes = 0;
432 0 : pPlugin->enterPluginCallback();
433 0 : while( rangeList )
434 : {
435 0 : if( pBytes && nBytes < (int)rangeList->length )
436 : {
437 0 : delete [] pBytes;
438 0 : pBytes = NULL;
439 : }
440 0 : if( ! pBytes )
441 0 : pBytes = new sal_Int8[ nBytes = rangeList->length ];
442 : int nRead =
443 0 : pInputStream->read( rangeList->offset, pBytes, rangeList->length );
444 0 : int nPos = 0;
445 : int nNow;
446 0 : do
447 : {
448 0 : nNow = pPlugin->getPluginComm()->
449 : NPP_WriteReady( pPlugin->getNPPInstance(),
450 0 : stream );
451 0 : nNow = pPlugin->getPluginComm()->
452 : NPP_Write( pPlugin->getNPPInstance(),
453 : stream,
454 : rangeList->offset + nPos,
455 : nNow,
456 0 : pBytes+nPos );
457 0 : nPos += nNow;
458 0 : nRead -= nNow;
459 : } while( nRead > 0 && nNow );
460 0 : rangeList = rangeList->next;
461 : }
462 0 : pPlugin->leavePluginCallback();
463 :
464 0 : return NPERR_NO_ERROR;
465 : }
466 :
467 0 : void SAL_CALL NP_LOADDS NPN_Status( NPP instance, const char* message )
468 : {
469 : TRACE( "NPN_Status" );
470 0 : XPlugin_Impl* pImpl = XPluginManager_Impl::getXPluginFromNPP( instance );
471 0 : if( ! pImpl )
472 0 : return;
473 :
474 : try
475 : {
476 0 : pImpl->enterPluginCallback();
477 0 : pImpl->getPluginContext()->
478 0 : displayStatusText( pImpl, ::rtl::OStringToOUString( message, pImpl->getTextEncoding() ) );
479 0 : pImpl->leavePluginCallback();
480 : }
481 0 : catch( const ::com::sun::star::plugin::PluginException& )
482 : {
483 0 : pImpl->leavePluginCallback();
484 : return;
485 : }
486 : }
487 :
488 0 : const char* SAL_CALL NP_LOADDS NPN_UserAgent( NPP instance )
489 : {
490 0 : static char* pAgent = strdup( "Mozilla 3.0" );
491 :
492 0 : XPlugin_Impl* pImpl = XPluginManager_Impl::getXPluginFromNPP( instance );
493 0 : if( pImpl )
494 : {
495 0 : rtl::OUString UserAgent;
496 : try
497 : {
498 0 : pImpl->enterPluginCallback();
499 0 : UserAgent = pImpl->getPluginContext()->
500 0 : getUserAgent( pImpl );
501 0 : pImpl->leavePluginCallback();
502 0 : if( pAgent )
503 0 : free( pAgent );
504 0 : pAgent = strdup( ::rtl::OUStringToOString( UserAgent, pImpl->getTextEncoding() ).getStr() );
505 : }
506 0 : catch( const ::com::sun::star::plugin::PluginException& )
507 : {
508 0 : pImpl->leavePluginCallback();
509 0 : }
510 : }
511 :
512 : TRACES( "NPN_UserAgent: returning", pAgent );
513 :
514 0 : return pAgent;
515 : }
516 :
517 0 : void SAL_CALL NP_LOADDS NPN_Version( int* major, int* minor, int* net_major, int* net_minor )
518 : {
519 : TRACE( "NPN_Version" );
520 0 : *major = 4;
521 0 : *minor = 0;
522 0 : *net_major = 4;
523 0 : *net_minor = 5;
524 0 : }
525 :
526 0 : int32_t SAL_CALL NP_LOADDS NPN_Write( NPP instance, NPStream* stream, int32_t len,
527 : void* buffer )
528 : {
529 : TRACE( "NPN_Write" );
530 0 : XPlugin_Impl* pImpl = XPluginManager_Impl::getXPluginFromNPP( instance );
531 0 : if( ! pImpl )
532 0 : return 0;
533 :
534 0 : PluginStream* pStream = pImpl->getStreamFromNPStream( stream );
535 0 : if( ! pStream || pStream->getStreamType() != OutputStream )
536 0 : return 0;
537 :
538 0 : pImpl->enterPluginCallback();
539 0 : ::com::sun::star::uno::Sequence<sal_Int8> Bytes( (sal_Int8*)buffer, len );
540 0 : ((PluginOutputStream*)pStream)->getOutputStream()->writeBytes( Bytes );
541 0 : pImpl->leavePluginCallback();
542 :
543 0 : return len;
544 : }
545 :
546 :
547 0 : NPError SAL_CALL NP_LOADDS NPN_GetValue( NPP instance, NPNVariable variable, void* value )
548 : {
549 : TRACEN( "NPN_GetValue: ", variable );
550 0 : XPlugin_Impl* pImpl = XPluginManager_Impl::getXPluginFromNPP( instance );
551 :
552 0 : if( ! pImpl )
553 0 : return 0;
554 :
555 0 : NPError aResult( NPERR_NO_ERROR );
556 :
557 0 : switch( variable )
558 : {
559 : case NPNVxDisplay:
560 : // Unix only, handled in sysdep part
561 : case NPNVxtAppContext:
562 : // Unix only, handled in sysdep part
563 : default:
564 0 : aResult = NPERR_INVALID_PARAM;
565 0 : break;
566 : #ifdef QUARTZ
567 : case 2000: // NPNVsupportsQuickDrawBool
568 : *(NPBool*)value = false;
569 : break;
570 : case 2001: // NPNVsupportsCoreGraphicsBool
571 : *(NPBool*)value = true;
572 : break;
573 : #endif
574 : case NPNVjavascriptEnabledBool:
575 : // no javascript
576 0 : *(NPBool*)value = false;
577 0 : break;
578 : case NPNVasdEnabledBool:
579 : // no SmartUpdate
580 0 : *(NPBool*)value = false;
581 0 : break;
582 : case NPNVisOfflineBool:
583 : // no offline browsing
584 0 : *(NPBool*)value = false;
585 0 : break;
586 : }
587 :
588 0 : return aResult;
589 : }
590 :
591 0 : void SAL_CALL NP_LOADDS NPN_ReloadPlugins(NPBool /*reloadPages*/)
592 : {
593 : TRACE( "NPN_ReloadPlugins" );
594 0 : }
595 :
596 :
597 0 : NPError SAL_CALL NP_LOADDS NPN_SetValue( NPP instance,
598 : NPPVariable variable,
599 : void* value )
600 : {
601 0 : NPError nError = NPERR_NO_ERROR;
602 : TRACEN( "NPN_SetValue ", variable );
603 : #ifdef QUARTZ
604 : NPN_SetValue_Impl(instance, variable, value);
605 : #else
606 : (void)instance;
607 : (void)variable;
608 : (void)value;
609 : #endif
610 0 : return nError;
611 : }
612 :
613 0 : void SAL_CALL NP_LOADDS NPN_InvalidateRect(NPP instance, NPRect* /*invalidRect*/)
614 : {
615 : TRACE( "NPN_InvalidateRect" );
616 :
617 : #ifdef QUARTZ
618 : NPN_ForceRedraw( instance );
619 : #else
620 : (void)instance;
621 : #endif
622 0 : }
623 :
624 0 : void SAL_CALL NP_LOADDS NPN_InvalidateRegion(NPP instance, NPRegion /*invalidRegion*/)
625 : {
626 : TRACE( "NPN_InvalidateRegion" );
627 :
628 : #ifdef QUARTZ
629 : NPN_ForceRedraw( instance );
630 : #else
631 : (void)instance;
632 : #endif
633 0 : }
634 :
635 0 : void SAL_CALL NP_LOADDS NPN_ForceRedraw(NPP instance)
636 : {
637 : TRACE( "NPN_ForceRedraw" );
638 : #ifdef QUARTZ
639 : NPN_ForceRedraw_Impl(instance);
640 : #else
641 : (void)instance;
642 : #endif
643 0 : }
644 :
645 : }
646 :
647 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|