1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 #include <tools/prex.h>
25 #include <tools/postx.h>
26 
27 #include <com/sun/star/awt/SystemPointer.hdl>
28 
29 #include "gstwindow.hxx"
30 #include "gstplayer.hxx"
31 #include <vcl/syschild.hxx>
32 #include <vcl/sysdata.hxx>
33 
34 using namespace ::com::sun::star;
35 
36 namespace avmedia
37 {
38 namespace gst
39 {
40 // ---------------------
41 // - PlayerChildWindow -
42 // ---------------------
43 
44 class PlayerChildWindow : public SystemChildWindow
45 {
46 public:
47 
48                     PlayerChildWindow( Window* pParent );
49                     ~PlayerChildWindow();
50 
51 protected:
52 
53     virtual void    MouseMove( const MouseEvent& rMEvt );
54     virtual void    MouseButtonDown( const MouseEvent& rMEvt );
55     virtual void    MouseButtonUp( const MouseEvent& rMEvt );
56     virtual void    KeyInput( const KeyEvent& rKEvt );
57     virtual void    KeyUp( const KeyEvent& rKEvt );
58     virtual void    Command( const CommandEvent& rCEvt );
59 };
60 
61 // ---------------------------------------------------------------------
62 
PlayerChildWindow(Window * pParent)63 PlayerChildWindow::PlayerChildWindow( Window* pParent ) :
64     SystemChildWindow( pParent, WB_CLIPCHILDREN )
65 {
66 }
67 
68 // ---------------------------------------------------------------------
69 
~PlayerChildWindow()70 PlayerChildWindow::~PlayerChildWindow()
71 {
72 }
73 
74 // ---------------------------------------------------------------------
75 
MouseMove(const MouseEvent & rMEvt)76 void PlayerChildWindow::MouseMove( const MouseEvent& rMEvt )
77 {
78     const MouseEvent aTransformedEvent( GetParent()->ScreenToOutputPixel( OutputToScreenPixel( rMEvt.GetPosPixel() ) ),
79                                         rMEvt.GetClicks(), rMEvt.GetMode(), rMEvt.GetButtons(), rMEvt.GetModifier() );
80 
81     SystemChildWindow::MouseMove( rMEvt );
82     GetParent()->MouseMove( aTransformedEvent );
83 }
84 
85 // ---------------------------------------------------------------------
86 
MouseButtonDown(const MouseEvent & rMEvt)87 void PlayerChildWindow::MouseButtonDown( const MouseEvent& rMEvt )
88 {
89     const MouseEvent aTransformedEvent( GetParent()->ScreenToOutputPixel( OutputToScreenPixel( rMEvt.GetPosPixel() ) ),
90                                         rMEvt.GetClicks(), rMEvt.GetMode(), rMEvt.GetButtons(), rMEvt.GetModifier() );
91 
92     SystemChildWindow::MouseButtonDown( rMEvt );
93     GetParent()->MouseButtonDown( aTransformedEvent );
94 }
95 
96 // ---------------------------------------------------------------------
97 
MouseButtonUp(const MouseEvent & rMEvt)98 void PlayerChildWindow::MouseButtonUp( const MouseEvent& rMEvt )
99 {
100     const MouseEvent aTransformedEvent( GetParent()->ScreenToOutputPixel( OutputToScreenPixel( rMEvt.GetPosPixel() ) ),
101                                         rMEvt.GetClicks(), rMEvt.GetMode(), rMEvt.GetButtons(), rMEvt.GetModifier() );
102 
103     SystemChildWindow::MouseButtonUp( rMEvt );
104     GetParent()->MouseButtonUp( aTransformedEvent );
105 }
106 
107 // ---------------------------------------------------------------------
108 
KeyInput(const KeyEvent & rKEvt)109 void PlayerChildWindow::KeyInput( const KeyEvent& rKEvt )
110 {
111     SystemChildWindow::KeyInput( rKEvt );
112     GetParent()->KeyInput( rKEvt );
113 }
114 
115 // ---------------------------------------------------------------------
116 
KeyUp(const KeyEvent & rKEvt)117 void PlayerChildWindow::KeyUp( const KeyEvent& rKEvt )
118 {
119     SystemChildWindow::KeyUp( rKEvt );
120     GetParent()->KeyUp( rKEvt );
121 }
122 
123 // ---------------------------------------------------------------------
124 
Command(const CommandEvent & rCEvt)125 void PlayerChildWindow::Command( const CommandEvent& rCEvt )
126 {
127     const CommandEvent aTransformedEvent( GetParent()->ScreenToOutputPixel( OutputToScreenPixel( rCEvt.GetMousePosPixel() ) ),
128                                           rCEvt.GetCommand(), rCEvt.IsMouseEvent(), rCEvt.GetData() );
129 
130     SystemChildWindow::Command( rCEvt );
131     GetParent()->Command( aTransformedEvent );
132 }
133 
134 // ---------------
135 // - Window -
136 // ---------------
Window(::avmedia::gst::Player & rPlayer)137 Window::Window( ::avmedia::gst::Player& rPlayer ) :
138     maListeners( maMutex ),
139     maWindowRect( 0, 0, 0, 0 ),
140     mrPlayer( rPlayer ),
141     mpPlayerWindow( NULL ),
142     meZoomLevel( media::ZoomLevel_NOT_AVAILABLE ),
143     mnPointerType( awt::SystemPointer::ARROW )
144 {}
145 
146 // ------------------------------------------------------------------------------
147 
~Window()148 Window::~Window()
149 {
150     dispose();
151 }
152 
153 // ------------------------------------------------------------------------------
154 
implLayoutVideoWindow()155 void Window::implLayoutVideoWindow()
156 {
157     if( mpPlayerWindow && ( media::ZoomLevel_NOT_AVAILABLE != meZoomLevel ) )
158     {
159         awt::Size aPrefSize( mrPlayer.getPreferredPlayerWindowSize() );
160         awt::Rectangle aRect = getPosSize();
161         int nW = aRect.Width, nH = aRect.Height;
162         int nVideoW = nW, nVideoH = nH;
163         int nX = 0, nY = 0, nWidth = 0, nHeight = 0;
164         bool bDone = false, bZoom = false;
165 
166         if( media::ZoomLevel_ORIGINAL == meZoomLevel )
167         {
168             bZoom = true;
169         }
170         else if( media::ZoomLevel_ZOOM_1_TO_4 == meZoomLevel )
171         {
172             aPrefSize.Width >>= 2;
173             aPrefSize.Height >>= 2;
174             bZoom = true;
175         }
176         else if( media::ZoomLevel_ZOOM_1_TO_2 == meZoomLevel )
177         {
178             aPrefSize.Width >>= 1;
179             aPrefSize.Height >>= 1;
180             bZoom = true;
181         }
182         else if( media::ZoomLevel_ZOOM_2_TO_1 == meZoomLevel )
183         {
184             aPrefSize.Width <<= 1;
185             aPrefSize.Height <<= 1;
186             bZoom = true;
187         }
188         else if( media::ZoomLevel_ZOOM_4_TO_1 == meZoomLevel )
189         {
190             aPrefSize.Width <<= 2;
191             aPrefSize.Height <<= 2;
192             bZoom = true;
193         }
194         else if( media::ZoomLevel_FIT_TO_WINDOW == meZoomLevel )
195         {
196             nWidth = nVideoW;
197             nHeight = nVideoH;
198             bDone = true;
199         }
200 
201         if( bZoom )
202         {
203             if( ( aPrefSize.Width <= nVideoW ) && ( aPrefSize.Height <= nVideoH ) )
204             {
205                 nX = ( nVideoW - aPrefSize.Width ) >> 1;
206                 nY = ( nVideoH - aPrefSize.Height ) >> 1;
207                 nWidth = aPrefSize.Width;
208                 nHeight = aPrefSize.Height;
209                 bDone = true;
210             }
211         }
212 
213         if( !bDone )
214         {
215             if( ( aPrefSize.Width > 0 ) && ( aPrefSize.Height > 0 ) && ( nVideoW > 0 ) && ( nVideoH > 0 ) )
216             {
217                 double fPrefWH = (double) aPrefSize.Width / aPrefSize.Height;
218 
219                 if( fPrefWH < ( (double) nVideoW / nVideoH ) )
220                 {
221                     nVideoW = (int) ( nVideoH * fPrefWH );
222                 }
223                 else
224                 {
225                     nVideoH = (int) ( nVideoW / fPrefWH );
226                 }
227 
228                 nX = ( nW - nVideoW ) >> 1;
229                 nY = ( nH - nVideoH ) >> 1;
230                 nWidth = nVideoW;
231                 nHeight = nVideoH;
232             }
233             else
234             {
235                 nX = nY = nWidth = nHeight = 0;
236             }
237         }
238 
239         mpPlayerWindow->SetPosSizePixel( Point( nX, nY ), Size( nWidth, nHeight ) );
240     }
241 }
242 
243 // ------------------------------------------------------------------------------
244 
create(const uno::Sequence<uno::Any> & rArguments)245 bool Window::create( const uno::Sequence< uno::Any >& rArguments )
246 {
247     OSL_ASSERT( !mpPlayerWindow );
248     OSL_ENSURE( rArguments.getLength() > 2,
249 "::avmedia::gst::Windiow::create: GStreamer backend needs \
250 valid parent SystemChildWindow pointer (sal_IntPtr) as third Any \
251 value in sequence of arguments" );
252 
253     bool bRet = false;
254 
255     if( !mpPlayerWindow && ( rArguments.getLength() > 2 ) )
256     {
257         SystemChildWindow* pParentWindow = NULL;
258         sal_IntPtr pIntPtr = 0;
259 
260         // we are not interested in the first argument, which is a pure X11 window handle;
261         // this backend relies on a SystemChildWindow as parent for the PlayerWindow, given
262         // as third Sal_IntPtr value within the argument Sequence
263         rArguments[ 1 ] >>= maWindowRect;
264 
265         rArguments[ 2 ] >>= pIntPtr;
266         pParentWindow = reinterpret_cast< SystemChildWindow* >( pIntPtr );
267 
268         if( pParentWindow )
269         {
270             meZoomLevel = media::ZoomLevel_FIT_TO_WINDOW;
271 
272             mpPlayerWindow = new PlayerChildWindow( pParentWindow );
273             mpPlayerWindow->SetBackground( Color( COL_BLACK ) );
274             mpPlayerWindow->SetPosSizePixel( Point( maWindowRect.X, maWindowRect.Y ),
275                                             Size( maWindowRect.Width, maWindowRect.Height ) );
276             mpPlayerWindow->Show();
277 
278             bRet = true;
279         }
280     }
281 
282     return( bRet );
283 }
284 
285 // ------------------------------------------------------------------------------
286 
update()287 void SAL_CALL Window::update()
288      throw( uno::RuntimeException )
289 {
290     if( mpPlayerWindow )
291     {
292         mpPlayerWindow->Invalidate( INVALIDATE_UPDATE );
293         mpPlayerWindow->Sync();
294     }
295 }
296 
297 // ------------------------------------------------------------------------------
298 
setZoomLevel(media::ZoomLevel eZoomLevel)299 sal_Bool SAL_CALL Window::setZoomLevel( media::ZoomLevel eZoomLevel )
300      throw(uno::RuntimeException)
301 {
302     bool bRet = false;
303 
304     if( ( media::ZoomLevel_NOT_AVAILABLE != meZoomLevel ) &&
305        ( media::ZoomLevel_NOT_AVAILABLE != eZoomLevel ) )
306     {
307         if( eZoomLevel != meZoomLevel )
308         {
309             meZoomLevel = eZoomLevel;
310             implLayoutVideoWindow();
311         }
312 
313         bRet = true;
314     }
315 
316     return( bRet );
317 }
318 
319 // ------------------------------------------------------------------------------
320 
getZoomLevel()321 media::ZoomLevel SAL_CALL Window::getZoomLevel()
322      throw( uno::RuntimeException )
323 {
324     return( meZoomLevel );
325 }
326 
327 // ------------------------------------------------------------------------------
328 
setPointerType(sal_Int32 nPointerType)329 void SAL_CALL Window::setPointerType( sal_Int32 nPointerType )
330      throw( uno::RuntimeException )
331 {
332     if( mpPlayerWindow )
333     {
334         Pointer ePointer = POINTER_ARROW;
335 
336         switch( nPointerType )
337         {
338             case (awt::SystemPointer::CROSS) :
339             {
340                 ePointer = POINTER_CROSS;
341             }
342             break;
343 
344             case (awt::SystemPointer::HAND) :
345             {
346                 ePointer = POINTER_HAND;
347             }
348             break;
349 
350             case (awt::SystemPointer::MOVE) :
351             {
352                 ePointer = POINTER_MOVE;
353             }
354             break;
355 
356             case (awt::SystemPointer::WAIT) :
357             {
358                 ePointer = POINTER_WAIT;
359             }
360             break;
361 
362             default:
363             break;
364         }
365 
366         mpPlayerWindow->SetPointer( ePointer );
367     }
368 }
369 
370 // ------------------------------------------------------------------------------
371 
setPosSize(sal_Int32 nX,sal_Int32 nY,sal_Int32 nWidth,sal_Int32 nHeight,sal_Int16)372 void SAL_CALL Window::setPosSize( sal_Int32 nX,
373                                   sal_Int32 nY,
374                                   sal_Int32 nWidth,
375                                   sal_Int32 nHeight,
376                                   sal_Int16 /* Flags */ )
377      throw( uno::RuntimeException )
378 {
379     maWindowRect.X = nX;
380     maWindowRect.Y = nY;
381     maWindowRect.Width = nWidth;
382     maWindowRect.Height = nHeight;
383 
384     implLayoutVideoWindow();
385 }
386 
387 // ------------------------------------------------------------------------------
388 
getPosSize()389 awt::Rectangle SAL_CALL Window::getPosSize()
390      throw( uno::RuntimeException )
391 {
392     return( maWindowRect );
393 }
394 
395 // ------------------------------------------------------------------------------
396 
setVisible(sal_Bool bVisible)397 void SAL_CALL Window::setVisible( sal_Bool bVisible )
398      throw( uno::RuntimeException )
399 {
400     if( mpPlayerWindow )
401     {
402         bVisible ? mpPlayerWindow->Show() : mpPlayerWindow->Hide();
403     }
404 }
405 
406 // ------------------------------------------------------------------------------
407 
setEnable(sal_Bool bEnable)408 void SAL_CALL Window::setEnable( sal_Bool bEnable )
409      throw( uno::RuntimeException )
410 {
411     if( mpPlayerWindow )
412     {
413         mpPlayerWindow->Enable( bEnable );
414     }
415 }
416 
417 // ------------------------------------------------------------------------------
418 
setFocus()419 void SAL_CALL Window::setFocus()
420      throw( uno::RuntimeException )
421 {
422     if( mpPlayerWindow )
423     {
424         mpPlayerWindow->GrabFocus();
425     }
426 }
427 
428 // ------------------------------------------------------------------------------
429 
addWindowListener(const uno::Reference<awt::XWindowListener> & xListener)430 void SAL_CALL Window::addWindowListener( const uno::Reference< awt::XWindowListener >& xListener )
431      throw( uno::RuntimeException )
432 {
433     maListeners.addInterface( getCppuType( &xListener ), xListener );
434 }
435 
436 // ------------------------------------------------------------------------------
437 
removeWindowListener(const uno::Reference<awt::XWindowListener> & xListener)438 void SAL_CALL Window::removeWindowListener( const uno::Reference< awt::XWindowListener >& xListener )
439      throw( uno::RuntimeException )
440 {
441     maListeners.removeInterface( getCppuType( &xListener ), xListener );
442 }
443 
444 // ------------------------------------------------------------------------------
445 
addFocusListener(const uno::Reference<awt::XFocusListener> & xListener)446 void SAL_CALL Window::addFocusListener( const uno::Reference< awt::XFocusListener >& xListener )
447      throw( uno::RuntimeException )
448 {
449     maListeners.addInterface( getCppuType( &xListener ), xListener );
450 }
451 
452 // ------------------------------------------------------------------------------
453 
removeFocusListener(const uno::Reference<awt::XFocusListener> & xListener)454 void SAL_CALL Window::removeFocusListener( const uno::Reference< awt::XFocusListener >& xListener )
455      throw( uno::RuntimeException )
456 {
457     maListeners.removeInterface( getCppuType( &xListener ), xListener );
458 }
459 
460 // ------------------------------------------------------------------------------
461 
addKeyListener(const uno::Reference<awt::XKeyListener> & xListener)462 void SAL_CALL Window::addKeyListener( const uno::Reference< awt::XKeyListener >& xListener )
463      throw( uno::RuntimeException )
464 {
465     maListeners.addInterface( getCppuType( &xListener ), xListener );
466 }
467 
468 // ------------------------------------------------------------------------------
469 
removeKeyListener(const uno::Reference<awt::XKeyListener> & xListener)470 void SAL_CALL Window::removeKeyListener( const uno::Reference< awt::XKeyListener >& xListener )
471      throw( uno::RuntimeException )
472 {
473     maListeners.removeInterface( getCppuType( &xListener ), xListener );
474 }
475 
476 // ------------------------------------------------------------------------------
477 
addMouseListener(const uno::Reference<awt::XMouseListener> & xListener)478 void SAL_CALL Window::addMouseListener( const uno::Reference< awt::XMouseListener >& xListener )
479      throw( uno::RuntimeException )
480 {
481     maListeners.addInterface( getCppuType( &xListener ), xListener );
482 }
483 
484 // ------------------------------------------------------------------------------
485 
removeMouseListener(const uno::Reference<awt::XMouseListener> & xListener)486 void SAL_CALL Window::removeMouseListener( const uno::Reference< awt::XMouseListener >& xListener )
487      throw( uno::RuntimeException )
488 {
489     maListeners.removeInterface( getCppuType( &xListener ), xListener );
490 }
491 
492 // ------------------------------------------------------------------------------
493 
addMouseMotionListener(const uno::Reference<awt::XMouseMotionListener> & xListener)494 void SAL_CALL Window::addMouseMotionListener( const uno::Reference< awt::XMouseMotionListener >& xListener )
495      throw( uno::RuntimeException )
496 {
497     maListeners.addInterface( getCppuType( &xListener ), xListener );
498 }
499 
500 // ------------------------------------------------------------------------------
501 
removeMouseMotionListener(const uno::Reference<awt::XMouseMotionListener> & xListener)502 void SAL_CALL Window::removeMouseMotionListener( const uno::Reference< awt::XMouseMotionListener >& xListener )
503      throw( uno::RuntimeException )
504 {
505     maListeners.removeInterface( getCppuType( &xListener ), xListener );
506 }
507 
508 // ------------------------------------------------------------------------------
509 
addPaintListener(const uno::Reference<awt::XPaintListener> & xListener)510 void SAL_CALL Window::addPaintListener( const uno::Reference< awt::XPaintListener >& xListener )
511      throw( uno::RuntimeException )
512 {
513     maListeners.addInterface( getCppuType( &xListener ), xListener );
514 }
515 
516 // ------------------------------------------------------------------------------
517 
removePaintListener(const uno::Reference<awt::XPaintListener> & xListener)518 void SAL_CALL Window::removePaintListener( const uno::Reference< awt::XPaintListener >& xListener )
519      throw( uno::RuntimeException )
520 {
521     maListeners.removeInterface( getCppuType( &xListener ), xListener );
522 }
523 
524 // ------------------------------------------------------------------------------
525 
dispose()526 void SAL_CALL Window::dispose()
527      throw( uno::RuntimeException )
528 {
529     delete mpPlayerWindow;
530     mpPlayerWindow = NULL;
531 }
532 
533 // ------------------------------------------------------------------------------
534 
addEventListener(const uno::Reference<lang::XEventListener> & xListener)535 void SAL_CALL Window::addEventListener( const uno::Reference< lang::XEventListener >& xListener )
536      throw( uno::RuntimeException )
537 {
538     maListeners.addInterface( getCppuType( &xListener ), xListener );
539 }
540 
541 // ------------------------------------------------------------------------------
542 
removeEventListener(const uno::Reference<lang::XEventListener> & xListener)543 void SAL_CALL Window::removeEventListener( const uno::Reference< lang::XEventListener >&
544                                            xListener )
545      throw( uno::RuntimeException )
546 {
547     maListeners.removeInterface( getCppuType( &xListener ), xListener );
548 }
549 
550 // ------------------------------------------------------------------------------
551 
fireMousePressedEvent(const::com::sun::star::awt::MouseEvent & rEvt)552 void Window::fireMousePressedEvent( const ::com::sun::star::awt::MouseEvent& rEvt )
553 {
554     ::cppu::OInterfaceContainerHelper* pContainer =
555         maListeners.getContainer( getCppuType( ( uno::Reference< awt::XMouseListener >* ) 0 ) );
556 
557     if( pContainer )
558     {
559         ::cppu::OInterfaceIteratorHelper aIter( *pContainer );
560 
561         while( aIter.hasMoreElements() )
562         {
563             uno::Reference< awt::XMouseListener >( aIter.next(),
564                                                    uno::UNO_QUERY )->mousePressed( rEvt );
565         }
566     }
567 }
568 
569 // -----------------------------------------------------------------------------
570 
fireMouseReleasedEvent(const::com::sun::star::awt::MouseEvent & rEvt)571 void Window::fireMouseReleasedEvent( const ::com::sun::star::awt::MouseEvent& rEvt )
572 {
573     ::cppu::OInterfaceContainerHelper* pContainer =
574         maListeners.getContainer( getCppuType( ( uno::Reference< awt::XMouseListener >* ) 0 ) );
575 
576     if( pContainer )
577     {
578         ::cppu::OInterfaceIteratorHelper aIter( *pContainer );
579 
580         while( aIter.hasMoreElements() )
581         {
582             uno::Reference< awt::XMouseListener >( aIter.next(),
583                                                    uno::UNO_QUERY )->mouseReleased( rEvt );
584         }
585     }
586 }
587 
588 // -----------------------------------------------------------------------------
589 
fireMouseMovedEvent(const::com::sun::star::awt::MouseEvent & rEvt)590 void Window::fireMouseMovedEvent( const ::com::sun::star::awt::MouseEvent& rEvt )
591 {
592     ::cppu::OInterfaceContainerHelper* pContainer =
593         maListeners.getContainer( getCppuType( ( uno::Reference< awt::XMouseMotionListener >* )
594                                               0 ) );
595 
596     if( pContainer )
597     {
598         ::cppu::OInterfaceIteratorHelper aIter( *pContainer );
599 
600         while( aIter.hasMoreElements() )
601         {
602             uno::Reference< awt::XMouseMotionListener >( aIter.next(),
603                                                          uno::UNO_QUERY )->mouseMoved( rEvt );
604         }
605     }
606 }
607 
608 // -----------------------------------------------------------------------------
609 
fireSetFocusEvent(const::com::sun::star::awt::FocusEvent & rEvt)610 void Window::fireSetFocusEvent( const ::com::sun::star::awt::FocusEvent& rEvt )
611 {
612     ::cppu::OInterfaceContainerHelper* pContainer =
613         maListeners.getContainer( getCppuType( ( uno::Reference< awt::XFocusListener >* ) 0 ) );
614 
615     if( pContainer )
616     {
617         ::cppu::OInterfaceIteratorHelper aIter( *pContainer );
618 
619         while( aIter.hasMoreElements() )
620         {
621             uno::Reference< awt::XFocusListener >( aIter.next(),
622                                                    uno::UNO_QUERY )->focusGained( rEvt );
623         }
624     }
625 }
626 
627 // ------------------------------------------------------------------------------
628 
getXWindowHandle() const629 long Window::getXWindowHandle() const
630 {
631     return( mpPlayerWindow ? mpPlayerWindow->GetSystemData()->aWindow : 0 );
632 }
633 
634 
635 // ------------------------------------------------------------------------------
636 
getImplementationName()637 ::rtl::OUString SAL_CALL Window::getImplementationName()
638      throw( uno::RuntimeException )
639 {
640     return( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(
641                                 AVMEDIA_GSTREAMER_WINDOW_IMPLEMENTATIONNAME ) ) );
642 }
643 
644 // ------------------------------------------------------------------------------
645 
supportsService(const::rtl::OUString & ServiceName)646 sal_Bool SAL_CALL Window::supportsService( const ::rtl::OUString& ServiceName )
647      throw( uno::RuntimeException )
648 {
649     return( ServiceName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM(
650                                          AVMEDIA_GSTREAMER_WINDOW_SERVICENAME ) ) );
651 }
652 
653 // ------------------------------------------------------------------------------
654 
getSupportedServiceNames()655 uno::Sequence< ::rtl::OUString > SAL_CALL Window::getSupportedServiceNames()
656      throw( uno::RuntimeException )
657 {
658     uno::Sequence< ::rtl::OUString > aRet( 1 );
659     aRet[ 0 ] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( AVMEDIA_GSTREAMER_WINDOW_SERVICENAME ) );
660 
661     return( aRet );
662 }
663 } // namespace gst
664 } // namespace avmedia
665