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 #ifndef __FRAMEWORK_PATTERN_FRAME_HXX_
25 #define __FRAMEWORK_PATTERN_FRAME_HXX_
26 
27 //_______________________________________________
28 // own includes
29 
30 #include <general.h>
31 
32 //_______________________________________________
33 // interface includes
34 #include <com/sun/star/frame/XFrame.hpp>
35 #include <com/sun/star/frame/XController.hpp>
36 #include <com/sun/star/frame/XModel.hpp>
37 #include <com/sun/star/lang/XComponent.hpp>
38 #include <com/sun/star/lang/DisposedException.hpp>
39 #include <com/sun/star/util/XCloseable.hpp>
40 
41 //_______________________________________________
42 // other includes
43 
44 //_______________________________________________
45 // namespaces
46 
47 #ifndef css
48 namespace css = ::com::sun::star;
49 #endif
50 
51 namespace framework{
52     namespace pattern{
53         namespace frame{
54 
55 //_______________________________________________
56 // definitions
57 
58 //-----------------------------------------------
59 inline css::uno::Reference< css::frame::XModel > extractFrameModel(const css::uno::Reference< css::frame::XFrame >& xFrame)
60 {
61     css::uno::Reference< css::frame::XModel >      xModel;
62     css::uno::Reference< css::frame::XController > xController;
63     if (xFrame.is())
64         xController = xFrame->getController();
65     if (xController.is())
66         xModel = xController->getModel();
67     return xModel;
68 }
69 
70 //-----------------------------------------------
71 /** @short  close (or dispose) the given resource.
72 
73     @descr  It try to close the given resource first.
74             Delegating of the ownership can be influenced from
75             outside. If closing isn't possible (because the
76             needed interface isn't available) dispose() is tried instead.
77             Al possible exception are handled inside.
78             So the user of this method has to look for the return value only.
79 
80     @attention  The given resource will not be cleared.
81                 But later using of it can produce an exception!
82 
83     @param  xResource
84             the object, which should be closed here.
85 
86     @param  bDelegateOwnerShip
87             used at the XCloseable->close() method to define
88             the right owner in case closing failed.
89 
90     @return [bool]
91             sal_True if closing failed.
92  */
93 inline sal_Bool closeIt(const css::uno::Reference< css::uno::XInterface >& xResource         ,
94                        sal_Bool                                     bDelegateOwnerShip)
95 {
96     css::uno::Reference< css::util::XCloseable > xClose  (xResource, css::uno::UNO_QUERY);
97     css::uno::Reference< css::lang::XComponent > xDispose(xResource, css::uno::UNO_QUERY);
98 
99     try
100     {
101         if (xClose.is())
102             xClose->close(bDelegateOwnerShip);
103         else
104         if (xDispose.is())
105             xDispose->dispose();
106         else
107             return sal_False;
108     }
109     catch(const css::util::CloseVetoException&)
110         { return sal_False; }
111     catch(const css::lang::DisposedException&)
112         {} // disposed is closed is ...
113     catch(const css::uno::RuntimeException&)
114         { throw; } // shouldn't be suppressed!
115     catch(const css::uno::Exception&)
116         { return sal_False;  } // ??? We defined to return a boolen value instead of throwing exceptions ...
117                                // (OK: RuntimeExceptions shouldn't be catched inside the core ..)
118 
119     return sal_True;
120 }
121 
122         } // namespace frame
123     } // namespace pattern
124 } // namespace framework
125 
126 #endif // __FRAMEWORK_PATTERN_FRAME_HXX_
127