diff options
Diffstat (limited to 'cui/source/options/webconninfo.cxx')
-rw-r--r-- | cui/source/options/webconninfo.cxx | 377 |
1 files changed, 377 insertions, 0 deletions
diff --git a/cui/source/options/webconninfo.cxx b/cui/source/options/webconninfo.cxx new file mode 100644 index 000000000000..162758a524fe --- /dev/null +++ b/cui/source/options/webconninfo.cxx @@ -0,0 +1,377 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: webconninfo.cxx,v $ + * $Revision: 1.3 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_cui.hxx" + +// include --------------------------------------------------------------- +#include <dialmgr.hxx> +#include <cuires.hrc> +#include <com/sun/star/task/UrlRecord.hpp> +#include <com/sun/star/task/XPasswordContainer.hpp> +#include <com/sun/star/task/XMasterPasswordHandling.hpp> +#include "com/sun/star/task/XUrlContainer.hpp" +#include <comphelper/processfactory.hxx> +#include <comphelper/docpasswordrequest.hxx> +#include "webconninfo.hxx" +#include "webconninfo.hrc" + +using namespace ::com::sun::star; + +//........................................................................ +namespace svx +{ +//........................................................................ + +// class PasswordTable --------------------------------------------------- + +PasswordTable::PasswordTable( Window* pParent, const ResId& rResId ) : + SvxSimpleTable( pParent, rResId ) +{ + SetWindowBits( GetStyle() | WB_NOINITIALSELECTION ); +} + +void PasswordTable::InsertHeaderItem( USHORT nColumn, const String& rText, HeaderBarItemBits nBits ) +{ + GetTheHeaderBar()->InsertItem( nColumn, rText, 0, nBits ); +} + +void PasswordTable::ResetTabs() +{ + SetTabs(); +} + +void PasswordTable::Resort( bool bForced ) +{ + USHORT nColumn = GetSelectedCol(); + if ( 0 == nColumn || bForced ) // only the first column is sorted + { + HeaderBarItemBits nBits = GetTheHeaderBar()->GetItemBits(1); + BOOL bUp = ( ( nBits & HIB_UPARROW ) == HIB_UPARROW ); + SvSortMode eMode = SortAscending; + + if ( bUp ) + { + nBits &= ~HIB_UPARROW; + nBits |= HIB_DOWNARROW; + eMode = SortDescending; + } + else + { + nBits &= ~HIB_DOWNARROW; + nBits |= HIB_UPARROW; + } + GetTheHeaderBar()->SetItemBits( 1, nBits ); + SvTreeList* pListModel = GetModel(); + pListModel->SetSortMode( eMode ); + pListModel->Resort(); + } +} + +// class WebConnectionInfoDialog ----------------------------------------- + +// ----------------------------------------------------------------------- +WebConnectionInfoDialog::WebConnectionInfoDialog( Window* pParent ) : + ModalDialog( pParent, CUI_RES( RID_SVXDLG_WEBCONNECTION_INFO ) ) + ,m_aNeverShownFI ( this, CUI_RES( FI_NEVERSHOWN ) ) + ,m_aPasswordsLB ( this, CUI_RES( LB_PASSWORDS ) ) + ,m_aRemoveBtn ( this, CUI_RES( PB_REMOVE ) ) + ,m_aRemoveAllBtn ( this, CUI_RES( PB_REMOVEALL ) ) + ,m_aChangeBtn ( this, CUI_RES( PB_CHANGE ) ) + ,m_aButtonsFL ( this, CUI_RES( FL_BUTTONS ) ) + ,m_aCloseBtn ( this, CUI_RES( PB_CLOSE ) ) + ,m_aHelpBtn ( this, CUI_RES( PB_HELP ) ) + ,m_nPos ( -1 ) +{ + static long aStaticTabs[]= { 3, 0, 150, 250 }; + m_aPasswordsLB.SetTabs( aStaticTabs ); + m_aPasswordsLB.InsertHeaderItem( 1, CUI_RESSTR( STR_WEBSITE ), + HIB_LEFT | HIB_VCENTER | HIB_FIXEDPOS | HIB_CLICKABLE | HIB_UPARROW ); + m_aPasswordsLB.InsertHeaderItem( 2, CUI_RESSTR( STR_USERNAME ), + HIB_LEFT | HIB_VCENTER | HIB_FIXEDPOS ); + m_aPasswordsLB.ResetTabs(); + + FreeResource(); + + m_aPasswordsLB.SetHeaderBarClickHdl( LINK( this, WebConnectionInfoDialog, HeaderBarClickedHdl ) ); + m_aRemoveBtn.SetClickHdl( LINK( this, WebConnectionInfoDialog, RemovePasswordHdl ) ); + m_aRemoveAllBtn.SetClickHdl( LINK( this, WebConnectionInfoDialog, RemoveAllPasswordsHdl ) ); + m_aChangeBtn.SetClickHdl( LINK( this, WebConnectionInfoDialog, ChangePasswordHdl ) ); + + // one button too small for its text? + sal_Int32 i = 0; + long nBtnTextWidth = 0; + Window* pButtons[] = { &m_aRemoveBtn, &m_aRemoveAllBtn, &m_aChangeBtn }; + Window** pButton = pButtons; + const sal_Int32 nBCount = sizeof( pButtons ) / sizeof( pButtons[ 0 ] ); + for ( ; i < nBCount; ++i, ++pButton ) + { + long nTemp = (*pButton)->GetCtrlTextWidth( (*pButton)->GetText() ); + if ( nTemp > nBtnTextWidth ) + nBtnTextWidth = nTemp; + } + nBtnTextWidth = nBtnTextWidth * 115 / 100; // a little offset + long nButtonWidth = m_aRemoveBtn.GetSizePixel().Width(); + if ( nBtnTextWidth > nButtonWidth ) + { + // so make the buttons broader and its control in front of it smaller + long nDelta = nBtnTextWidth - nButtonWidth; + pButton = pButtons; + for ( i = 0; i < nBCount; ++i, ++pButton ) + { + Point aNewPos = (*pButton)->GetPosPixel(); + if ( &m_aRemoveAllBtn == (*pButton) ) + aNewPos.X() += nDelta; + else if ( &m_aChangeBtn == (*pButton) ) + aNewPos.X() -= nDelta; + Size aNewSize = (*pButton)->GetSizePixel(); + aNewSize.Width() += nDelta; + (*pButton)->SetPosSizePixel( aNewPos, aNewSize ); + } + } + + FillPasswordList(); + + m_aRemoveBtn.SetClickHdl( LINK( this, WebConnectionInfoDialog, RemovePasswordHdl ) ); + m_aRemoveAllBtn.SetClickHdl( LINK( this, WebConnectionInfoDialog, RemoveAllPasswordsHdl ) ); + m_aChangeBtn.SetClickHdl( LINK( this, WebConnectionInfoDialog, ChangePasswordHdl ) ); + m_aPasswordsLB.SetSelectHdl( LINK( this, WebConnectionInfoDialog, EntrySelectedHdl ) ); + + m_aRemoveBtn.Enable( FALSE ); + m_aChangeBtn.Enable( FALSE ); + + HeaderBarClickedHdl( NULL ); +} + +// ----------------------------------------------------------------------- +WebConnectionInfoDialog::~WebConnectionInfoDialog() +{ +} + +// ----------------------------------------------------------------------- +IMPL_LINK( WebConnectionInfoDialog, HeaderBarClickedHdl, SvxSimpleTable*, pTable ) +{ + m_aPasswordsLB.Resort( NULL == pTable ); + return 0; +} + +// ----------------------------------------------------------------------- +void WebConnectionInfoDialog::FillPasswordList() +{ + try + { + uno::Reference< task::XMasterPasswordHandling > xMasterPasswd( + comphelper::getProcessServiceFactory()->createInstance( + rtl::OUString( RTL_CONSTASCII_USTRINGPARAM ( "com.sun.star.task.PasswordContainer" ) ) ), + uno::UNO_QUERY ); + + if ( xMasterPasswd.is() && xMasterPasswd->isPersistentStoringAllowed() ) + { + uno::Reference< task::XPasswordContainer > xPasswdContainer( xMasterPasswd, uno::UNO_QUERY_THROW ); + uno::Reference< task::XInteractionHandler > xInteractionHandler( + comphelper::getProcessServiceFactory()->createInstance( + rtl::OUString( RTL_CONSTASCII_USTRINGPARAM ( "com.sun.star.task.InteractionHandler" ) ) ), + uno::UNO_QUERY_THROW ); + + uno::Sequence< task::UrlRecord > aURLEntries = xPasswdContainer->getAllPersistent( xInteractionHandler ); + sal_Int32 nCount = 0; + for ( sal_Int32 nURLInd = 0; nURLInd < aURLEntries.getLength(); nURLInd++ ) + { + for ( sal_Int32 nUserInd = 0; nUserInd < aURLEntries[nURLInd].UserList.getLength(); nUserInd++ ) + { + ::rtl::OUString aUIEntry( aURLEntries[nURLInd].Url ); + aUIEntry += ::rtl::OUString::valueOf( (sal_Unicode)'\t' ); + aUIEntry += aURLEntries[nURLInd].UserList[nUserInd].UserName; + SvLBoxEntry* pEntry = m_aPasswordsLB.InsertEntry( aUIEntry ); + pEntry->SetUserData( (void*)(nCount++) ); + } + } + + // remember pos of first url container entry. + m_nPos = nCount; + + uno::Reference< task::XUrlContainer > xUrlContainer( + xPasswdContainer, uno::UNO_QUERY_THROW ); + + uno::Sequence< rtl::OUString > aUrls + = xUrlContainer->getUrls( sal_True /* OnlyPersistent */ ); + + for ( sal_Int32 nURLIdx = 0; nURLIdx < aUrls.getLength(); nURLIdx++ ) + { + ::rtl::OUString aUIEntry( aUrls[ nURLIdx ] ); + aUIEntry += ::rtl::OUString::valueOf( (sal_Unicode)'\t' ); + aUIEntry += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "*" ) ); + SvLBoxEntry* pEntry = m_aPasswordsLB.InsertEntry( aUIEntry ); + pEntry->SetUserData( (void*)(nCount++) ); + } + } + } + catch( uno::Exception& ) + {} +} + +// ----------------------------------------------------------------------- +IMPL_LINK( WebConnectionInfoDialog, RemovePasswordHdl, PushButton*, EMPTYARG ) +{ + try + { + SvLBoxEntry* pEntry = m_aPasswordsLB.GetCurEntry(); + if ( pEntry ) + { + ::rtl::OUString aURL = m_aPasswordsLB.GetEntryText( pEntry, 0 ); + ::rtl::OUString aUserName = m_aPasswordsLB.GetEntryText( pEntry, 1 ); + + uno::Reference< task::XPasswordContainer > xPasswdContainer( + comphelper::getProcessServiceFactory()->createInstance( + rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( + "com.sun.star.task.PasswordContainer" ) ) ), + uno::UNO_QUERY_THROW ); + + sal_Int32 nPos = (sal_Int32)(sal_IntPtr)pEntry->GetUserData(); + if ( nPos < m_nPos ) + { + xPasswdContainer->removePersistent( aURL, aUserName ); + } + else + { + uno::Reference< task::XUrlContainer > xUrlContainer( + xPasswdContainer, uno::UNO_QUERY_THROW ); + xUrlContainer->removeUrl( aURL ); + } + m_aPasswordsLB.RemoveEntry( pEntry ); + } + } + catch( uno::Exception& ) + {} + + return 0; +} + +// ----------------------------------------------------------------------- +IMPL_LINK( WebConnectionInfoDialog, RemoveAllPasswordsHdl, PushButton*, EMPTYARG ) +{ + try + { + uno::Reference< task::XPasswordContainer > xPasswdContainer( + comphelper::getProcessServiceFactory()->createInstance( + rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( + "com.sun.star.task.PasswordContainer" ) ) ), + uno::UNO_QUERY_THROW ); + + // should the master password be requested before? + xPasswdContainer->removeAllPersistent(); + + uno::Reference< task::XUrlContainer > xUrlContainer( + xPasswdContainer, uno::UNO_QUERY_THROW ); + uno::Sequence< rtl::OUString > aUrls + = xUrlContainer->getUrls( sal_True /* OnlyPersistent */ ); + for ( sal_Int32 nURLIdx = 0; nURLIdx < aUrls.getLength(); nURLIdx++ ) + xUrlContainer->removeUrl( aUrls[ nURLIdx ] ); + + m_aPasswordsLB.Clear(); + } + catch( uno::Exception& ) + {} + + return 0; +} + +// ----------------------------------------------------------------------- +IMPL_LINK( WebConnectionInfoDialog, ChangePasswordHdl, PushButton*, EMPTYARG ) +{ + try + { + SvLBoxEntry* pEntry = m_aPasswordsLB.GetCurEntry(); + if ( pEntry ) + { + ::rtl::OUString aURL = m_aPasswordsLB.GetEntryText( pEntry, 0 ); + ::rtl::OUString aUserName = m_aPasswordsLB.GetEntryText( pEntry, 1 ); + + ::comphelper::DocPasswordRequest* pPasswordRequest + = new ::comphelper::DocPasswordRequest( + ::comphelper::DocPasswordRequestType_STANDARD, + task::PasswordRequestMode_PASSWORD_CREATE, aURL ); + uno::Reference< task::XInteractionRequest > rRequest( pPasswordRequest ); + + uno::Reference< task::XInteractionHandler > xInteractionHandler( + comphelper::getProcessServiceFactory()->createInstance( + rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( + "com.sun.star.task.InteractionHandler" ) ) ), + uno::UNO_QUERY_THROW ); + xInteractionHandler->handle( rRequest ); + + if ( pPasswordRequest->isPassword() ) + { + String aNewPass = pPasswordRequest->getPassword(); + uno::Sequence< ::rtl::OUString > aPasswd( 1 ); + aPasswd[0] = aNewPass; + + uno::Reference< task::XPasswordContainer > xPasswdContainer( + comphelper::getProcessServiceFactory()->createInstance( + rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( + "com.sun.star.task.PasswordContainer" ) ) ), + uno::UNO_QUERY_THROW ); + xPasswdContainer->addPersistent( + aURL, aUserName, aPasswd, xInteractionHandler ); + } + } + } + catch( uno::Exception& ) + {} + + return 0; +} + +// ----------------------------------------------------------------------- +IMPL_LINK( WebConnectionInfoDialog, EntrySelectedHdl, void*, EMPTYARG ) +{ + SvLBoxEntry* pEntry = m_aPasswordsLB.GetCurEntry(); + if ( !pEntry ) + { + m_aRemoveBtn.Enable( FALSE ); + m_aChangeBtn.Enable( FALSE ); + } + else + { + m_aRemoveBtn.Enable( TRUE ); + + // url container entries (-> use system credentials) have + // no password + sal_Int32 nPos = (sal_Int32)(sal_IntPtr)pEntry->GetUserData(); + m_aChangeBtn.Enable( nPos < m_nPos ); + } + + return 0; +} + +//........................................................................ +} // namespace svx +//........................................................................ + |