xref: /trunk/main/framework/inc/services/pluginframe.hxx (revision 1ecadb572e7010ff3b3382ad9bf179dbc6efadbb)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
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.
14  *
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).
20  *
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.
25  *
26  ************************************************************************/
27 
28 #ifndef __FRAMEWORK_SERVICES_PLUGINFRAME_HXX_
29 #define __FRAMEWORK_SERVICES_PLUGINFRAME_HXX_
30 
31 //_________________________________________________________________________________________________________________
32 //  my own includes
33 //_________________________________________________________________________________________________________________
34 
35 #include <services/frame.hxx>
36 
37 //_________________________________________________________________________________________________________________
38 //  interface includes
39 //_________________________________________________________________________________________________________________
40 #include <com/sun/star/mozilla/XPluginInstance.hpp>
41 #include <com/sun/star/mozilla/XPluginInstancePeer.hpp>
42 #include <com/sun/star/mozilla/XPluginWindowPeer.hpp>
43 #include <com/sun/star/io/XInputStream.hpp>
44 #include <com/sun/star/lang/XInitialization.hpp>
45 #include <com/sun/star/awt/XWindow.hpp>
46 #include <com/sun/star/frame/XDispatchResultListener.hpp>
47 #include <com/sun/star/frame/FeatureStateEvent.hpp>
48 #include <com/sun/star/lang/EventObject.hpp>
49 
50 //_________________________________________________________________________________________________________________
51 //  other includes
52 //_________________________________________________________________________________________________________________
53 
54 #ifndef _VCL_ATOM_HXX
55 #include <vcl/threadex.hxx>
56 #endif
57 #include <unotools/cmdoptions.hxx>
58 
59 
60 //_________________________________________________________________________________________________________________
61 //  namespace
62 //_________________________________________________________________________________________________________________
63 
64 namespace framework{
65 
66 //_________________________________________________________________________________________________________________
67 //  exported const
68 //_________________________________________________________________________________________________________________
69 
70 //_________________________________________________________________________________________________________________
71 //  exported definitions
72 //_________________________________________________________________________________________________________________
73 
74 /*-************************************************************************************************************//**
75     @short      implements an special frame - a plugin frame
76     @descr      -
77 
78     @implements XInitialization
79                 XPluginInstance
80                 XDispatchResultListener
81     @base       Frame
82 *//*-*************************************************************************************************************/
83 
84 class PlugInFrame   :   public css::lang::XInitialization           ,
85                         public css::mozilla::XPluginInstance        ,
86                         public css::frame::XDispatchResultListener  ,   // => XEVENTLISTENER
87                         public Frame                                    // Order of baseclasses is neccessary for right initialization!
88 {
89     //-------------------------------------------------------------------------------------------------------------
90     //  public methods
91     //-------------------------------------------------------------------------------------------------------------
92 
93     public:
94 
95         //---------------------------------------------------------------------------------------------------------
96         //  constructor / destructor
97         //---------------------------------------------------------------------------------------------------------
98 
99         /*-****************************************************************************************************//**
100             @short      standard constructor to create instance
101             @descr      This constructor initialize a new instance of this class,
102                         and will be set valid values on his member and baseclasses.
103 
104             @seealso    -
105 
106             @param      -
107             @return     -
108 
109             @onerror    -
110         *//*-*****************************************************************************************************/
111 
112         PlugInFrame( const css::uno::Reference< css::lang::XMultiServiceFactory >& xFactory );
113 
114         /*-****************************************************************************************************//**
115             @short      standard destructor
116             @descr      This method destruct an instance of this class and clear some member.
117 
118             @seealso    -
119 
120             @param      -
121             @return     -
122 
123             @onerror    -
124         *//*-*****************************************************************************************************/
125 
126         virtual ~PlugInFrame();
127 
128         //---------------------------------------------------------------------------------------------------------
129         //  XInterface, XTypeProvider, XServiceInfo
130         //---------------------------------------------------------------------------------------------------------
131 
132         DECLARE_XINTERFACE
133         DECLARE_XTYPEPROVIDER
134         DECLARE_XSERVICEINFO
135 
136         //---------------------------------------------------------------------------------------------------------
137         //  XInitialization
138         //---------------------------------------------------------------------------------------------------------
139 
140         void SAL_CALL initialize( const css::uno::Sequence< css::uno::Any >& seqArguments ) throw(  css::uno::Exception         ,
141                                                                                                     css::uno::RuntimeException  );
142 
143         //---------------------------------------------------------------------------------------------------------
144         //  XPluginInstance
145         //---------------------------------------------------------------------------------------------------------
146 
147         void SAL_CALL start         () throw( css::uno::RuntimeException );
148         void SAL_CALL implcb_start  () throw( css::uno::RuntimeException );
149         void SAL_CALL stop          () throw( css::uno::RuntimeException );
150         void SAL_CALL implcb_stop   () throw( css::uno::RuntimeException );
151         void SAL_CALL destroy       () throw( css::uno::RuntimeException );
152         void SAL_CALL implcb_destroy() throw( css::uno::RuntimeException );
153         void SAL_CALL createWindow          (   const   css::uno::Any&      aPlatformWindowHandle   ,
154                                                         sal_Bool            bEmbedded               ) throw( css::uno::RuntimeException );
155         void SAL_CALL implcb_createWindow   (   const   css::uno::Any&      aPlatformWindowHandle   ,
156                                                         sal_Bool            bEmbedded               ) throw( css::uno::RuntimeException );
157         void SAL_CALL newStream     (   const   ::rtl::OUString&                                sMIMEDescription,
158                                         const   ::rtl::OUString&                                sURL            ,
159                                         const   ::rtl::OUString&                                sFilter         ,
160                                         const   css::uno::Reference< css::io::XInputStream >&   xStream         ,
161                                         const   css::uno::Any&                                  aSessionId      ) throw( css::uno::RuntimeException );
162         void SAL_CALL implcb_newStream
163                                     (   const   ::rtl::OUString&                                sMIMEDescription,
164                                         const   ::rtl::OUString&                                sURL            ,
165                                         const   ::rtl::OUString&                                sFilter         ,
166                                         const   css::uno::Reference< css::io::XInputStream >&   xStream         ,
167                                         const   css::uno::Any&                                  aSessionId      ) throw( css::uno::RuntimeException );
168         void SAL_CALL newURL        (   const   ::rtl::OUString&    sMIMEDescription,
169                                         const   ::rtl::OUString&    sURL            ,
170                                         const   ::rtl::OUString&    sFilter         ,
171                                         const   css::uno::Any&      aSessionId      ) throw( css::uno::RuntimeException );
172         void SAL_CALL implcb_newURL (   const   ::rtl::OUString&    sMIMEDescription,
173                                         const   ::rtl::OUString&    sURL            ,
174                                         const   ::rtl::OUString&    sFilter         ,
175                                         const   css::uno::Any&      aSessionId      ) throw( css::uno::RuntimeException );
176         virtual void SAL_CALL getHttpServerURL( ::rtl::OUString&    sHost   ,
177                                                 sal_uInt16&         nPort   ,
178                                                 ::rtl::OUString&    sPrefix ) throw( css::uno::RuntimeException );
179 
180         //---------------------------------------------------------------------------------------------------------
181         //   XDispatchProvider
182         //---------------------------------------------------------------------------------------------------------
183 
184         virtual css::uno::Reference< css::frame::XDispatch > SAL_CALL queryDispatch(    const   css::util::URL&     aURL            ,
185                                                                                         const   ::rtl::OUString&    sTargetFrameName,
186                                                                                                 sal_Int32           nSearchFlags    ) throw( css::uno::RuntimeException );
187         virtual css::uno::Sequence< css::uno::Reference< css::frame::XDispatch > > SAL_CALL queryDispatches( const css::uno::Sequence< css::frame::DispatchDescriptor >& seqDescripts ) throw( css::uno::RuntimeException );
188 
189         //---------------------------------------------------------------------------------------------------------
190         //   XDispatchResultListener
191         //---------------------------------------------------------------------------------------------------------
192 
193         virtual void SAL_CALL dispatchFinished      ( const css::frame::DispatchResultEvent&                    aEvent     ) throw( css::uno::RuntimeException );
194 
195         //---------------------------------------------------------------------------------------------------------
196         //   XEventListener
197         //---------------------------------------------------------------------------------------------------------
198 
199         void SAL_CALL disposing( const css::lang::EventObject& aEvent ) throw( css::uno::RuntimeException );
200 
201     //-------------------------------------------------------------------------------------------------------------
202     //  protected methods
203     //-------------------------------------------------------------------------------------------------------------
204 
205     protected:
206 
207     //-------------------------------------------------------------------------------------------------------------
208     //  private methods
209     //-------------------------------------------------------------------------------------------------------------
210 
211     private:
212 
213         void impl_tryToLoadDocument();
214         sal_Bool impl_registerRemoteFactories( const css::uno::Reference< css::lang::XMultiServiceFactory >& xRemoteServiceManager );
215 
216     //-------------------------------------------------------------------------------------------------------------
217     //  debug methods
218     //  (should be private everyway!)
219     //-------------------------------------------------------------------------------------------------------------
220 
221         /*-****************************************************************************************************//**
222             @short      debug-method to check incoming parameter of some other mehods of this class
223             @descr      The following methods are used to check parameters for other methods
224                         of this class. The return value is used directly for an ASSERT(...).
225 
226             @seealso    ASSERTs in implementation!
227 
228             @param      references to checking variables
229             @return     sal_False on invalid parameter<BR>
230                         sal_True  otherway
231 
232             @onerror    -
233         *//*-*****************************************************************************************************/
234 
235     #ifdef ENABLE_ASSERTIONS
236 
237     private:
238 
239         static sal_Bool impldbg_checkParameter_initialize           (   const   css::uno::Sequence< css::uno::Any >&                    seqArguments            );
240         static sal_Bool impldbg_checkParameter_createWindow         (   const   css::uno::Any&                                          aPlatformWindowHandle   ,
241                                                                                 sal_Bool                                                bEmbedded               );
242         static sal_Bool impldbg_checkParameter_newStream            (   const   ::rtl::OUString&                                        sMIMEDescription        ,
243                                                                         const   ::rtl::OUString&                                        sURL                    ,
244                                                                         const   ::rtl::OUString&                                        sFilter                 ,
245                                                                         const   css::uno::Reference< css::io::XInputStream >&           xStream                 );
246         static sal_Bool impldbg_checkParameter_newURL               (   const   ::rtl::OUString&                                        sMIMEDescription        ,
247                                                                         const   ::rtl::OUString&                                        sURL                    ,
248                                                                         const   ::rtl::OUString&                                        sFilter                 );
249         static sal_Bool impldbg_checkParameter_getHttpServerURL     (           ::rtl::OUString&                                        sHost                   ,
250                                                                                 sal_uInt16&                                             nPort                   ,
251                                                                                 ::rtl::OUString&                                        sPrefix                 );
252         static sal_Bool impldbg_checkParameter_queryDispatch        (   const   css::util::URL&                                         aURL                    ,
253                                                                         const   ::rtl::OUString&                                        sTargetFrameName        ,
254                                                                                 sal_Int32                                               nSearchFlags            );
255         static sal_Bool impldbg_checkParameter_queryDispatches      (   const   css::uno::Sequence< css::frame::DispatchDescriptor >&   seqDescripts            );
256         static sal_Bool impldbg_checkParameter_statusChanged        (   const   css::frame::FeatureStateEvent&                          aEvent                  );
257         static sal_Bool impldbg_checkParameter_disposing            (   const   css::lang::EventObject&                                 aEvent                  );
258 
259     #endif  // #ifdef ENABLE_ASSERTIONS
260 
261     //-------------------------------------------------------------------------------------------------------------
262     //  variables
263     //  (should be private everyway!)
264     //-------------------------------------------------------------------------------------------------------------
265 
266     private:
267 
268         css::uno::Reference< css::mozilla::XPluginInstancePeer >            m_xPlugInInstancePeer   ;   /// Reference to UNO interface of PlugIn dll for communication with browser
269         css::uno::Reference< css::mozilla::XPluginWindowPeer >              m_xPlugInWindowPeer     ;   /// Reference to set child window at plugin window
270         css::uno::Sequence< css::beans::PropertyValue >                     m_seqProperties         ;   /// Sequence of properties as arguments for load document
271         css::util::URL                                                      m_aURL                  ;   /// URL for document to load
272         sal_Bool                                                            m_bILoad                ;   /// PlugInFrame has a valid loader which load the document and wait for finished/cancelled
273         sal_Bool                                                            m_bIHaveDocument        ;   /// We have a document loaded successful.
274         css::uno::Reference< css::frame::XDispatchProvider >                m_xPlugInDispatcher     ;   /// Dispatcher to forward dispatches to browser
275         static sal_Bool                                                     m_bRemoteFactoriesExist ;   /// indicates, if remote factories was already registered (neccessary one times only!)
276         SvtCommandOptions                                                   m_aCommandOptions       ;   /// ref counted class to support disabling commands defined by configuration file
277 
278 };      //  class PlugInFrame
279 
280 /*-************************************************************************************************************//**
281     @short      used to forward all asynchronous calls which use VCL internal to the main thread
282     @descr      We need this asynchronous mechanism to prevent us against dead locks. Sometimes our main thread
283                 can call us for event handling like FOCUS, ACTIVATE and something else. But at the same time we will call
284                 the main thread to CREATE A WINDOW, SET IT VISIBLE ... Then we have a problem. We must send us himself a event
285                 to run our code synchronized with our main thread!
286 
287     @implements
288     @base       -
289 *//*-*************************************************************************************************************/
290 
291 enum eIMPL_PluginCommand
292 {
293     START           ,
294     STOP            ,
295     CREATEWINDOW    ,
296     DESTROY         ,
297     NEWSTREAM       ,
298     NEWURL
299 };
300 
301 class cIMPL_MainThreadExecutorRequest
302 {
303     public:
304         cIMPL_MainThreadExecutorRequest(    eIMPL_PluginCommand                             eCommand                ,
305                                             PlugInFrame*                                    pPluginInstance         );
306 
307         cIMPL_MainThreadExecutorRequest(    eIMPL_PluginCommand                             eCommand                ,
308                                             PlugInFrame*                                    pPluginInstance         ,
309                                     const   css::uno::Any&                                  aPlatformWindowHandle   ,
310                                             sal_Bool                                        bEmbedded               );
311 
312         cIMPL_MainThreadExecutorRequest(    eIMPL_PluginCommand                             eCommand                ,
313                                             PlugInFrame*                                    pPluginInstance         ,
314                                     const   ::rtl::OUString&                                sMIMEDescription        ,
315                                     const   ::rtl::OUString&                                sURL                    ,
316                                     const   ::rtl::OUString&                                sFilter                 ,
317                                     const   css::uno::Reference< css::io::XInputStream >&   xStream                 ,
318                                     const   css::uno::Any&                                  aSessionId              );
319 
320         /*-****************************************************************************************************//**
321             @short      -
322             @descr      -
323 
324             @seealso    -
325 
326             @param      -
327             @return     -
328 
329             @onerror    -
330         *//*-*****************************************************************************************************/
331 
332         virtual long doIt();
333 
334     //-------------------------------------------------------------------------------------------------------------
335     //  private variables
336     //-------------------------------------------------------------------------------------------------------------
337     private:
338 
339         eIMPL_PluginCommand                             m_eCommand              ;   /// switch to specify forward function
340         PlugInFrame*                                    m_pPluginInstance       ;   /// instance wich has started this swicth mechanism and wish to called back from us
341         css::uno::Reference< css::uno::XInterface >     m_xPluginInstance       ;   /// reference to our plugin frame to prevent that plugin frame dies before we call back
342         css::uno::Any                                   m_aPlatformWindowHandle ;   /// parameter for XPluginInstance->createWindow()
343         sal_Bool                                        m_bEmbedded             ;   /// parameter for XPluginInstance->createWindow()
344         ::rtl::OUString                                 m_sMIMEDescription      ;   /// parameter for XPluginInstance->newStream()/newURL()
345         ::rtl::OUString                                 m_sURL                  ;   /// parameter for XPluginInstance->newStream()/newURL()
346         ::rtl::OUString                                 m_sFilter               ;   /// parameter for XPluginInstance->newStream()/newURL()
347         css::uno::Reference< css::io::XInputStream >    m_xStream               ;   /// parameter for XPluginInstance->newStream()/newURL()
348         css::uno::Any                                   m_aSessionId            ;   /// parameter for XPluginInstance->newStream()/newURL()
349 };
350 
351 class cIMPL_MainThreadExecutor
352 {
353     //-------------------------------------------------------------------------------------------------------------
354     //  public methods
355     //-------------------------------------------------------------------------------------------------------------
356     public:
357         static void execute( cIMPL_MainThreadExecutorRequest* pRequest );
358 
359         /*-****************************************************************************************************//**
360             @short      -
361             @descr      -
362 
363             @seealso    -
364 
365             @param      -
366             @return     -
367 
368             @onerror    -
369         *//*-*****************************************************************************************************/
370         DECL_STATIC_LINK( cIMPL_MainThreadExecutor, worker, cIMPL_MainThreadExecutorRequest* );
371 };
372 
373 }       //  namespace framework
374 
375 #endif  //  #ifndef __FRAMEWORK_SERVICES_PLUGINFRAME_HXX_
376