From b61970cfbe12722efd6218db6489980381b8783d Mon Sep 17 00:00:00 2001 From: Cao Cuong Ngo Date: Thu, 12 Sep 2013 15:27:37 +0200 Subject: Cmis Versions dialog Change-Id: Ie863282062a6932a55543143e841917c54223ac9 Reviewed-on: https://gerrit.libreoffice.org/5925 Reviewed-by: Bosdonnat Cedric Tested-by: Bosdonnat Cedric --- include/sfx2/objsh.hxx | 2 + include/sfx2/sfxbasemodel.hxx | 4 + offapi/UnoApi_offapi.mk | 1 + offapi/com/sun/star/document/CmisVersion.idl | 52 ++++ offapi/com/sun/star/document/XCmisDocument.idl | 3 + sfx2/UIConfig_sfx.mk | 1 + sfx2/source/dialog/versdlg.cxx | 111 +++++++- sfx2/source/doc/objserv.cxx | 15 ++ sfx2/source/doc/sfxbasemodel.cxx | 23 ++ sfx2/source/inc/versdlg.hxx | 24 ++ sfx2/uiconfig/ui/versionscmis.ui | 340 +++++++++++++++++++++++++ sfx2/uiconfig/ui/versionsofdialog.ui | 16 +- ucb/source/ucp/cmis/cmis_content.cxx | 47 ++++ ucb/source/ucp/cmis/cmis_content.hxx | 5 + 14 files changed, 642 insertions(+), 2 deletions(-) create mode 100644 offapi/com/sun/star/document/CmisVersion.idl create mode 100644 sfx2/uiconfig/ui/versionscmis.ui diff --git a/include/sfx2/objsh.hxx b/include/sfx2/objsh.hxx index 4d530d98a047..ee2ff1243a66 100644 --- a/include/sfx2/objsh.hxx +++ b/include/sfx2/objsh.hxx @@ -37,6 +37,7 @@ #include #include #include +#include #include //________________________________________________________________________________________________________________ @@ -714,6 +715,7 @@ public: SAL_DLLPRIVATE void CheckOut( ); SAL_DLLPRIVATE void CancelCheckOut( ); SAL_DLLPRIVATE void CheckIn( ); + SAL_DLLPRIVATE ::com::sun::star::uno::Sequence< ::com::sun::star::document::CmisVersion > GetCmisVersions(); }; #define SFX_GLOBAL_CLASSID \ diff --git a/include/sfx2/sfxbasemodel.hxx b/include/sfx2/sfxbasemodel.hxx index 084a0f3c3c36..fde9aa0e8125 100644 --- a/include/sfx2/sfxbasemodel.hxx +++ b/include/sfx2/sfxbasemodel.hxx @@ -33,6 +33,7 @@ #include #include #include +#include #include #include #include @@ -1321,6 +1322,9 @@ public: css::document::CmisProperty >& _cmisproperties ) throw (css::uno::RuntimeException); + virtual css::uno::Sequence< css::document::CmisVersion > SAL_CALL getAllVersions ( ) + throw (css::uno::RuntimeException ); + virtual void SAL_CALL checkOut( ) throw ( css::uno::RuntimeException ); virtual void SAL_CALL cancelCheckOut( ) throw ( css::uno::RuntimeException ); virtual void SAL_CALL checkIn( sal_Bool bIsMajor, const OUString & rMessage ) diff --git a/offapi/UnoApi_offapi.mk b/offapi/UnoApi_offapi.mk index be91841f83ad..c97bf4196caa 100644 --- a/offapi/UnoApi_offapi.mk +++ b/offapi/UnoApi_offapi.mk @@ -2160,6 +2160,7 @@ $(eval $(call gb_UnoApi_add_idlfiles,offapi,com/sun/star/document,\ BrokenPackageRequest \ ChangedByOthersRequest \ CmisProperty \ + CmisVersion \ CorruptedFilterConfigurationException \ DocumentEvent \ EmptyUndoStackException \ diff --git a/offapi/com/sun/star/document/CmisVersion.idl b/offapi/com/sun/star/document/CmisVersion.idl new file mode 100644 index 000000000000..81712830a34a --- /dev/null +++ b/offapi/com/sun/star/document/CmisVersion.idl @@ -0,0 +1,52 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +#ifndef __com_sun_star_document_CmisVersion_idl__ +#define __com_sun_star_document_CmisVersion_idl__ + +#include + +module com { module sun { module star { module document { + +/** specifies a CMIS document version. + */ +struct CmisVersion +{ + /** unique ID of the Cmis version + */ + string Id; + + /** specifies the time when the revision was created. + */ + util::DateTime TimeStamp; + + /** contains the author that created the version. + */ + string Author; + + /** contains the comment the author has left. + */ + string Comment; +}; + + +}; }; }; }; + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/offapi/com/sun/star/document/XCmisDocument.idl b/offapi/com/sun/star/document/XCmisDocument.idl index 4e34a0f9dbc4..0f6ef8f6e933 100644 --- a/offapi/com/sun/star/document/XCmisDocument.idl +++ b/offapi/com/sun/star/document/XCmisDocument.idl @@ -10,6 +10,7 @@ #define __com_sun_star_document_XCmisDocument_idl__ #include +#include #include module com { module sun { module star { module document { @@ -46,6 +47,8 @@ interface XCmisDocument : com::sun::star::uno::XInterface void updateCmisProperties( [in] sequence cmisProperties ); + sequence getAllVersions( ); + /** Contains the properties values named after their CMIS ID. */ [attribute] sequence CmisProperties; diff --git a/sfx2/UIConfig_sfx.mk b/sfx2/UIConfig_sfx.mk index ff754473b7be..a2629d20ca31 100644 --- a/sfx2/UIConfig_sfx.mk +++ b/sfx2/UIConfig_sfx.mk @@ -27,6 +27,7 @@ $(eval $(call gb_UIConfig_add_uifiles,sfx,\ sfx2/uiconfig/ui/singletabdialog \ sfx2/uiconfig/ui/versionsofdialog \ sfx2/uiconfig/ui/versioncommentdialog \ + sfx2/uiconfig/ui/versionscmis \ sfx2/uiconfig/ui/startcenter \ sfx2/uiconfig/ui/cmisinfopage \ sfx2/uiconfig/ui/cmisline \ diff --git a/sfx2/source/dialog/versdlg.cxx b/sfx2/source/dialog/versdlg.cxx index abc4644a4b88..c36540cada09 100644 --- a/sfx2/source/dialog/versdlg.cxx +++ b/sfx2/source/dialog/versdlg.cxx @@ -81,7 +81,7 @@ public: { *this = rCpy; } SfxVersionTableDtor( const uno::Sequence < util::RevisionTag >& rInfo ); - + SfxVersionTableDtor( const uno::Sequence < document::CmisVersion > & rInfo ); ~SfxVersionTableDtor() { DelDtor(); } @@ -114,6 +114,23 @@ SfxVersionTableDtor::SfxVersionTableDtor( const uno::Sequence < util::RevisionTa } } +SfxVersionTableDtor::SfxVersionTableDtor( const uno::Sequence < document::CmisVersion >& rInfo ) +{ + for ( sal_Int32 n=0; n<(sal_Int32)rInfo.getLength(); n++ ) + { + SfxVersionInfo* pInfo = new SfxVersionInfo; + pInfo->aName = rInfo[n].Id; + pInfo->aComment = rInfo[n].Comment; + pInfo->aAuthor = rInfo[n].Author; + + Date aDate ( rInfo[n].TimeStamp.Day, rInfo[n].TimeStamp.Month, rInfo[n].TimeStamp.Year ); + Time aTime ( rInfo[n].TimeStamp.Hours, rInfo[n].TimeStamp.Minutes, rInfo[n].TimeStamp.Seconds, rInfo[n].TimeStamp.NanoSeconds ); + + pInfo->aCreationDate = DateTime( aDate, aTime ); + aTableList.push_back( pInfo ); + } +} + void SfxVersionTableDtor::DelDtor() { for ( size_t i = 0, n = aTableList.size(); i < n; ++i ) @@ -218,6 +235,7 @@ SfxVersionDialog::SfxVersionDialog ( SfxViewFrame* pVwFrame, sal_Bool bIsSaveVer get(m_pViewButton, "show"); get(m_pDeleteButton, "delete"); get(m_pCompareButton, "compare"); + get(m_pCmisButton, "cmis"); SvSimpleTableContainer *pContainer = get("versions"); Size aControlSize(260, 114); @@ -234,6 +252,7 @@ SfxVersionDialog::SfxVersionDialog ( SfxViewFrame* pVwFrame, sal_Bool bIsSaveVer m_pCompareButton->SetClickHdl ( aClickLink ); m_pOpenButton->SetClickHdl ( aClickLink ); m_pSaveCheckBox->SetClickHdl ( aClickLink ); + m_pCmisButton->SetClickHdl ( aClickLink ); m_pVersionBox->SetSelectHdl( LINK( this, SfxVersionDialog, SelectHdl_Impl ) ); m_pVersionBox->SetDoubleClickHdl( LINK( this, SfxVersionDialog, DClickHdl_Impl ) ); @@ -329,6 +348,7 @@ void SfxVersionDialog::Init_Impl() m_pViewButton->Disable(); m_pDeleteButton->Disable(); m_pCompareButton->Disable(); + m_pCmisButton->Enable(); SelectHdl_Impl(m_pVersionBox); } @@ -456,6 +476,12 @@ IMPL_LINK( SfxVersionDialog, ButtonHdl_Impl, Button*, pButton ) pViewFrame->GetDispatcher()->Execute( SID_DOCUMENT_COMPARE, SFX_CALLMODE_ASYNCHRON, aSet ); Close(); } + else if (pButton == m_pCmisButton) + { + SfxCmisVersionsDialog* pDlg = new SfxCmisVersionsDialog(pViewFrame, false); + pDlg->Execute(); + delete pDlg; + } return 0L; } @@ -504,4 +530,87 @@ IMPL_LINK(SfxViewVersionDialog_Impl, ButtonHdl, Button*, pButton) return 0L; } +SfxCmisVersionsDialog::SfxCmisVersionsDialog ( SfxViewFrame* pVwFrame, sal_Bool bIsSaveVersionOnClose ) + : SfxModalDialog(NULL, "VersionsCmisDialog", "sfx/ui/versionscmis.ui") + , pViewFrame(pVwFrame) + , m_pTable(NULL) + , m_bIsSaveVersionOnClose(bIsSaveVersionOnClose) +{ + get(m_pSaveButton, "save"); + get(m_pSaveCheckBox, "always"); + get(m_pOpenButton, "open"); + get(m_pViewButton, "show"); + get(m_pDeleteButton, "delete"); + get(m_pCompareButton, "compare"); + + SvSimpleTableContainer *pContainer = get("versions"); + Size aControlSize(260, 114); + aControlSize = pContainer->LogicToPixel(aControlSize, MAP_APPFONT); + pContainer->set_width_request(aControlSize.Width()); + pContainer->set_height_request(aControlSize.Height()); + + m_pVersionBox = new SfxVersionsTabListBox_Impl(*pContainer, WB_TABSTOP); + + m_pVersionBox->GrabFocus(); + m_pVersionBox->SetStyle( m_pVersionBox->GetStyle() | WB_HSCROLL | WB_CLIPCHILDREN ); + m_pVersionBox->SetSelectionMode( SINGLE_SELECTION ); + + long nTabs_Impl[] = { 3, 0, 0, 0 }; + + m_pVersionBox->SvSimpleTable::SetTabs(&nTabs_Impl[0]); + OUString sHeader1(get("datetime")->GetText()); + OUString sHeader2(get("savedby")->GetText()); + OUString sHeader3(get("comments")->GetText()); + OUStringBuffer sHeader; + sHeader.append(sHeader1).append("\t").append(sHeader2) + .append("\t ").append(sHeader3); + m_pVersionBox->InsertHeaderEntry(sHeader.makeStringAndClear()); + + HeaderBar &rBar = m_pVersionBox->GetTheHeaderBar(); + HeaderBarItemBits nBits = rBar.GetItemBits(1) | HIB_FIXEDPOS | HIB_FIXED; + nBits &= ~HIB_CLICKABLE; + rBar.SetItemBits(1, nBits); + rBar.SetItemBits(2, nBits); + rBar.SetItemBits(3, nBits); + + m_pVersionBox->Resize(); + + OUString sText = GetText(); + sText = sText + " " + pViewFrame->GetObjectShell()->GetTitle(); + SetText( sText ); + + LoadVersions(); + + m_pVersionBox->setColSizes(); + +} + +SfxCmisVersionsDialog::~SfxCmisVersionsDialog() +{ + delete m_pTable; + delete m_pVersionBox; +} + +void SfxCmisVersionsDialog::LoadVersions() +{ + SfxObjectShell *pObjShell = pViewFrame->GetObjectShell(); + uno::Sequence < document::CmisVersion > aVersions = pObjShell->GetCmisVersions( ); + delete m_pTable; + m_pTable = new SfxVersionTableDtor( aVersions ); + { + for ( size_t n = 0; n < m_pTable->size(); ++n ) + { + SfxVersionInfo *pInfo = m_pTable->at( n ); + OUString aEntry = formatTime(pInfo->aCreationDate, Application::GetSettings().GetLocaleDataWrapper()); + aEntry += "\t"; + aEntry += pInfo->aAuthor; + aEntry += "\t"; + aEntry += ConvertWhiteSpaces_Impl( pInfo->aComment ); + SvTreeListEntry *pEntry = m_pVersionBox->InsertEntry( aEntry ); + pEntry->SetUserData( pInfo ); + } + } + +} + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sfx2/source/doc/objserv.cxx b/sfx2/source/doc/objserv.cxx index a06d519edf29..fc4076961672 100644 --- a/sfx2/source/doc/objserv.cxx +++ b/sfx2/source/doc/objserv.cxx @@ -405,6 +405,21 @@ void SfxObjectShell::CheckIn( ) } } +uno::Sequence< document::CmisVersion > SfxObjectShell::GetCmisVersions( ) +{ + try + { + uno::Reference< document::XCmisDocument > xCmisDoc( GetModel(), uno::UNO_QUERY_THROW ); + return xCmisDoc->getAllVersions( ); + } + catch ( const uno::RuntimeException& e ) + { + ErrorBox* pErrorBox = new ErrorBox( &GetFrame()->GetWindow(), WB_OK, e.Message ); + pErrorBox->Execute( ); + delete pErrorBox; + } + return uno::Sequence< document::CmisVersion > ( ); +} //-------------------------------------------------------------------- void SfxObjectShell::ExecFile_Impl(SfxRequest &rReq) diff --git a/sfx2/source/doc/sfxbasemodel.cxx b/sfx2/source/doc/sfxbasemodel.cxx index 4224e3ee3ce5..5eae505cec4b 100644 --- a/sfx2/source/doc/sfxbasemodel.cxx +++ b/sfx2/source/doc/sfxbasemodel.cxx @@ -2604,6 +2604,29 @@ void SAL_CALL SfxBaseModel::checkIn( sal_Bool bIsMajor, const OUString& rMessage } } +uno::Sequence< document::CmisVersion > SAL_CALL SfxBaseModel::getAllVersions( ) throw ( RuntimeException ) +{ + uno::Sequence< document::CmisVersion > aVersions; + SfxMedium* pMedium = m_pData->m_pObjectShell->GetMedium(); + if ( pMedium ) + { + try + { + ::ucbhelper::Content aContent( pMedium->GetName(), + Reference(), + comphelper::getProcessComponentContext() ); + + Any aResult = aContent.executeCommand( "getAllVersions", Any( ) ); + aResult >>= aVersions; + } + catch ( const Exception & e ) + { + throw RuntimeException( e.Message, e.Context ); + } + } + return aVersions; +} + sal_Bool SfxBaseModel::getBoolPropertyValue( const OUString& rName ) throw ( RuntimeException ) { sal_Bool bValue = sal_False; diff --git a/sfx2/source/inc/versdlg.hxx b/sfx2/source/inc/versdlg.hxx index bdb30c2c0170..ad96ef073f18 100644 --- a/sfx2/source/inc/versdlg.hxx +++ b/sfx2/source/inc/versdlg.hxx @@ -52,6 +52,7 @@ class SfxVersionDialog : public SfxModalDialog PushButton* m_pViewButton; PushButton* m_pDeleteButton; PushButton* m_pCompareButton; + PushButton* m_pCmisButton; SfxViewFrame* pViewFrame; SfxVersionTableDtor* m_pTable; bool m_bIsSaveVersionOnClose; @@ -84,6 +85,29 @@ public: SfxViewVersionDialog_Impl(Window *pParent, SfxVersionInfo& rInfo, bool bEdit); }; +class SfxCmisVersionsDialog : public SfxModalDialog +{ + PushButton* m_pSaveButton; + CheckBox* m_pSaveCheckBox; + SfxVersionsTabListBox_Impl* m_pVersionBox; + PushButton* m_pOpenButton; + PushButton* m_pViewButton; + PushButton* m_pDeleteButton; + PushButton* m_pCompareButton; + SfxViewFrame* pViewFrame; + SfxVersionTableDtor* m_pTable; + bool m_bIsSaveVersionOnClose; + + DECL_LINK(DClickHdl_Impl, void *); + DECL_LINK(SelectHdl_Impl, void *); + DECL_LINK( ButtonHdl_Impl, Button* ); + void LoadVersions(); + +public: + SfxCmisVersionsDialog ( SfxViewFrame* pFrame, sal_Bool ); + virtual ~SfxCmisVersionsDialog (); +}; + #endif /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sfx2/uiconfig/ui/versionscmis.ui b/sfx2/uiconfig/ui/versionscmis.ui new file mode 100644 index 000000000000..f5b75ac143c3 --- /dev/null +++ b/sfx2/uiconfig/ui/versionscmis.ui @@ -0,0 +1,340 @@ + + + + + + False + 6 + dialog + + + False + 12 + + + False + vertical + start + + + gtk-close + False + True + True + True + False + True + + + False + True + 0 + + + + + gtk-open + False + True + True + True + False + True + + + False + True + 1 + + + + + _Show... + False + True + True + True + False + True + + + False + True + 2 + + + + + gtk-delete + False + True + True + True + False + True + True + + + False + True + 3 + + + + + _Compare + False + True + True + True + False + True + + + False + True + 4 + + + + + + + + gtk-help + False + True + True + True + False + True + + + False + True + 6 + True + + + + + False + True + end + 0 + + + + + True + False + True + True + 12 + + + True + False + True + 0 + none + + + True + False + 6 + 12 + + + True + False + 12 + + + Save _New Version + False + True + True + True + False + True + + + 0 + 0 + 1 + 1 + + + + + _Always save a new version on closing + False + True + True + False + False + True + 0 + True + + + 1 + 0 + 1 + 1 + + + + + + + + + True + False + New versions + + + + + + + + 0 + 0 + 1 + 1 + + + + + True + False + True + True + 0 + none + + + True + False + True + True + 6 + 12 + + + True + False + True + True + + + True + False + True + 12 + True + + + False + True + Date and time + + + False + True + 0 + + + + + False + True + Saved by + + + False + True + 1 + + + + + False + True + Comments + + + False + True + 2 + + + + + 0 + 0 + 1 + 1 + + + + + True + False + True + True + + + + + + 0 + 1 + 1 + 1 + + + + + + + + + True + False + Existing versions + + + + + + + + 0 + 1 + 1 + 1 + + + + + False + True + 1 + + + + + + close + open + show + delete + compare + help + + + diff --git a/sfx2/uiconfig/ui/versionsofdialog.ui b/sfx2/uiconfig/ui/versionsofdialog.ui index 00d197f374af..45d62761f54e 100644 --- a/sfx2/uiconfig/ui/versionsofdialog.ui +++ b/sfx2/uiconfig/ui/versionsofdialog.ui @@ -86,6 +86,20 @@ 4 + + + CMIS + True + True + True + + + False + True + 5 + + + gtk-help @@ -97,7 +111,7 @@ False True - 5 + 6 True diff --git a/ucb/source/ucp/cmis/cmis_content.cxx b/ucb/source/ucp/cmis/cmis_content.cxx index 43f8c35afc04..4bc7c3c6fc7c 100644 --- a/ucb/source/ucp/cmis/cmis_content.cxx +++ b/ucb/source/ucp/cmis/cmis_content.cxx @@ -1054,6 +1054,46 @@ namespace cmis return aRet; } + uno::Sequence< document::CmisVersion> Content::getAllVersions( const uno::Reference< ucb::XCommandEnvironment > & xEnv ) + throw( uno::Exception ) + { + try + { + // get the document + libcmis::DocumentPtr pDoc = boost::dynamic_pointer_cast< libcmis::Document >( getObject( xEnv ) ); + if ( pDoc.get( ) == NULL ) + { + ucbhelper::cancelCommandExecution( + ucb::IOErrorCode_GENERAL, + uno::Sequence< uno::Any >( 0 ), + xEnv, + "Can not get the document" ); + } + vector< libcmis::DocumentPtr > aCmisVersions = pDoc->getAllVersions( ); + uno::Sequence< document::CmisVersion > aVersions( aCmisVersions.size( ) ); + int i = 0; + for ( vector< libcmis::DocumentPtr >::iterator it = aCmisVersions.begin(); + it != aCmisVersions.end( ); ++it, ++i ) + { + libcmis::DocumentPtr pVersion = *it; + aVersions[i].Id = STD_TO_OUSTR( pVersion->getId( ) ); + aVersions[i].Author = STD_TO_OUSTR( pVersion->getCreatedBy( ) ); + aVersions[i].TimeStamp = lcl_boostToUnoTime( pVersion->getCreationDate( ) ); + } + return aVersions; + } + catch ( const libcmis::Exception& e ) + { + SAL_INFO( "ucb.ucp.cmis", "Unexpected libcmis exception: " << e.what( ) ); + ucbhelper::cancelCommandExecution( + ucb::IOErrorCode_GENERAL, + uno::Sequence< uno::Any >( 0 ), + xEnv, + OUString::createFromAscii( e.what() ) ); + } + return uno::Sequence< document::CmisVersion > ( ); + } + void Content::transfer( const ucb::TransferInfo& rTransferInfo, const uno::Reference< ucb::XCommandEnvironment > & xEnv ) throw( uno::Exception ) @@ -1472,6 +1512,9 @@ namespace cmis ucb::CommandInfo ( OUString( "checkIn" ), -1, getCppuType( static_cast( 0 ) ) ), ucb::CommandInfo ( OUString( "updateProperties" ), -1, getCppuVoidType() ), + ucb::CommandInfo + ( OUString( "getAllVersions" ), + -1, getCppuType( static_cast * >( 0 ) ) ), // Folder Only, omitted if not a folder @@ -1645,6 +1688,10 @@ namespace cmis } aRet <<= checkIn( aArg, xEnv ); } + else if ( aCommand.Name == "getAllVersions" ) + { + aRet <<= getAllVersions( xEnv ); + } else if ( aCommand.Name == "updateProperties" ) { updateProperties( aCommand.Argument, xEnv ); diff --git a/ucb/source/ucp/cmis/cmis_content.hxx b/ucb/source/ucp/cmis/cmis_content.hxx index a3dd3beac80e..d34c03b7cb5b 100644 --- a/ucb/source/ucp/cmis/cmis_content.hxx +++ b/ucb/source/ucp/cmis/cmis_content.hxx @@ -20,6 +20,7 @@ #include #include #include +#include #include #include @@ -118,6 +119,10 @@ private: const com::sun::star::uno::Reference< com::sun::star::ucb::XCommandEnvironment >& xEnv ); + com::sun::star::uno::Sequence< com::sun::star::document::CmisVersion > + getAllVersions( const com::sun::star::uno::Reference< com::sun::star::ucb::XCommandEnvironment > & xEnv ) + throw( com::sun::star::uno::Exception ); + sal_Bool feedSink( com::sun::star::uno::Reference< com::sun::star::uno::XInterface> aSink, const com::sun::star::uno::Reference< com::sun::star::ucb::XCommandEnvironment >& xEnv ); -- cgit v1.2.3