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 // MARKER(update_precomp.py): autogen include statement, do not remove 25 #include "precompiled_sdext.hxx" 26 27 #include "pdfihelper.hxx" 28 29 #include <com/sun/star/task/XInteractionHandler.hpp> 30 #include <com/sun/star/task/XInteractionRequest.hpp> 31 #include <com/sun/star/task/XInteractionPassword.hpp> 32 #include <com/sun/star/task/DocumentPasswordRequest.hpp> 33 34 #include <cppuhelper/exc_hlp.hxx> 35 #include <cppuhelper/compbase2.hxx> 36 #include <cppuhelper/basemutex.hxx> 37 38 39 using namespace com::sun::star; 40 41 namespace 42 { 43 44 typedef ::cppu::WeakComponentImplHelper2< 45 com::sun::star::task::XInteractionRequest, 46 com::sun::star::task::XInteractionPassword > PDFPasswordRequestBase; 47 48 class PDFPasswordRequest : private cppu::BaseMutex, 49 public PDFPasswordRequestBase 50 { 51 private: 52 task::DocumentPasswordRequest m_aRequest; 53 rtl::OUString m_aPassword; 54 bool m_bSelected; 55 56 public: 57 explicit PDFPasswordRequest(bool bFirstTry, const rtl::OUString& rName); 58 59 // XInteractionRequest 60 virtual uno::Any SAL_CALL getRequest( ) throw (uno::RuntimeException); 61 virtual uno::Sequence< uno::Reference< task::XInteractionContinuation > > SAL_CALL getContinuations( ) throw (uno::RuntimeException); 62 63 // XInteractionPassword 64 virtual void SAL_CALL setPassword( const rtl::OUString& rPwd ) throw (uno::RuntimeException); 65 virtual rtl::OUString SAL_CALL getPassword() throw (uno::RuntimeException); 66 67 // XInteractionContinuation 68 virtual void SAL_CALL select() throw (uno::RuntimeException); 69 70 bool isSelected() const { osl::MutexGuard const guard( m_aMutex ); return m_bSelected; } 71 }; 72 73 PDFPasswordRequest::PDFPasswordRequest( bool bFirstTry, const rtl::OUString& rName ) : 74 PDFPasswordRequestBase( m_aMutex ), 75 m_aRequest(), 76 m_aPassword(), 77 m_bSelected(false) 78 { 79 m_aRequest.Mode = bFirstTry ? 80 task::PasswordRequestMode_PASSWORD_ENTER : 81 task::PasswordRequestMode_PASSWORD_REENTER; 82 m_aRequest.Classification = task::InteractionClassification_QUERY; 83 m_aRequest.Name = rName; 84 } 85 86 uno::Any SAL_CALL PDFPasswordRequest::getRequest() throw (uno::RuntimeException) 87 { 88 osl::MutexGuard const guard( m_aMutex ); 89 90 uno::Any aRet; 91 aRet <<= m_aRequest; 92 return aRet; 93 } 94 95 uno::Sequence< uno::Reference< task::XInteractionContinuation > > SAL_CALL PDFPasswordRequest::getContinuations() throw (uno::RuntimeException) 96 { 97 osl::MutexGuard const guard( m_aMutex ); 98 99 uno::Sequence< uno::Reference< task::XInteractionContinuation > > aRet( 1 ); 100 aRet.getArray()[0] = static_cast<task::XInteractionContinuation*>(this); 101 return aRet; 102 } 103 104 void SAL_CALL PDFPasswordRequest::setPassword( const rtl::OUString& rPwd ) throw (uno::RuntimeException) 105 { 106 osl::MutexGuard const guard( m_aMutex ); 107 108 m_aPassword = rPwd; 109 } 110 111 rtl::OUString SAL_CALL PDFPasswordRequest::getPassword() throw (uno::RuntimeException) 112 { 113 osl::MutexGuard const guard( m_aMutex ); 114 115 return m_aPassword; 116 } 117 118 void SAL_CALL PDFPasswordRequest::select() throw (uno::RuntimeException) 119 { 120 osl::MutexGuard const guard( m_aMutex ); 121 122 m_bSelected = true; 123 } 124 125 } // namespace 126 127 namespace pdfi 128 { 129 130 bool getPassword( const uno::Reference< task::XInteractionHandler >& xHandler, 131 rtl::OUString& rOutPwd, 132 bool bFirstTry, 133 const rtl::OUString& rDocName 134 ) 135 { 136 bool bSuccess = false; 137 138 PDFPasswordRequest* pRequest; 139 uno::Reference< task::XInteractionRequest > xReq( 140 pRequest = new PDFPasswordRequest( bFirstTry, rDocName ) ); 141 try 142 { 143 xHandler->handle( xReq ); 144 } 145 catch( uno::Exception& ) 146 { 147 } 148 149 OSL_TRACE( "request %s selected\n", pRequest->isSelected() ? "was" : "was not" ); 150 if( pRequest->isSelected() ) 151 { 152 bSuccess = true; 153 rOutPwd = pRequest->getPassword(); 154 } 155 156 return bSuccess; 157 } 158 159 } 160