1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_dbaccess.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski #include "docinteraction.hxx"
28*b1cdbd2cSJim Jagielski 
29*b1cdbd2cSJim Jagielski /** === begin UNO includes === **/
30*b1cdbd2cSJim Jagielski #include <com/sun/star/frame/XModel.hpp>
31*b1cdbd2cSJim Jagielski #include <com/sun/star/task/DocumentPasswordRequest.hpp>
32*b1cdbd2cSJim Jagielski /** === end UNO includes === **/
33*b1cdbd2cSJim Jagielski 
34*b1cdbd2cSJim Jagielski #include <comphelper/componentcontext.hxx>
35*b1cdbd2cSJim Jagielski #include <comphelper/namedvaluecollection.hxx>
36*b1cdbd2cSJim Jagielski #include <comphelper/interaction.hxx>
37*b1cdbd2cSJim Jagielski #include <rtl/ref.hxx>
38*b1cdbd2cSJim Jagielski #include <tools/diagnose_ex.h>
39*b1cdbd2cSJim Jagielski 
40*b1cdbd2cSJim Jagielski //........................................................................
41*b1cdbd2cSJim Jagielski namespace dbmm
42*b1cdbd2cSJim Jagielski {
43*b1cdbd2cSJim Jagielski //........................................................................
44*b1cdbd2cSJim Jagielski 
45*b1cdbd2cSJim Jagielski 	/** === begin UNO using === **/
46*b1cdbd2cSJim Jagielski 	using ::com::sun::star::uno::Reference;
47*b1cdbd2cSJim Jagielski 	using ::com::sun::star::uno::XInterface;
48*b1cdbd2cSJim Jagielski 	using ::com::sun::star::uno::UNO_QUERY;
49*b1cdbd2cSJim Jagielski 	using ::com::sun::star::uno::UNO_QUERY_THROW;
50*b1cdbd2cSJim Jagielski 	using ::com::sun::star::uno::UNO_SET_THROW;
51*b1cdbd2cSJim Jagielski 	using ::com::sun::star::uno::Exception;
52*b1cdbd2cSJim Jagielski 	using ::com::sun::star::uno::RuntimeException;
53*b1cdbd2cSJim Jagielski 	using ::com::sun::star::uno::Any;
54*b1cdbd2cSJim Jagielski 	using ::com::sun::star::uno::makeAny;
55*b1cdbd2cSJim Jagielski     using ::com::sun::star::task::XInteractionHandler;
56*b1cdbd2cSJim Jagielski     using ::com::sun::star::frame::XModel;
57*b1cdbd2cSJim Jagielski     using ::com::sun::star::task::DocumentPasswordRequest;
58*b1cdbd2cSJim Jagielski     using ::com::sun::star::task::InteractionClassification_QUERY;
59*b1cdbd2cSJim Jagielski     using ::com::sun::star::task::PasswordRequestMode_PASSWORD_ENTER;
60*b1cdbd2cSJim Jagielski     using ::com::sun::star::task::PasswordRequestMode_PASSWORD_REENTER;
61*b1cdbd2cSJim Jagielski 	/** === end UNO using === **/
62*b1cdbd2cSJim Jagielski 
63*b1cdbd2cSJim Jagielski 	//====================================================================
64*b1cdbd2cSJim Jagielski 	//= InteractionHandler_Data
65*b1cdbd2cSJim Jagielski 	//====================================================================
66*b1cdbd2cSJim Jagielski     struct InteractionHandler_Data
67*b1cdbd2cSJim Jagielski     {
68*b1cdbd2cSJim Jagielski         Reference< XInteractionHandler >    xHandler;
69*b1cdbd2cSJim Jagielski 
InteractionHandler_Datadbmm::InteractionHandler_Data70*b1cdbd2cSJim Jagielski         InteractionHandler_Data( const Reference< XInteractionHandler >& _rxHandler )
71*b1cdbd2cSJim Jagielski             :xHandler( _rxHandler )
72*b1cdbd2cSJim Jagielski         {
73*b1cdbd2cSJim Jagielski         }
74*b1cdbd2cSJim Jagielski 
InteractionHandler_Datadbmm::InteractionHandler_Data75*b1cdbd2cSJim Jagielski         InteractionHandler_Data( const ::comphelper::ComponentContext& _rContext )
76*b1cdbd2cSJim Jagielski             :xHandler( _rContext.createComponent( "com.sun.star.task.InteractionHandler" ), UNO_QUERY_THROW )
77*b1cdbd2cSJim Jagielski         {
78*b1cdbd2cSJim Jagielski         }
79*b1cdbd2cSJim Jagielski     };
80*b1cdbd2cSJim Jagielski 
81*b1cdbd2cSJim Jagielski 	//====================================================================
82*b1cdbd2cSJim Jagielski 	//= InteractionHandler
83*b1cdbd2cSJim Jagielski 	//====================================================================
84*b1cdbd2cSJim Jagielski 	//--------------------------------------------------------------------
InteractionHandler(const::comphelper::ComponentContext & _rContext,const Reference<XModel> & _rxDocument)85*b1cdbd2cSJim Jagielski     InteractionHandler::InteractionHandler( const ::comphelper::ComponentContext& _rContext, const Reference< XModel >& _rxDocument )
86*b1cdbd2cSJim Jagielski         :m_pData( new InteractionHandler_Data( _rContext ) )
87*b1cdbd2cSJim Jagielski     {
88*b1cdbd2cSJim Jagielski         // check whether the doumentc has an own interaction handler set
89*b1cdbd2cSJim Jagielski         ::comphelper::NamedValueCollection aDocArgs( _rxDocument->getArgs() );
90*b1cdbd2cSJim Jagielski         m_pData->xHandler = aDocArgs.getOrDefault( "InteractionHandler", m_pData->xHandler );
91*b1cdbd2cSJim Jagielski     }
92*b1cdbd2cSJim Jagielski 
93*b1cdbd2cSJim Jagielski 	//--------------------------------------------------------------------
~InteractionHandler()94*b1cdbd2cSJim Jagielski     InteractionHandler::~InteractionHandler()
95*b1cdbd2cSJim Jagielski     {
96*b1cdbd2cSJim Jagielski     }
97*b1cdbd2cSJim Jagielski 
98*b1cdbd2cSJim Jagielski 	//--------------------------------------------------------------------
requestDocumentPassword(const::rtl::OUString & _rDocumentName,::rtl::OUString & _io_rPassword)99*b1cdbd2cSJim Jagielski     bool InteractionHandler::requestDocumentPassword( const ::rtl::OUString& _rDocumentName, ::rtl::OUString& _io_rPassword )
100*b1cdbd2cSJim Jagielski     {
101*b1cdbd2cSJim Jagielski         // create request
102*b1cdbd2cSJim Jagielski         DocumentPasswordRequest aRequest(
103*b1cdbd2cSJim Jagielski             ::rtl::OUString(), NULL,
104*b1cdbd2cSJim Jagielski             InteractionClassification_QUERY,
105*b1cdbd2cSJim Jagielski             _io_rPassword.getLength() ? PasswordRequestMode_PASSWORD_REENTER : PasswordRequestMode_PASSWORD_ENTER,
106*b1cdbd2cSJim Jagielski             _rDocumentName
107*b1cdbd2cSJim Jagielski         );
108*b1cdbd2cSJim Jagielski 
109*b1cdbd2cSJim Jagielski         ::rtl::Reference< ::comphelper::OInteractionRequest > pRequest( new ::comphelper::OInteractionRequest( makeAny( aRequest ) ) );
110*b1cdbd2cSJim Jagielski         ::rtl::Reference< ::comphelper::OInteractionPassword > pPassword( new ::comphelper::OInteractionPassword( _io_rPassword ) );
111*b1cdbd2cSJim Jagielski         ::rtl::Reference< ::comphelper::OInteractionAbort > pAbort( new ::comphelper::OInteractionAbort );
112*b1cdbd2cSJim Jagielski         pRequest->addContinuation( pPassword.get() );
113*b1cdbd2cSJim Jagielski         pRequest->addContinuation( pAbort.get() );
114*b1cdbd2cSJim Jagielski 
115*b1cdbd2cSJim Jagielski         // handle
116*b1cdbd2cSJim Jagielski         m_pData->xHandler->handle( pRequest.get() );
117*b1cdbd2cSJim Jagielski 
118*b1cdbd2cSJim Jagielski         // finish up
119*b1cdbd2cSJim Jagielski         if ( pAbort->wasSelected() )
120*b1cdbd2cSJim Jagielski             return false;
121*b1cdbd2cSJim Jagielski 
122*b1cdbd2cSJim Jagielski         _io_rPassword = pPassword->getPassword();
123*b1cdbd2cSJim Jagielski         return true;
124*b1cdbd2cSJim Jagielski     }
125*b1cdbd2cSJim Jagielski 
126*b1cdbd2cSJim Jagielski 	//--------------------------------------------------------------------
reportError(const Any & _rError)127*b1cdbd2cSJim Jagielski     void InteractionHandler::reportError( const Any& _rError )
128*b1cdbd2cSJim Jagielski     {
129*b1cdbd2cSJim Jagielski         ::rtl::Reference< ::comphelper::OInteractionRequest > pRequest( new ::comphelper::OInteractionRequest( _rError ) );
130*b1cdbd2cSJim Jagielski         ::rtl::Reference< ::comphelper::OInteractionApprove > pApprove( new ::comphelper::OInteractionApprove );
131*b1cdbd2cSJim Jagielski         pRequest->addContinuation( pApprove.get() );
132*b1cdbd2cSJim Jagielski 
133*b1cdbd2cSJim Jagielski         m_pData->xHandler->handle( pRequest.get() );
134*b1cdbd2cSJim Jagielski     }
135*b1cdbd2cSJim Jagielski 
136*b1cdbd2cSJim Jagielski //........................................................................
137*b1cdbd2cSJim Jagielski } // namespace dbmm
138*b1cdbd2cSJim Jagielski //........................................................................
139