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